Алгебраические фракталы. Рис. 85. Фрактал Мандельброта
Рис. 85. Фрактал Мандельброта Вторая большая группа фракталов – алгебраические. Свое название они получили, за то, что их строят, используя простые алгебраические формулы. Получают их с помощью нелинейных процессов в n-мерных пространствах. Известно, что нелинейные динамические системы обладают несколькими устойчивыми состояниями. Состояние, в котором окажется динамическая система после некоторого числа итераций, зависит от начальных условий. Поэтому каждое устойчивое состояние (аттрактор) обладает некоторой областью начальных состояний, при которых система обязательно перейдет в рассматриваемые конечные состояния. Таким образом, фазовое пространство разбивается на области притяжения аттракторов. Самыми известными из них являются множества Мандельброта и Жюлиа, Бассейны Ньютона и т.д. Фрактал Мандельброта назван по имени французского математика польского происхождения Бенуа Мандельброта, известного исследователя фракталов. Множество Мандельброта получают следующим образом: строится отображение z'=fc(z), где числа z и c - комплексные. Алгоритм построения множества Мандельброта выглядит следующим образом: 1. выбираем значение c 2. z:=0 n:=0 3. z:=f(z) 4. inc(n) Если не достигнуто максимальное значение итераций или значение z не превысило максимального значения, то повторять шаги 3 и 4. Наиболее часто используется формула z = z2 + c, так как она наиболее проста в применении. Раскладывая уравнение на действительную и мнимую часть, получаем следующее: Re: x2- y2+ a Цвет обычно выбирают по числу итераций, но есть и другие способы. Program M2; Uses Graph, Crt; Type TComplex = Record X : Real; Y : Real; End; Const iter = 50; max = 16; Var z, t, c : TComplex; x, y, n : Integer; Cancel : Boolean; gd, gm : Integer; mx, my : Integer; Begin Cancel := False; Randomize; gd := Detect; InitGraph(gd,gm,'e:\bp\bgi'); Mx := GetMaxX div 2; My := GetMaxY div 2; For y := -my to my do For x := -mx to mx do Begin n := 0; C.X := X * 0.005; C.Y := Y * 0.005; z.X := 0; z.Y := 0; While (sqr(z.X) + sqr(z.Y) < max) and (n < iter) do Begin t := z; Z.X := sqr(t.X) - sqr(t.Y) + C.X; Z.Y := 2 * t.X * t.Y+ C.Y; Inc(n); If keypressed then cancel := true; End; If n < iter then Begin PutPixel(mx + x,my + y,16 - (n mod 16)); End; If cancel then exit; End; Readkey; CloseGraph; end. А теперь опишем программу словами. Для всех точек на комплексной плоскости в некотором интервале вычисляем достаточно большое количество раз z = z2 + c, каждый раз проверяя абсолютное значение z. Если это значение больше максимального, то рисуем точку с цветом, вычисляемым по количеству итераций, иначе рисуем точку черного цвета. Черный цвет в середине показывает, что в этих точках функция стремится к нулю - это и есть множество Мандельброта. За пределами этого множества функция стремится к бесконечности. А самое интересное - это границы множества. Они то и являются фрактальными. Если рассмотреть увеличение, то можно увидеть самоподобие фигуры. Увеличение фракталов. C.X:=X*0.005; C.Y:=Y*0.005; Чем меньше число, тем больше увеличение и наоборот. Для того чтобы сместить множество, нужно прибавлять или вычитать числа в том же куске кода. Рассмотрим в общем случае: C.X := X*m + dx; C.Y := Y*m + dy; Здесь m задет увеличение, dx - смещение по горизонтали, а dy - смещение по вертикали. Например, положив, что m=0.0001, dx=-1.2, dy=-0.3, мы получим примерно то, что изображено на рисунке (рис. 86).
Рис. 86
Рис. 87. Стохастический фрактал
Кривая Коха как бы не была похожа на границу берега не может выступать в качестве ее модели из-за того, что она всюду одинакова, самоподобна, а в действительности это не так. Все природные объекты создаются по капризу природы, и есть случайность в этом процессе. Фракталы при построении которых в итеративной системе случайным образом изменяются какие-либо параметры называются стохастичными. Термин "стохастичность" происходит от греческого слова, обозначающего "предположение". Также примером случайности в природе является броуновское движение. С помощью компьютера такие процессы строить достаточно просто, т.к. он позволяет генерировать последовательности случайных чисел. Эти фракталы используются при моделировании рельефов местности и поверхности морей, процесса электролиза. Построение ландшафта Возьмем карту размером 512*512 точек, каждая из которых представляет собой 8-ми битное целое значение высоты и цвета. Первоначально изображение выглядит таким образом, что при вызове функции высоты в точках с координатами (u,v) она возвращает одинаковые значения в углах условной сетки точек. Т. е. w(0,0)=w(512,0)=w(0, 512)=w(512, 512). w(1,1)=w(512, 512) и т. д. Координаты поверхности: Координаты (u,v) описывают положение на поверхности. Всю поверхность можно представить как множество дискретных значений функции высоты h=w(u,v). Координаты экрана: Положение точек на экране будем описывать координатами (x,y). Построение поверхности: Генерация фрактальных поверхностей, по другому, называется плазма или рекурсивное разбиение и выглядит следующим образом. В начале вычисляем произвольные высоты в углах и середине карты поверхности т. е. в точках: (0,0), (512,0), (0, 512), (512, 512) (рис. 88 a,b). Затем запускаем подпрограмму вычисления высот, для которой в качестве параметров передаются размер и положение квадратного участка поверхности, в первом случае этим участком является вся карта. Подпрограмма считывает значения высот из углов квадрата полученного в качестве параметра. Вдоль каждого ребра квадрата вычисляется среднее значение двух высот по краям ребра и к полученному значению прибавляется некоторое произвольное значение, пропорциональное длине ребра, результат записывается в точку, делящую ребро пополам (рис. 88 c). Затем вычисляется высота центра квадрата путем нахождения средней высоты четырех высот углов квадрата, и к полученному значению добавляют произвольное число (рис. 88 d). В 3-х мерном изображении этот процесс будет выглядеть следующим образом.
Рис. 88 Для получения более гладких поверхностей используют метод «смазывания», который предполагает пересчет вершин поверхности по следующей формуле:
w(u,v)=k1*w(u,v)+k2*w(u+3,v-2)+k3*w(u2,v+4).
Причем k1, k2, k3 подбирают таким образом чтобы k1+k2+k3=1. Все вычисления производятся в фиксированных точках целочисленной арифметики.
Рис. 89. Примеры фрактальных ландшафтов Приведем программу построения стохастического фрактала «Плазма». Рис.90. Фрактал «Плазма» Program Plazma; Uses CRT, Graph; Var Plasma : Array [0..319, 0..199] of Byte; x, y, j: Integer; gd, gm : Integer; Procedure RGB(N, R, G, B:Word); Begin Port[$3c8]:=n; Port[$3c9]:=R div 4; Port[$3c9]:=G div 4; Port[$3c9]:=B div 4; End; Procedure Adjust(xa,ya,x,y,xb,yb: Integer); Var d: Integer; v: Real; Begin if plasma[x, y] <> 0 then exit; d:=Abs(xa - xb) + Abs(ya - yb); v:=(plasma[xa, ya] + plasma[xb, yb]) / 2 + (random - 0.5) * d * 2; If v < 1 Then v:=1; If v >= 255 Then v:=255; plasma[x, y]:=Trunc(v); End; Procedure HalfWay(x1, y1, x2, y2: Integer); Var x, y: Integer; Begin If (x2 - x1 < 2) and (y2 - y1 < 2) Then Exit; x:=(x1 + x2) div 2; y:=(y1 + y2) div 2; Adjust(x1, y1, x, y1, x2, y1); Adjust(x2, y1, x2, y, x2, y2); Adjust(x1, y2, x, y2, x2, y2); Adjust(x1, y1, x1, y, x1, y2); If Plasma[x,y]=0 Then plasma[x,y]:=trunc((plasma[x1, y1] + plasma[x2, y1] + plasma[x2, y2] + plasma[x1, y2]) / 4); HalfWay(x1, y1, x, y); HalfWay(x, y1, x2, y); HalfWay(x, y, x2, y2); HalfWay(x1, y, x, y2); end;
Procedure MakePlasma; Begin Plasma[0, 199]:=Random(190); Plasma[319, 199]:=Random(190); Plasma[319, 0 ]:=Random(190); Plasma[0, 0 ]:=Random(190); HalfWay(0, 0, 319, 199); End; Begin Asm mov ax ,13h int 10h End; Randomize; For J:=0 To 43 Do RGB(j, 255, j*6, 0); For J:=0 To 43 Do RGB(43+j, 255-j*6, 255, 0); For J:=0 To 43 Do RGB(86+j, 0, 255, j*6); For J:=0 To 43 Do RGB(129+j, 0, 255-j*6, 255); For J:=0 To 43 Do RGB(172+j, j*6, 0, 255); For J:=0 To 40 Do RGB(215+j, 255, 0, 255-j*6); MakePlasma; For x := 0 to 319 do For y := 0 to 199 do Mem[$0a000 : y * 320 + x] := plasma[x, y]; Readkey; End. Чтобы перед глазами все поплыло, мы в цикле будем менять палитру. (Переменная c любого целого типа.) ...
Begin Asm mov ax ,13h int 10h End; Randomize; c:=0; MakePlasma; For x := 0 to 319 do For y := 0 to 199 do Mem[$0a000 : y * 320 + x] := plasma[x, y]; Repeat For J:=0 To 43 Do RGB((j+c) mod 256, 255, j*6, 0); For J:=0 To 43 Do RGB((43+j+c) mod 256, 255-j*6, 255, 0); For J:=0 To 43 Do RGB((86+j+c) mod 256, 0, 255, j*6); For J:=0 To 43 Do RGB((129+j+c) mod 256, 0, 255-j*6, 255); For J:=0 To 43 Do RGB((172+j+c) mod 256, j*6, 0, 255); For J:=0 To 40 Do RGB((215+j+c) mod 256, 255, 0, 255-j*6); inc(c); delay(1000); Until KeyPressed; Readkey; End.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (1137)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |