bounds.pas 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. uses Graph;
  2. CONST
  3. Num = 10;
  4. MinX = 100;
  5. MinY = 100;
  6. MaxX = 540;
  7. MaxY = 380;
  8. {---------------------------------------------------------------}
  9. Procedure Delay(aMS:word);assembler;
  10. asm
  11. xor dx, dx
  12. mov ax, aMS
  13. mov bx, 1000
  14. mul bx
  15. mov cx, dx
  16. mov dx, ax
  17. mov ah, 86h
  18. int 15h
  19. end;
  20. type
  21. PList = ^TList;
  22. TList = record
  23. val : real;
  24. x,y : longint;
  25. prev: PList;
  26. end;
  27. {---------------------------------------------------------------}
  28. var
  29. grDriver : Integer;
  30. grMode : Integer;
  31. ErrCode : Integer;
  32. i,cx,cy : LongInt;
  33. List,NNN,Tmp : Plist;
  34. {------------------------------------------------------------}
  35. Function Angle(x,y:word):real;
  36. var
  37. x1,y1:longint;
  38. ret:real;
  39. begin
  40. x1 := x-cx;
  41. y1 := y-cy;
  42. if x1=0 then
  43. begin
  44. Angle:=(PI/2) - PI * (y1/abs(y1)-1)/2;
  45. Exit;
  46. end;
  47. ret:=arctan(y1/x1);
  48. if (x1>0) and (y1<0) then ret:=ret+2*Pi;
  49. if ((x1<0) and (y1>0)) or ((x1<0) and (y1<0)) then ret:=ret+Pi;
  50. Angle:=ret;
  51. end;
  52. {==============================================================}
  53. Procedure Sort(var List:plist);
  54. var
  55. ret,t1,t2,t3:plist;
  56. min:plist;
  57. begin
  58. ret:=nil;
  59. t1:=List;
  60. while t1<>nil do begin t1^.val:=Angle(t1^.x,t1^.y); t1:=t1^.prev end;
  61. t1:=List;
  62. repeat
  63. t2:=t1;
  64. min:=t1;
  65. while t2^.prev<>nil do
  66. begin
  67. if t2^.prev^.val<min^.prev^.val then min := t2;
  68. t2:=t2^.prev;
  69. end;
  70. if min^.prev^.val > t1^.val then
  71. begin
  72. New(t3);
  73. t3^.val := t1^.val;
  74. t3^.x := t1^.x;
  75. t3^.y := t1^.y;
  76. t3^.prev:=ret;
  77. ret:=t3;
  78. t2:=t1;
  79. t1:=t1^.prev;
  80. DisPose(t2);
  81. end
  82. else
  83. begin
  84. New(t3);
  85. t3^.val := min^.prev^.val;
  86. t3^.x := min^.prev^.x;
  87. t3^.y := min^.prev^.y;
  88. t3^.prev:=ret;
  89. ret:=t3;
  90. t2:=min^.prev;
  91. min^.prev := t2^.prev;
  92. DisPose(t2);
  93. end;
  94. until t1^.prev=nil;
  95. t1^.prev:=ret;
  96. List:=t1;
  97. end;
  98. {-------------------------------------------------}
  99. var
  100. deleted,ay,ay1,ay2,ax,ax1,ax2,aa,ab,ac : longint;
  101. GGG : string;
  102. pr1 : plist;
  103. begin
  104. grDriver := Detect;
  105. InitGraph(grDriver, grMode,' ');
  106. ErrCode := GraphResult;
  107. if ErrCode = grOk then
  108. begin { Do graphics }
  109. randomize;
  110. List:=nil;
  111. cx:=0;
  112. cy:=0;
  113. for i := 1 to Num do
  114. begin
  115. New(NNN);
  116. NNN^.x:=random(MaxX-minX)+minX;
  117. NNN^.y:=random(MaxY-minY)+minY;
  118. inc(cx,NNN^.x);inc(cy,NNN^.y);
  119. FillEllipse(NNN^.x,NNN^.y,2,2);
  120. NNN^.prev := List;
  121. List:=NNN
  122. end;
  123. cx := cx div Num;
  124. cy := cy div Num;
  125. SetFillStyle(SOLIDFILL,Magenta);
  126. FillEllipse(cx,cy,3,3);
  127. Sort(List);
  128. NNN:=List;
  129. SetWriteMode(XORPut);
  130. ax1:=1;
  131. while (NNN^.prev<>nil) do
  132. begin
  133. SetColor(Green);
  134. Str(ax1,GGG);
  135. OutTextXY(NNN^.x,NNN^.y+5,GGG);
  136. SetColor(Blue);
  137. Line(cx,cy,NNN^.x,NNN^.y);
  138. Delay(300);
  139. Line(cx,cy,NNN^.x,NNN^.y);
  140. Inc(ax1);
  141. NNN:=nnn^.prev;
  142. end;
  143. nnn^.prev:=List;
  144. SetColor(Green);
  145. Str(ax1,GGG);
  146. OutTextXY(NNN^.x,NNN^.y+5,GGG);
  147. SetColor(Blue);
  148. Line(cx,cy,NNN^.x,NNN^.y);
  149. Delay(300);
  150. Line(cx,cy,NNN^.x,NNN^.y);
  151. repeat
  152. NNN:=List;
  153. pr1:=List;
  154. deleted:=0;
  155. repeat
  156. ax:=NNN^.prev^.prev^.x;ax1:=NNN^.x;ax2:=NNN^.prev^.x;
  157. ay:=NNN^.prev^.prev^.y;ay1:=NNN^.y;ay2:=NNN^.prev^.y;
  158. aa:=ay2-ay1;
  159. ab:=ax1-ax2;
  160. ac:=ay1*(ax2-ax1)-ax1*(ay2-ay1);
  161. SetColor(Blue);
  162. Line(ax1,ay1,ax2,ay2);
  163. SetColor(Red);
  164. Line(cx,cy,ax,ay);
  165. if ( (aa*ax+ab*ay+ac) *
  166. (aa*cx+ab*cy+ac) ) < 0 then
  167. begin
  168. inc(deleted);
  169. tmp:=NNN^.prev;
  170. SetColor(Green);
  171. Line(ax2-3,ay2-3,ax2+3,ay2+3);
  172. Line(ax2-3,ay2+3,ax2+3,ay2-3);
  173. if (List=tmp) then List := NNN;
  174. NNN^.prev := tmp^.prev;
  175. dispose(tmp);
  176. NNN:=pr1;
  177. end;
  178. Delay(500);
  179. SetColor(Blue);
  180. Line(ax1,ay1,ax2,ay2);
  181. SetColor(Red);
  182. Line(cx,cy,ax,ay);
  183. Pr1:=NNN;
  184. NNN:=NNN^.Prev;
  185. until NNN=List;
  186. until deleted=0;
  187. {-------------------------------------------------------}
  188. SetColor(Yellow);
  189. MoveTo(List^.x,List^.y);
  190. NNN:=list^.prev;
  191. while (NNN<>List) do
  192. begin
  193. LineTo(NNN^.x,NNN^.y);
  194. Tmp:=NNN;
  195. NNN:=NNN^.prev;
  196. Dispose(Tmp);
  197. end;
  198. LineTo(NNN^.x,NNN^.y);
  199. Dispose(NNN);
  200. Readln;
  201. CloseGraph;
  202. end
  203. else
  204. Writeln('Graphics error:', GraphErrorMsg(ErrCode));
  205. end.