Построение кластера методом «Муравья»

Апрель 25, 2009 / Автор AlexR / Рубрики Программирование, Статьи / Ответ

Метод «муравья» в построении кластера заключается в том, что в центр экрана ставится неподвижная «точка», а затем с разных сторон экрана вылетают «точки», которые двигаются хаотично, но по определенным правилам:

1.       Движение» точки» происходит только вверх, вниз, влево и вправо на одну единицу.

2.       При соприкосновении с любой «точкой», рассматриваемая точка завершает движение и останавливается в том месте, где произошло соприкосновение.muravei

При этом я оставил случай того, что из-за экрана могут вылететь сразу несколько «точек», то есть, следующая «точка» не начнет движение, пока рассматриваемая его не закончит.

Для того чтобы построение кластера происходило быстрее я ввел мнимые грани, которые расширяются по мере увеличения количества «прилипших точек».

Программа реализована на языке 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

Ссылка для скачивания: Программа по построению кластера методом «Муравья»
Вернуться назад

Ответ