Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program lab1;
- Uses GraphABC,Utils;
- Const
- K=5; //классы
- N=5000; //точки
- M=2; //размерность массива
- R=10; //радиус центров
- Var
- Point: array [1..N,1..M] of integer;
- Center: array [1..K,1..M] of integer;
- Dist: array [1..N,1..K]of real;
- Klass: array [1..N]of integer;
- min:real;
- Fl:boolean;
- Function Distance(x1,x2,y1,y2:integer):real;
- Begin
- Distance:=SQRT(SQR(x2-x1)+SQR(y2-y1));
- End;
- Function CentrMass(var index:integer): boolean;
- var
- i,kolvo,ind,res,tmp,minindex:integer;
- xC,yC:real;
- Begin
- xC:=0; yC:=0; kolvo:=0;
- //функция CentrMass сначала по формуле считает центр масс данного класса
- //функция CentrMass xC=(x1+x2+..+xm)/m; yC=..
- for i:=K+1 to N do
- begin
- if ( Klass[i]= index ) then
- begin
- xC:=xC+Point[i,1];
- yC:=yC+Point[i,2];
- kolvo:=kolvo+1;
- end;
- end;
- xC:=xC/kolvo; yC:=yC/kolvo; // ПРИВЕДЕНИЕ К ТИПУ!!
- //функция CentrMass далее в цикле считает расстояния от каждой точки данного класса i до найденного цетра масс, значение записывается в массив masRast
- //функция CentrMass - проверяется совпадение M[j].cvet==M[i].cvet - принадлежность тому или иному классу
- for i:=1 to N do
- begin
- Dist[i,index]:=0.0;
- end;
- ind:=1;
- for i:=K+1 to N do
- begin
- if ( Klass[i]= index) then
- begin
- Dist[ind,index]:=Distance(Point[i,1], Point[i,2], round(xC), round(yC)); // функция Rast находит расстояние между очередной точкой M[i] и вершиной M[j]
- ind:=ind+1;
- end;
- end;
- //функция CentrMass находим индекс эл-та с наименьшим расстоянием функцией minRast
- //функция CentrMass если этот индекс <> i, то FL устанавливается в 1, эл-ты массива M[i] и M[индекс] меняются местами
- min:=Dist[K+1,index];
- minindex:=1;
- for i:=K+2 to ind do
- begin
- if (min > Dist[i,index]) then //поиск минимального расстояния и индекса
- Begin
- min:=Dist[i,index];
- minindex:=klass[i];
- end;
- end;
- res:=minindex;
- if (res<>index) then
- begin
- tmp:=Center[index,1];
- Center[index,1]:=Point[i,1];
- Point[i,1]:=tmp;
- tmp:=Center[index,2];
- Center[index,2]:=Point[i,2];
- Point[i,2]:=tmp;
- CentrMass:=true;
- end
- else
- CentrMass:=false;
- End;
- Procedure draw();
- Begin
- for var i:=K+1 to N do
- for var j:=1 to K do
- Dist[i,j]:=Distance(Point[i,1],center[j,1],Point[i,2],center[j,2]); //расстояние до центров в массив
- for var i:=K+1 to N do
- begin
- min:=Dist[i,1];
- Klass[i]:=1;
- for var j:=2 to K do
- begin
- if (min > Dist[i,j]) then //поиск минимального расстояния и номер центра
- Begin
- min:=Dist[i,j];
- Klass[i]:=j;
- end;
- end;
- end;
- for var i:=K+1 to N do
- case Klass[i] of
- 1: SetPixel(Point[i,1],Point[i,2],clred);
- 2: SetPixel(Point[i,1],Point[i,2],clblue);
- 3: SetPixel(Point[i,1],Point[i,2],clgreen);
- 4: SetPixel(Point[i,1],Point[i,2],clmagenta);
- 5: SetPixel(Point[i,1],Point[i,2],clyellow);
- end;
- end;
- Begin
- Window.Title := 'Метод К средних';
- Brush.Color := Color.Black;
- Fillrectangle(0,0,640,480);
- Fl:=true;
- for var i:=1 to N do
- Begin
- Point[i,1] := Random(640);
- Point[i,2] := Random(480);
- end;
- for var i:=1 to N do
- SetPixel(Point[i,1],Point[i,2],clwhite); //закраска
- for var i:=1 to K do
- begin
- Center[i,1]:=Point[i,1];
- Center[i,2]:=Point[i,2]; //выбор центров
- end;
- SetPixel(Center[1,1],Center[1,2],clred);
- SetPixel(Center[2,1],Center[2,2],clblue);
- SetPixel(Center[3,1],Center[3,2],clgreen);
- SetPixel(Center[4,1],Center[4,2],clmagenta);
- SetPixel(Center[5,1],Center[5,2],clyellow);
- while fl do
- begin
- fl:=false;
- Draw;
- for var i:=1 to K do
- begin
- setpencolor(clwhite);
- Circle(Center[i,1],Center[i,2],R);
- end;
- sleep(2000);
- Brush.Color := Color.Black;
- Fillrectangle(0,0,640,480);
- for var i:=1 to K do
- FL:=CentrMass(i);
- end;
- Draw;
- for var i:=1 to K do
- begin
- setpencolor(clblue);
- Circle(Center[i,1],Center[i,2],R);
- end;
- writeln('Время работы: ',Milliseconds/1000,' секунд');
- End.
Add Comment
Please, Sign In to add comment