lines.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. uses graph;
  2. var
  3. X : array [1..5000] of integer;
  4. Y : array [1..5000] of integer;
  5. N : integer;
  6. Function Intercept(X11,Y11,X21,Y21,X12,Y12,X22,Y22:integer) : boolean;
  7. var
  8. k1,k2,b1,b2,xx: real;
  9. begin
  10. if (X11<>X21) and (X12<>X22) then
  11. begin
  12. xx:=Y11-Y21;
  13. k1:=(X11-X21);
  14. k1:=xx/k1;
  15. xx:=(Y12-Y22);
  16. k2:=(X12-X22);
  17. k2:=xx/k2;
  18. b1:=y11-k1*x11;
  19. b2:=y12-k2*x12;
  20. if (k1=k2) then
  21. begin
  22. if y12<>k1*x12+b1 then
  23. begin
  24. Intercept := false;
  25. exit
  26. end;
  27. Intercept := true;
  28. exit
  29. end;
  30. xx:=(b2-b1)/(k1-k2);
  31. if (xx>=X11)and (XX<=X21) then
  32. begin
  33. Intercept := true;
  34. exit
  35. end;
  36. end;
  37. if (X11=X21) and (X12<>X22) then
  38. begin
  39. xx:=(Y12-Y22);
  40. k2:=(X12-X22);
  41. k2:=xx/k2;
  42. b2:=y12-k2*x12;
  43. xx:=k2*x11+b2;
  44. if ((X11>X12) and(X11<X22)) and ((xx>Y11) and (xx<Y21)) then
  45. begin
  46. Intercept := true;
  47. exit
  48. end;
  49. Intercept:=false;
  50. exit
  51. end;
  52. if (X12=X22) and (X11<>X21) then
  53. begin
  54. xx:=Y11-Y21;
  55. k1:=(X11-X21);
  56. k1:=xx/k1;
  57. b1:=y11-k1*x11;
  58. xx:=k1*x12+b1;
  59. if ((X12>X11)and(X12<X21)) and ((xx>Y12)and(xx<Y22)) then
  60. begin
  61. Intercept := true;
  62. exit
  63. end;
  64. Intercept:=false;
  65. exit
  66. end;
  67. if (((y11>=y12)and(Y11<=y22)) or ((y12>=y12)and(y12<=y22))) and (x11=x22) then
  68. begin
  69. Intercept := true;
  70. exit
  71. end;
  72. Intercept:=false;
  73. end;{Intercept}
  74. {----------------------------------------------}
  75. Procedure ReadFn;
  76. var
  77. X1:integer;
  78. i:word;
  79. F:TEXT;
  80. begin
  81. Assign(F,'input.txt');
  82. Reset(F);
  83. Read(F,N);
  84. for i := 1 to n do
  85. begin
  86. REad(F,X1);
  87. X[2*i-1] := X1;
  88. REad(F,X1);
  89. Y[2*i-1] := X1;
  90. REad(F,X1);
  91. X[2*i] := X1;
  92. REad(F,X1);
  93. Y[2*i] := X1;
  94. end;
  95. end; {ReadFn}
  96. {--------------------}
  97. Procedure Init;
  98. var
  99. grDriver: Integer;
  100. grMode: Integer;
  101. ErrCode: Integer;
  102. begin
  103. grDriver := Detect;
  104. InitGraph(grDriver, grMode,' ');
  105. ErrCode := GraphResult;
  106. if ErrCode <> grOk then
  107. begin
  108. Writeln('Graphics error:', GraphErrorMsg(ErrCode));
  109. Halt(3);
  110. end
  111. end; {Init}
  112. {------------------------}
  113. var
  114. i,j,k:word;
  115. m1,m2,max,cur : integer;
  116. begin
  117. ReadFn;
  118. max:=0;
  119. for i := 1 to N*2 do
  120. begin
  121. for j:= 1 to N*2 do
  122. begin
  123. cur:=0;
  124. for k:=1 to N do
  125. begin
  126. if (i<>j) and (i<>(2*k-1)) and (j<>(2*k-1)) and (i<>(2*k)) and (j<>(2*k)) then
  127. if (intercept(x[i],y[i],x[j],y[j],x[2*k-1],y[2*k-1],x[2*k],y[2*k]))
  128. then inc(cur);
  129. end;
  130. if (Cur>max) then
  131. begin
  132. max:=cur;
  133. m1:=i;
  134. m2:=j;
  135. end;
  136. end;
  137. end;
  138. Init;
  139. SetColor(BLUE);
  140. for i:=1 to N do
  141. begin
  142. Line(X[i*2-1],Y[i*2-1],X[i*2],Y[i*2]);
  143. FillEllipse(X[i*2-1],Y[i*2-1],5,5);
  144. SetColor(I mod 16);
  145. FillEllipse(X[i*2],Y[i*2],5,5);
  146. end;
  147. asm
  148. mov ah, 08h
  149. int 21h
  150. end;
  151. SetColor(Green);
  152. Line(X[m1],Y[m1],X[m2],Y[m2]);
  153. asm
  154. mov ah, 08h
  155. int 21h
  156. end;
  157. end.