Построение кластера методом «Муравья»
Метод «муравья» в построении кластера заключается в том, что в центр экрана ставится неподвижная «точка», а затем с разных сторон экрана вылетают «точки», которые двигаются хаотично, но по определенным правилам:
1. Движение» точки» происходит только вверх, вниз, влево и вправо на одну единицу.
2. При соприкосновении с любой «точкой», рассматриваемая точка завершает движение и останавливается в том месте, где произошло соприкосновение.
При этом я оставил случай того, что из-за экрана могут вылететь сразу несколько «точек», то есть, следующая «точка» не начнет движение, пока рассматриваемая его не закончит.
Для того чтобы построение кластера происходило быстрее я ввел мнимые грани, которые расширяются по мере увеличения количества «прилипших точек».
Программа реализована на языке Pascal ABC 3.0, на Borland Pascal нужно будет заменить некоторые команды, а именно:
1. Заменить вызов процедуры GraphAbc на соответствующую процедуру в Borland Pascal — Graph, при этом не забыть добавить команды InitGraph () и CloseGraph;
2. Убрать команды изменения экрана: SetWindowHeght, SetWindowWidth;
3. Заменить команды работы с графикой, таких как clwhite и clblack на соответствующие в BP.
Листинг программы:
{Построение кластера методом «Муравья»
Рогов Александр 12.12.2008
Описание переменных:
pole — массив, равный числу точек на экране; отвечает за расположение точки на экране
в той клетке массива, где расположена 1, на соответствующем месте экрана выводится точка,
ее координаты совпадают с расположением в массиве 1.
i,j,k — используются для организации циклов
xp, yp — текущие координаты точки x,y
flag — вспомогательный «флаг»
xcenter, ycenter — используются для заполнения массива pole
granx1, granx2 — соответственно верхняя и нижняя грани мнимой границы
grany1, grany2 — соответственно левая и правая грани мнимой границы
m — изначальное количество точек
nu — вспомогательная переменная
Константы:
cln — цвет точки «белый», для стирания ее на экране
clr — цвет точки «черный», для отображения ее на экране
}
program muravei;
uses crt,graphabc;
var pole:array [0..641,0..481] of integer;
i,j,k,xp,yp,flag,xcenter,ycenter,granx1,granx2,grany1,grany2,nu,m:integer;
const cln=clwhite;
clr=clblack;
{Процедура начала движения}
procedure BeginMove(n,xpoint,ypoint:integer);
begin
n:=random(4); {Здесь выбирается с какой стороны экрана точка начнет свое движение, случайно}
case n of {координата не должна попасть за мнимые грани}
0: yp:=grany1;
1: xp:=granx2;
2: yp:=grany2;
3: xp:=granx1;
end;
case n of {Вычисление соответствующих координат, случайно}
0,2: xp:=trunc((granx2-granx1)*random+granx1);
1,3: yp:=trunc((grany2-grany1)*random+grany1);
end;
setpixel (xp,yp,clr);
end;
{Процедура движения точки}
procedure Moving (n,xpoint,ypoint:integer);
begin
setpixel (xp,yp,cln);
flag:=0;
repeat
{Условие не покидания мнимых границ}
if (xp<=granx2) and (xp>=granx1) and (yp>=grany1) and (yp<=grany2) then begin
n:=random(4); {Выбираем одну из 4 сторон куда будет двигаться точка}
case n of
0: yp:=yp+1;
1: xp:=xp-1;
2: yp:=yp-1;
3: xp:=xp+1;
end;
flag:=0;
if (xp>granx2) or (xp<granx1) or (yp<grany1) or (yp>grany2) then
begin
flag:=1;
if xp>granx2 then xp:=xp-1
else
if xp<granx1 then xp:=xp+1
else
if yp>grany2 then yp:=yp-1
else
if yp<grany1 then yp:=yp+1
end;
end
else flag:=0
until flag=0;
end;
begin
{Для более быстрого разрастания кластера введем мнимые грани}
granx1:=320;
granx2:=325;
grany1:=240;
grany2:=245;
xcenter:=321;
SetWindowWidth(641); {Ширина и высота окна}
SetWindowHeight(481);
{ставим центральную точку}
setpixel (319,239,clr);
write (‘Введите кол-во точек:’);
readln (m);
{Фиксируем, что это место занято}
for i:=1 to 3 do begin
ycenter:=241;
xcenter:=xcenter-1;
for j:=1 to 3 do begin
ycenter:=ycenter-1;
pole[xcenter,ycenter]:=1; {Место занято}
end;
end;
for k:=1 to m do begin {цикл будет повторятся пока не истекут точки}
BeginMove (k,xp,yp);
repeat
Moving(k,xp,yp); {Обращаемся к процедуре, в которой вычисляются новые координаты}
setpixel (xp,yp,clr); {Ставим точку}
until pole[xp,yp]=1;
nu:=yp+2;
xp:=xp+2;
for i:=1 to 3 do begin
yp:=nu;
xp:=xp-1;
for j:=1 to 3 do begin
yp:=yp-1;
pole[xp,yp]:=1; {Занимаем место}
{setpixel (xp,yp,clr)} {если скобы убрать-разрастание блоками}
end;
end;
{Условие для увеличения мнимых границ}
if k mod 11 = 0 then {здесь можно 11 заменить нарпимер на 301, тогда будет красивая картинка}
begin
granx1:=granx1-1;
granx2:=granx2+1;
grany1:=grany1-1;
grany2:=grany2+1;
end
else
k:=k+1;
end;
end.
Советую воспользоваться для правильной работы программы — PascalABC 3. Почему? О PascalABC
Ссылка для скачивания: Программа по построению кластера методом «Муравья»
Вернуться назад