Фрактал снежинка

snow.JPG

Построить фрактал снежинка

Алгоритм работы над задачей:
• Определим, какие данные нужны для рисования снежинки и введем обозначения:
n – количество звеньев снежинки, p – количество ветвей снежинки, l – длину (в точках) ветви внутреннего звена, t - коэффициент уменьшения каждого звена.
• Центр снежинки расположим в центре экрана монитора (320, 240).
• Начинаем рисовать из центра снежинки: рисуем первый (длины l) отрезок, далее, если это не последнее звено, то рисуем отрезок длины l*t следующего звена,
и так до тех пор, пока не нарисуем отрезок последнего звена (l*tn-1).
• На последнем звене дорисовываем самую маленькую снежинку.
• Возвращаемся на предпоследний отрезок и дорисовываем самое маленькое звено со снежинкой.
• И так продолжаем до тех пор, пока не нарисуем всю снежинку. Эта логика рисования легко реализуется с помощь рекурсии.

{$S+}
Uses graph,crt;
label 1,2;
var x,y,a,b,p,n:integer;
t,l:real;
g:char;
procedure snow(x,y,k:integer;l:real);
var x1,y1:integer;
i:integer;
begin
if k=0 then exit;
for i:=1 to p do   {открываем цикл от 1 до р}
begin
x1:=trunc(x+l*cos(2*pi*(i-1)/p-pi/2));  {вычислям координаты, округляя их до целых значений}
y1:=trunc(y+l*sin(2*pi*(i-1)/p-pi/2));
if (x1>640) or (y1>480) or (x1<0) or (y1<0) then begin {проверяем попадают ли эти координаты в пределы экрана}
outtextxy(10,10,'Sorry, picture not on the screen !!!'); 
outtextxy(10,20,'Press any key for exit');
end;
if keypressed then halt;
line(x,y,x1,y1);  {рисуем на экране линию с вычисленными координатами}
snow(x1,y1,k-1,l*t); {повторяем процедуру при этом уменьшая к на 1 и уменьшаем l на коэффициен уменьшения каждого звена. 
                             Это будет повторяться до тех пор пока k не станет равным 0, и пока не нарисуем отрезок последнего звена l*t^n-1 }
end;
end;
begin
x:=320;  {задаем центр снежинки}
y:=240;
t:=0.4;   {задаем t - коэффициент уменьшения каждого звена}
write('n='); readln(n); {пользователем вводится колличество звеньев снежинки}
write('p='); readln(p); {пользователем вводится колличество ветвей снежинки}
l:=y*(1-t)/(1-exp(n*Ln(t)))-1;  {выводим коэффициент масштабирования, для l так что при увеличении колличества звеньев 
                                           снежинка не выйдет за пределы экрана }
a:=detect; b:=detect;  {подключаем графику}
initgraph(a,b,'c:\lg\bgi');
snow(x,y,n,l);  {вызов процедуры}
readkey;   {ожидаем нажатия клавиши и закрываем графику}
closegraph;
end.

Ключевые слова: 
фрактал, снежинка, масштабирование
ВложениеРазмер
snow.rar19.66 кб