Guest User

Untitled

a guest
Oct 24th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.04 KB | None | 0 0
  1. Program lab1;
  2. Uses GraphABC,Utils;
  3. Const
  4. K=5; //классы
  5. N=5000; //точки
  6. M=2; //размерность массива
  7. R=10; //радиус центров
  8. Var
  9. Point: array [1..N,1..M] of integer;
  10. Center: array [1..K,1..M] of integer;
  11. Dist: array [1..N,1..K]of real;
  12. Klass: array [1..N]of integer;
  13. min:real;
  14. Fl:boolean;
  15.  
  16. Function Distance(x1,x2,y1,y2:integer):real;
  17. Begin
  18. Distance:=SQRT(SQR(x2-x1)+SQR(y2-y1));
  19. End;
  20.  
  21. Function CentrMass(var index:integer): boolean;
  22. var
  23. i,kolvo,ind,res,tmp,minindex:integer;
  24. xC,yC:real;
  25. Begin
  26. xC:=0; yC:=0; kolvo:=0;
  27. //функция CentrMass сначала по формуле считает центр масс данного класса
  28. //функция CentrMass xC=(x1+x2+..+xm)/m; yC=..
  29. for i:=K+1 to N do
  30. begin
  31. if ( Klass[i]= index ) then
  32. begin
  33. xC:=xC+Point[i,1];
  34. yC:=yC+Point[i,2];
  35. kolvo:=kolvo+1;
  36. end;
  37. end;
  38. xC:=xC/kolvo; yC:=yC/kolvo; // ПРИВЕДЕНИЕ К ТИПУ!!
  39.  
  40. //функция CentrMass далее в цикле считает расстояния от каждой точки данного класса i до найденного цетра масс, значение записывается в массив masRast
  41. //функция CentrMass - проверяется совпадение M[j].cvet==M[i].cvet - принадлежность тому или иному классу
  42. for i:=1 to N do
  43. begin
  44. Dist[i,index]:=0.0;
  45. end;
  46. ind:=1;
  47.  
  48. for i:=K+1 to N do
  49. begin
  50. if ( Klass[i]= index) then
  51. begin
  52. Dist[ind,index]:=Distance(Point[i,1], Point[i,2], round(xC), round(yC)); // функция Rast находит расстояние между очередной точкой M[i] и вершиной M[j]
  53. ind:=ind+1;
  54. end;
  55. end;
  56. //функция CentrMass находим индекс эл-та с наименьшим расстоянием функцией minRast
  57. //функция CentrMass если этот индекс <> i, то FL устанавливается в 1, эл-ты массива M[i] и M[индекс] меняются местами
  58. min:=Dist[K+1,index];
  59. minindex:=1;
  60. for i:=K+2 to ind do
  61. begin
  62. if (min > Dist[i,index]) then //поиск минимального расстояния и индекса
  63. Begin
  64. min:=Dist[i,index];
  65. minindex:=klass[i];
  66. end;
  67. end;
  68.  
  69. res:=minindex;
  70. if (res<>index) then
  71. begin
  72. tmp:=Center[index,1];
  73. Center[index,1]:=Point[i,1];
  74. Point[i,1]:=tmp;
  75. tmp:=Center[index,2];
  76. Center[index,2]:=Point[i,2];
  77. Point[i,2]:=tmp;
  78.  
  79. CentrMass:=true;
  80. end
  81. else
  82. CentrMass:=false;
  83. End;
  84.  
  85. Procedure draw();
  86. Begin
  87. for var i:=K+1 to N do
  88. for var j:=1 to K do
  89. Dist[i,j]:=Distance(Point[i,1],center[j,1],Point[i,2],center[j,2]); //расстояние до центров в массив
  90.  
  91. for var i:=K+1 to N do
  92. begin
  93. min:=Dist[i,1];
  94. Klass[i]:=1;
  95. for var j:=2 to K do
  96. begin
  97. if (min > Dist[i,j]) then //поиск минимального расстояния и номер центра
  98. Begin
  99. min:=Dist[i,j];
  100. Klass[i]:=j;
  101. end;
  102. end;
  103. end;
  104.  
  105. for var i:=K+1 to N do
  106. case Klass[i] of
  107. 1: SetPixel(Point[i,1],Point[i,2],clred);
  108. 2: SetPixel(Point[i,1],Point[i,2],clblue);
  109. 3: SetPixel(Point[i,1],Point[i,2],clgreen);
  110. 4: SetPixel(Point[i,1],Point[i,2],clmagenta);
  111. 5: SetPixel(Point[i,1],Point[i,2],clyellow);
  112. end;
  113. end;
  114. Begin
  115. Window.Title := 'Метод К средних';
  116. Brush.Color := Color.Black;
  117. Fillrectangle(0,0,640,480);
  118. Fl:=true;
  119.  
  120. for var i:=1 to N do
  121. Begin
  122. Point[i,1] := Random(640);
  123. Point[i,2] := Random(480);
  124. end;
  125.  
  126. for var i:=1 to N do
  127. SetPixel(Point[i,1],Point[i,2],clwhite); //закраска
  128.  
  129. for var i:=1 to K do
  130. begin
  131. Center[i,1]:=Point[i,1];
  132. Center[i,2]:=Point[i,2]; //выбор центров
  133. end;
  134.  
  135. SetPixel(Center[1,1],Center[1,2],clred);
  136. SetPixel(Center[2,1],Center[2,2],clblue);
  137. SetPixel(Center[3,1],Center[3,2],clgreen);
  138. SetPixel(Center[4,1],Center[4,2],clmagenta);
  139. SetPixel(Center[5,1],Center[5,2],clyellow);
  140.  
  141. while fl do
  142. begin
  143. fl:=false;
  144. Draw;
  145. for var i:=1 to K do
  146. begin
  147. setpencolor(clwhite);
  148. Circle(Center[i,1],Center[i,2],R);
  149. end;
  150. sleep(2000);
  151. Brush.Color := Color.Black;
  152. Fillrectangle(0,0,640,480);
  153. for var i:=1 to K do
  154. FL:=CentrMass(i);
  155. end;
  156.  
  157. Draw;
  158.  
  159. for var i:=1 to K do
  160. begin
  161. setpencolor(clblue);
  162. Circle(Center[i,1],Center[i,2],R);
  163. end;
  164.  
  165. writeln('Время работы: ',Milliseconds/1000,' секунд');
  166. End.
Add Comment
Please, Sign In to add comment