Пример рекурсивной программы «Кривая Дракона»:
program dragon;graph;k,d,m:integer;ris(x1,y1,x2,y2,k:integer);xn,yn:integer;k>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(x-c)
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>x, y, z, dt, a, b, c, x1, y1, z1;x2, y2;main(void) {gdriver = DETECT, gmode, errorcode;(&gdriver, &gmode, "");= 3.051522;= 1.582542;= 15.62388;= 0.0001;= 0.2;= 0.2;= 5.7;(getmaxcolor());(!kbhit()) {= x + (-y-z)*dt;= y + (x+a*y)*dt;= z + (b+z*(x-c))*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<=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>255 then col:=255;loc<0 then col:=0;plasma(x1,y1,x2,y2 : integer);,yn,dxy,p1,p2,p3,p4 : integer;(x2-x1<2) and (y2-y1<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;
end.
ПРИЛОЖЕНИЕ 5
Фрактальная графика. Используя фрактал, построить лист папоротника.
Лист папоротника - достаточно простой и наглядный пример построения фрактала с помощью вероятностных распределений. С их помощью можно строить достаточно красивые и сложные фигуры.
Суть метода заключается в фиксировании на начальном этапе какой-либо
точки, и в дальнейшем циклическом аффинном преобразовании системы координат, в
которой точка строится.
program Paporotnik;
ПРИЛОЖЕНИЕ 6.
Дерево Пифагора. Пифагор, доказывая свою знаменитую теорему, построил
фигуру, где на сторонах прямоугольного треугольника расположены квадраты. В наш
век эта фигура Пифагора выросла в целое дерево. Впервые дерево Пифагора
построил А.Е.Босман во время Второй Мировой Войны, используя обычную чертежную
линейку.
Program Pif;crt, graph;Draw(x, y, l, a: real);Rect(x1, y1, l: integer, al: real);(x1, y1);(x1 + round(l*cos(al)), y1 - round(l*sin(al)));(x1 + round(l*sqrt(2)*cos(al + pi/4)), y1 - round(l*sqrt(2)*sin(al + pi/4)));(x1 + round(l*cos(al + pi/2)), y1 - round(l*sin(al + pi/2)));(x1, y1);;l>4 then begin(round(x), round(y), round(l), a);(x - l*sin(a), y - l*cos(a),l/sqrt(2), a+pi/4);(x - l*sin(a) + l/sqrt(2)*cos(a+pi/4), y - l*cos(a)* l/sqrt(2)* sin(a+pi/4),l/sqrt(2), a-pi/4);;;

Одним из свойств дерева Пифагора является то, что, если площадь первого квадрата равна единице, то на каждом уровне площадь квадратов тоже будет равна единице.
Заметим, что дерево Пифагора является разновидностью двомчного дерева.
Если в классическом дереве Пифагора угол равен 45 градусам, то, как обобщение классического дерева Пифагора, можно строить обобщенное дерево Пифагора или как его по-другому называют обдуваемое ветром дерево Пифагора.
Можно также упростить дерево Пифагора и рисовать не квадраты, а только
отрезки соединяющие «центры» треугольников. При этом сами треугольники не
рисуются. Будем называть такой фрактал Обнаженным Деревом Пифагора.
Program DPif;crt, graph;= 3;
Procedure linetol(x, y: integer; l, u: real);(x, y, round(x + l*cos(u)), round(y - l*sin(u)));;Draw(x, y: integer, l, u: real);(x1, y1);(x1 + round(l*cos(al)), y1 - round(l*sin(al)));(x1 + round(l*sqrt(2)*cos(al + pi/4)), y1 - round(l*sqrt(2)*sin(al + pi/4)));(x1 + round(l*cos(al + pi/2)), y1 - round(l*sin(al + pi/2)));(x1, y1);;KeyPressed then exit;l>max then begin:=l*0.7;(x, y, l, u);:=round(x + l*cos(u));:=round(y - l*sin(u));(x , y, l, u+pi/4);{угол поворота}(x , y, l, u-pi/6);{угол поворота};;
ПРИЛОЖЕНИЕ 6
Одномерное множество Кантора. Георг Кантор (1845-1918) явился одним из основателей теории множеств. Он придумал один из старейших фракталов - множество Кантора(описано им в 1883 г.). На Западе подобные множества называют иногда пылью. Существование этого фрактала отмечалось до этого Генри Смитом в 1875 году. Фрактальные свойства пыли Кантора имеют огромное значение, особенно учитывая тот факт, что многие известные фракталы являются близкими родственниками этого фрактала.
Способ построения этого множества следующий. Берется отрезок прямой единичной длины. Затем он делится на три равные части, и вынимается средний отрезок. Это первый шаг итерационной процедуры. На втором шаге подобной процедуре деления на три равные части и последующего удаления середины подвергается каждый из двух оставшихся отрезков. Так продолжая до бесконечности, получим множество Кантора. Нетрудно заметить, что суммарная длина получившихся в пределе отрезков равна нулю, так как мы исключили в результате длину, равную 1:
/3+2/9+4/27+…=1/3*(1+2/3+4/9+…)=1/3*1/(1-2/3)=1.
Также нулю равна и топологическая размерность.
Program Cantor;
Uses crt, graph;
Const= 1;
Procedure Draw(x, y: real; size: real);: real;size> min then begin:= size/3;(x, y + 20, S );(x +S*2, y +20,S);;(round(x), round(y), round(x+ size), round(y + 5));;
Множество Кантора
Множество Кантора не очень удобно строить на экране компьютера, вследствие сильной разреженности конечных точек, поэтому удобнее строить разновидность, называемую Гребнем Кантора. Для его построения нужно в программе множества Кантора заменить строчку
Bar(round(x), round(y), round(x+ size), round(y + 5));
На rectangle(round(x), round(y), round(x+ size), round(y + 20));,
Гребень Кантора.
ПРИЛОЖЕНИЕ 7.
Кривая Леви
Кривая Леви - фрактал, предложенный французским математиком П. Леви, получается, если взять половину квадрата вида /\, а затем каждую сторону заменить таким же фрагментом, и, повторяя эту операцию, в пределе мы получим кривую Леви.
Свойства
· Кривая Леви нигде не дифференцируема и не спрямляема.
· На любом интервале кривой Леви есть точка самопересечения.
· Хаусдорфова размерность кривой Леви приблизительно равына
1.9340.
ПРИЛОЖЕНИЕ 8
Кривая Минковского. Кривая Минковского или колбасы Минковского -
классический геометрический фрактал, предложенный Минковским. Инициатором
является отрезок, а генератором является довольно сложная ломаная из восьми
звеньев (два равных звена продолжают друг друга).
Свойства
· Кривая Минковского нигде не дифференцируема и не спрямляема.
· Кривая Минковского не имеет самопересечений.
· Кривая Минковского имеет Хаусдорфову размерность = 3/2.
ПРИЛОЖЕНИЕ 9
Примеры кривых, построенных в программе IFS Builder 3d:
Кривая Леви:
position (0.7,-0.5,-2.5) direction(0,0,1) vertical(0,1,0)
fov(50);color(1,1,0,3) position(1, 1,-3);color(1,1,0,1)
position(3,-1,-1);(1,1,1,0.05);:=scale(sqrt(.5))translate(1,-1,0)rotate(45);:=scale(sqrt(.5))rotate(-45);F=(f1+f2)F;//Dimension
of boundary = 1.9340071829f1*F;(2,1,0);f2*F;(0,1,0);
Дерево Пифагора:
position (0.5,0.3,-1.8) direction(0,0,1) vertical(0,1,0) fov(50);color(1,1,0,3) position(1, 1,-3);
light color(1,1,0,1) position(3,-1,-1);
ambient(1,1,1,0.05);:= translate(1,0) scale(sqrt(.5)) rotate(-45) translate(-1,0);:= scale(sqrt(.5)) rotate(45);Segment=scale(.5)(id()+translate(1/3,0)) Segment;Square=(translate(1/3,0)+translate(1/3,-1/3)+
(translate(1/3,0)+translate(2/3,0))*rotate(-90)) Segment;F=(f1+f2)F;
//Dimension of the PythagoreanTree = 2
//Dimension of boundary =
1.9340071829PythagoreanTree=(f1+f2)PythagoreanTree+Square;PythagoreanTree;
Кривая Минковского:
position (0.5,0,-0.85) direction(0,0,1) vertical(0,1,0) fov(50);color (0,2,0) position (1, 1,-3) shadows(0);color (2,2,0) position (3,-1,-1) shadows(0);(1,1,1, .05);(0,1,1,0.5);
// Hutchinson operator for Minkowski Curve:= (id()+translate(1/4,0)*rotate(90)+translate(1/4,1/4)+(1/2,1/4)*rotate(-90)+translate(1/2,0)*rotate(-90)+(1/2,-1/4)+translate(3/4,-1/4)*rotate(90)+(3/4,0))*scale(1/4);
//build F F(Segment =
scale(1/2)*(id()+translate(1,0,0))Segment);camera position (0.42,-0.17,-1.3)
direction(0,0,1) vertical(0,1,0) fov(50);color(1,1,0,3) position(1,
1,-3);color(1,1,0,1)
position(3,-1,-1);(1,1,1,0.05);:=scale(sqrt(1/2));:=translate(1,0,0)rotate(-135)f0;:=rotate(-45)f0;F=(f1+f2)F;//Dimension
of boundary = 1.5236270862f1*F;(2,1,0);f2*F;(0,1,0);MinkowskiCurve =
F(MinkowskiCurve);
Кривая дракона Хартера-Хейтуэя:
position (0.42,-0.17,-1.3) direction(0,0,1) vertical(0,1,0)
fov(50);color(1,1,0,3) position(1, 1,-3);color(1,1,0,1)
position(3,-1,-1);(1,1,1,0.05);:=scale(sqrt(1/2));:=translate(1,0,0)rotate(-135)f0;:=rotate(-45)f0;F=(f1+f2)F;//Dimension
of boundary = 1.5236270862f1*F;(2,1,0);f2*F;(0,1,0);
Снежинка Коха:
position (0,0,-2.3745022657807842) direction(0,0,1) vertical(0,1,0) fov(50);color (1,1,1,2) position (1, 1,-3) shadows(0);color (1,1,1,4) position (3,-1,-1) shadows(0);(1,1,1,.05);(0,1,1,0);=1/sqrt(3);:= translate(1/2,s/2,0)*rotate(-150);:= translate(1,0,0)*rotate(150);:= translate(-1/2, 1/s/2,0)*rotate(-30);:= translate(-1/2,-1/s/2,0)*rotate( 90);:= translate(1,0,0)*rotate(-150);Curve = (f1+f2)scale(s)Curve;Snowflake = (f3+f4+f5)scale(1/s)Curve; color (0,1,1);
//build
(1+s*rotate(30))*Snowflake;S=s*rotate(30)*(Snowflake+S); color (0,1,0);
Треунольник Серпинского:
// Sierpinsky's triangleposition (0,0.24,-1.6)
direction(0,0,1) vertical(0,1,0) fov(50);color(2,2,0)
position(1,1,-3);color(4,4,0)
position(3,-1,-1);(1,1,1,0.05);(0,1,1,0.3);=sqrt(2)/3;=sqrt(6)/3;:=
translate(0,2*a,0) scale(0.5) translate(0,-2*a,0);:= translate( b,-a,0)
scale(0.5) translate(-b,a,0);:= translate(-b,-a,0) scale(0.5) translate( b,a,0);F=(f1+f2+f3)
F;
Губка Менгера:
position (-1.6,-1.6,-1.6) direction(1,1,1) vertical(0,1,0) fov(50);color (0,1,1,.35) direction (1, 1,1);(1,1,1,.05);(0,1,1,0.0);(1,1,1,0);:=translate;Sponge=scale(1/3)*((-2,-2,-2)+T(0,-2,-2)+T(2,-2,-2)+(-2, 0,-2)+ T(2, 0,-2)+(-2, 2,-2)+T(0, 2,-2)+T(2, 2,-2)+(-2,-2, 0)+ T(2,-2, 0)+(-2, 2, 0)+ T(2, 2, 0)+(-2,-2, 2)+T(0,-2, 2)+T(2,-2, 2)+(-2, 0, 2)+ T(2, 0, 2)+(-2, 2, 2)+T(0, 2, 2)+T(2, 2, 2)
)*Sponge;
ПРИЛОЖЕНИЕ 10
Построение L-фрактала возможно по алгоритму построения множества Жюлиа, это множество порождает свой фрактал исходя из известных начальных значений. Для описания множества нужно задать значения C, комплексного числа (в форме a + (b * i)). Начальное значение Z также соответствует комплексному числу. Действительная часть данного числа соответствует координате x, а мнимая координате y. Чтобы нарисовать фрактал, нужно последовательно применить уравнение z' = λz(1-z) для каждого из значений Z из ряда (0,…,n).
Для данной задачи λ возьмём равное 0.85+0.6i, чтобы отображение фрактала
было более плотным.
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <complex.h>main() {gd = DETECT, gm;mx, my;l, z;it=35, max=100;k;(&gd, &gm, ""); // подключение графики= getmaxx() / 2; // масштаб
my = getmaxy() / 2;(int x = -mx; x <= mx; x++) { // определение комплексных λ и z
for (int y = -my; y <= my; y++) {= complex(x*0.01, y*0.01);= complex(0.85, 0.6);;= 0;((k < it)&&(abs(z) < max)) { // реализация формулы= l*z*(1-z);++;
}(k<it) putpixel(mx+x, my+y, k % 16); // прорисовка
}
}();();;
}