clear.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. uses Graph;
  2. CONST
  3. Num = 10;
  4. MinX = 100;
  5. MinY = 100;
  6. MaxX = 540;
  7. MaxY = 380;
  8. {---------------------------------------------------------------}
  9. type
  10. PList = ^TList;
  11. TList = record
  12. val : real;
  13. x,y : longint;
  14. prev: PList;
  15. end;
  16. {---------------------------------------------------------------}
  17. var
  18. i,cx,cy : LongInt;
  19. List,NNN,Tmp : Plist;
  20. {------------------------------------------------------------}
  21. Function Angle(x,y:word):real;
  22. var
  23. x1,y1:longint;
  24. ret:real;
  25. begin
  26. x1 := x-cx;
  27. y1 := y-cy;
  28. if x1=0 then
  29. begin
  30. Angle:=(PI/2) - PI * (y1/abs(y1)-1)/2;
  31. Exit;
  32. end;
  33. ret:=arctan(y1/x1);
  34. if (x1>0) and (y1<0) then ret:=ret+2*Pi;
  35. if ((x1<0) and (y1>0)) or ((x1<0) and (y1<0)) then ret:=ret+Pi;
  36. Angle:=ret;
  37. end;
  38. {==============================================================}
  39. Procedure Sort(var List:plist);
  40. var
  41. ret,t1,t2,t3:plist;
  42. min:plist;
  43. begin
  44. ret:=nil;
  45. t1:=List;
  46. while t1<>nil do begin t1^.val:=Angle(t1^.x,t1^.y); t1:=t1^.prev end;
  47. t1:=List;
  48. repeat
  49. t2:=t1;
  50. min:=t1;
  51. while t2^.prev<>nil do
  52. begin
  53. if t2^.prev^.val<min^.prev^.val then min := t2;
  54. t2:=t2^.prev;
  55. end;
  56. if min^.prev^.val > t1^.val then
  57. begin
  58. New(t3);
  59. t3^.val := t1^.val;
  60. t3^.x := t1^.x;
  61. t3^.y := t1^.y;
  62. t3^.prev:=ret;
  63. ret:=t3;
  64. t2:=t1;
  65. t1:=t1^.prev;
  66. DisPose(t2);
  67. end
  68. else
  69. begin
  70. New(t3);
  71. t3^.val := min^.prev^.val;
  72. t3^.x := min^.prev^.x;
  73. t3^.y := min^.prev^.y;
  74. t3^.prev:=ret;
  75. ret:=t3;
  76. t2:=min^.prev;
  77. min^.prev := t2^.prev;
  78. DisPose(t2);
  79. end;
  80. until t1^.prev=nil;
  81. t1^.prev:=ret;
  82. List:=t1;
  83. end;
  84. {-------------------------------------------------}
  85. var
  86. deleted,ay,ay1,ay2,ax,ax1,ax2,aa,ab,ac : longint;
  87. GGG : string;
  88. pr1 : plist;
  89. begin
  90. randomize;
  91. List:=nil;
  92. cx:=0;
  93. cy:=0;
  94. for i := 1 to Num do
  95. begin
  96. New(NNN);
  97. NNN^.x:=random(MaxX-minX)+minX;
  98. NNN^.y:=random(MaxY-minY)+minY;
  99. inc(cx,NNN^.x);inc(cy,NNN^.y);
  100. NNN^.prev := List;
  101. List:=NNN
  102. end;
  103. cx := cx div Num;
  104. cy := cy div Num;
  105. Sort(List);
  106. NNN:=List;
  107. ax1:=1;
  108. nnn^.prev:=List;
  109. repeat
  110. NNN:=List;
  111. pr1:=List;
  112. deleted:=0;
  113. repeat
  114. ax:=NNN^.prev^.prev^.x;ax1:=NNN^.x;ax2:=NNN^.prev^.x;
  115. ay:=NNN^.prev^.prev^.y;ay1:=NNN^.y;ay2:=NNN^.prev^.y;
  116. aa:=ay2-ay1;
  117. ab:=ax1-ax2;
  118. ac:=ay1*(ax2-ax1)-ax1*(ay2-ay1);
  119. if ( (aa*ax+ab*ay+ac) *
  120. (aa*cx+ab*cy+ac) ) < 0 then
  121. begin
  122. inc(deleted);
  123. tmp:=NNN^.prev;
  124. if (List=tmp) then List := NNN;
  125. NNN^.prev := tmp^.prev;
  126. dispose(tmp);
  127. NNN:=pr1;
  128. end;
  129. Pr1:=NNN;
  130. NNN:=NNN^.Prev;
  131. until NNN=List;
  132. until deleted=0;
  133. {-------------------------------------------------------}
  134. NNN:=list^.prev;
  135. while (NNN<>List) do
  136. begin
  137. Tmp:=NNN;
  138. NNN:=NNN^.prev;
  139. Dispose(Tmp);
  140. end;
  141. Dispose(NNN);
  142. end.