forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Наше Open Source Software (http://forum.boolean.name/forumdisplay.php?f=132)
-   -   Фрактал:"Кривая дракона" (http://forum.boolean.name/showthread.php?t=15681)

Igor 19.10.2011 22:13

Фрактал:"Кривая дракона"
 
Вложений: 1
Википедия
там есть пример на делфи, но код писался до прочтения той статьи)

суть:
1)изначально кривая является отрезком.
2)берём кривую за крайнюю точку, копируем относительно её с поворотом на 90. результат в два раза длиннее) Повторить много раз.

мой код:
program Dragon;

//кусочек кривой, х и у - смещение относительно предыдущей точки
type
kus=record
x,y:integer;
end;

var line:array[1..10000] of kus;

//поворачивает кривую от 1 до а, добавляет её с (а+1) до 2*а
procedure povorot(a:integer);
var i:integer;
begin
for i:=1 to a do
begin
line[i+a].x:=Line[a-i+1].y;
line[i+a].y:=-Line[a-i+1].x;
end;
end;


procedure CreateStartline;
begin

line[1].x:=1;
end;

//рисуем кривую, num - количество рисуемых звеньев
procedure LineDraw(scale,num:integer);
var i,x,y:integer;
begin
setcolor(0,0,0);
x:=getwidth div 2;
y:=getheight div 2;
for i:=1 to num do
begin
drawLine(x,y,x+Line[i].x*scale,y+Line[i].y*scale);
x:=x+Line[i].x*scale;
y:=y+Line[i].y*scale;
end;
end;

//ждём нажатия любой клавиши
procedure wait;
begin

repeat
delay(50);
until getkeypressed<>ke_none;
end;

//рисует всё
procedure Draw(num:integer);
begin

setcolor(255,255,255);
fillrect(0,0,getwidth,getheight);
LineDraw(4,num);
repaint;
end;

procedure main;
var L:integer;
begin
CreateStartLine;
l:=1;
repeat
Draw(L);
povorot(L);

l:=l*2;
Delay(1000);
until L>10000;
wait;
end;

begin
main;
end
.


реализация алгоритма из википедии. Довольно забавно строит кривую - не по порядку, и при её увеличении меняет её всю (предыдущий алгоритм достраивает с краю)

program DragonWiki;

procedure Dragon(x1,y1,x2,y2,k:integer);
var tx,ty:integer;
begin
if k=0 then
begin
DrawLine(x1,y1,x2,y2);
repaint;
end
else
begin
tx:=(x1+x2) div 2+(y2-y1) div 2;
ty:=(y1+y2) div 2-(x2-x1) div 2;
Dragon(x2,y2,tx,ty,k-1);
Dragon(x1,y1,tx,ty,k-1);
end;
end;


procedure main;
begin
setcolor(255,255,255);
fillrect(0,0,getwidth,getheight);
setcolor(0,0,0);
Dragon(50,50,50+128,50+128,13);
Delay(100)
end;

begin
main;
end.

Второй алгоритм намного короче, не использует массив, но для него нужно указать хорошие начальную и конечные точки. Есть куда стремиться)


Часовой пояс GMT +4, время: 15:01.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot