ному спіралеподібних ланок, безперервно зменшуються в розмірах від центру до периферії. Ця лінія здалася схожою її першовідкривачу Дж.Хейтуею на китайських драконів, тому вона й отримала таку назву. Ця ламана не перетинає саму себе, і вона регулярно заповнює частину площині.
Приклад рекурсивної програми «Крива Дракона»:
program dragon; graph; k, d, m: integer; ris (x1, y1, x2, y2, k: integer); xn, yn: integer; k gt; 0 then:=(x1 + x2) div 2 + (y2-y1) div 2;:=(y1 + y2) div 2 - (x2-x1) div 2; (x1, y1, xn, yn, k - 1); (x2, y2, xn, yn, k - 1); begin line (x1, y1, x2, y2); end ;; (k); {задаємо порядок кривої}:=detect; (d, m, e: bp bgi ); (200,300,500,300, k);
readln;
end.
Для того, щоб зрозуміти як будується Дракон за допомогою L - систем, розглянемо більш докладно сам метод побудови. Спочатку береться відрізок одиничної довжини. Потім він замінюється на два відрізки, що утворюють бічні сторони рівнобедреного прямокутного трикутника, для яких вихідний відрізок є гіпотенузою. У результаті відрізок як би прогинається під прямим кутом. Напрямок прогину чергується. Перший відрізок прогинається вправо (по ходу руху зліва направо), другий - вліво, третій - знову вправо і т.д. Таким чином, після кожного кроку число наявних відрізків подвоюється, а довжина кожного відповідно зменшується в раз.
ДОДАТОК 3.
Фрактал Ресслера.
Побудувати фрактал Ресслера.
Для відображення необхідно побудувати рішення наступної системи диференціальних рівнянь:
dx/dt=-y - z/dt=x + ay/dt=b + z (xc)
# include lt; graphics.h gt;
# include lt; stdio.h gt;
# include lt; conio.h gt;
# include lt; math.h gt; x, y, z, dt, a, b, c, x1, y1, z1; x2, y2; main (void) {gdriver=DETECT, gmode , errorcode; ( amp; gdriver, amp; gmode, );=3.051522;=1.582542;=15.62388;=0.0001;=0.2;=0.2;=5.7; (getmaxcolor ()); (! kbhit () ) {= x + (-yz) * dt;=y + (x + a * y) * dt;=z + (b + z * (xc)) * dt;=x1;=y1;=z1; ( ceil (19.3 * (y - x * 0.292893) + 320), ceil (- 11 * (z + x * 0.292893) + 392), WHITE);
} (); (); 0;
}
ДОДАТОК 4
Плазма. Розглянемо спосіб побудови плазми за допомогою рекурсивного завдання портрета самої плазми і подальшої зміни її квітів по відповідним рівнянням гармонійних коливань (таким чином, забезпечивши плавність переходів кольору):
for (i=0; i lt;=170; i ++) {[3 * i]=(63 * sin (((double) i/170.0) * M_PI)); [3 * i +256]=(63 * sin ((double) i/170.0 * M_PI)); [(3 * i + 512)% 768]=floor (63 * sin ((double) i/170 * M_PI));
Тут pal-масив, що зберігає палітру (за допомогою нього ми будемо її здавати) сам портрет плазми будується таким чином: на краях екрану беруться 4 точки і фарбуються довільно. Далі беруться точки на середині відстаней між сусідніми точками, а також точка в середині області, і заповнюються як середнє арифметичне відповідно 2 лежать на одному відповідному з нею відрізку або 4 для серединної.
Отриманий результат відхиляється функцією ncol і присвоюється відповідному пікселю. Далі - функція викличеться рекурсивно для отриманих 4 подобластей на екрані.
Вихідний код на Turbo Pascal:
{$ A +, B-, D +, E +, F-, G +, I-, L +, N-, O-, P-, Q-, R-, S-, T-, V +, X +, Y +} crt ;: integer ;: byte ;: array [0..768] of byte ;: array [0..63999] of byte absolute $ A000: 0; col (a, b, dvd: integer ): integer ;: integer;:=(a + b-random (b)) div dvd;:=loc; loc gt; 255 then col:=255; loc lt; 0 then col:=0; plasma (x1, y1, x2, y2: integer) ;, yn, dxy, p1, p2, p3, p4: integer; (x2-x1 lt; 2) and (y2-y1 lt; 2) then EXIT;:=screen [320 * y1 + x1] ;:=screen [320 * y2 + x1];:=screen [320 * y1 + x2];:=screen [320 * y2 + x2];:=(x2 + x1) div 2;:=(y2 + y1 ) div 2;:=(x2-x1 + y2-y1); screen [320 * y1 + xn]=0 then screen [320 * y1 + xn]:=col (p1 + p3, dxy, 2); screen [ 320 * yn + x1]=0 then screen [320 * yn + x1]:=col (p1 + p2, dxy, 2); screen [320 * yn + x2]=0 then screen [320 * yn + x2]: =col (p3 + p4, dxy, 2); screen [320 * y2 + xn]=0 then screen[320*y2+xn]:=col(p2+p4,dxy,2);[320*yn+xn]:=col(p1+p2+p3+p4,dxy,4);(x1,y1,xn,yn);(xn,y1,x2,yn);(x1,yn,xn,y2);(xn,yn,x2,y2);ax,13h10h;i:=1 to 170 do pal [3 * i]:=round (63 * sin (i/170 * pi)); i:=1 to 170 do pal [3 * i + 256]:=round (63 * sin (i/ 170 * pi)); i:=1 to 170 do pal [(3 * i + 512) mod 768]:=round (63 * sin (i/170 * pi)); (1,1,319,199);:=0 ; (2000); [$ 3C8]:=counter; si, offset palcx, 768dx, $ 3C9outsb; (counter); keypressed; ax, 3h 10h
end;