Матрица статей        Список статей        Всячина        Контакты       

Множества Мандельброта и Жюлиа

Множество Мандельброта


Множество Мандельброта

Рассмотрим функцию , . Множество Мандельброта определяется как множество всех , для которых орбита точки при отображении ограничена.

Наиболее часто используется . Раскладывая на действительную и мнимую часть, получаем:

приняв, что и . Цвет обычно выбирают по числу итераций, но есть и другие способы.

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.

Множество Мандельброта


Множество Мандельброта

Также можно изменить вид фрактала, если контроль значения вести другим образом. Наиболее употребляемый способ уже рассмотрен — достигает определённого максимального числа. Другими способами являются:

  • действительная часть меньше определённого числа;
  • мнимая часть меньше определённого числа;
  • и мнимая, и действительная части меньше какого-либо числа.
Есть и другие способы.

Ниже приведены изображения для .

Множество Мандельброта
Множество Мандельброта
Множество Мандельброта
Множество Мандельброта

Ссылки:

  • Морозов А. Д. Введение в теорию фракталов. — Москва-Ижевск: Институт компьютерных исследований, 2002, 82—108.
  • Кроновер. Р. М. Фракталы и хаос в динамических системах. Основы теории. Москва: Постмаркет, 2000. 217—247.
  • Пайтген Х.-О., Рихтер П. Х. Красота фракталов. М.: Мир, 1993.
  • The Mandelbrot at a Glance ,
  • Mandelbrot at higher powers ,
  • Mandelbrot Set ,
  • Mandelbrot set .

Множество Жюлиа


Множество Жюлиа

Рассмотрим функцию . Множество Жюлиа определяется как граница множества точек , стремящихся к бесконечности при итерировании :

program J2;

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,'c:\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;
			z.x := x * 0.005;
			z.y := y * 0.005;
			c.x := 0.11;
			c.y := -0.66;
			while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do 
			begin
				t := z;
				{z^2 + c}
				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.

При множество Жюлиа превращается в дендрит:

Множество Жюлиа

Другие формулы:

Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа
Множество Жюлиа

Ссылки:

  • Морозов А. Д. Введение в теорию фракталов. — Москва-Ижевск: Институт компьютерных исследований, 2002, 82—108.
  • Кроновер. Р. М. Фракталы и хаос в динамических системах. Основы теории. Москва: Постмаркет, 2000. 217—247.
  • Пайтген Х.-О., Рихтер П. Х. Красота фракталов. М.: Мир, 1993.
  • Julia Set Fractal (2D) ,
  • Julia set of sin(z) ,
  • Julia Set ,
  • Dendrite Fractal ,
  • Julia set .

Биоморфы


Биоморф

program Bio;

uses graph, crt;

type
	Complex = record 
		x: Real;
		y: Real; 
	end;

const
	iter = 50;
	max = 70;
	
var
	z, t, c: Complex;
	x, y, n: Integer;
	Cancel: Boolean;
	gd, gm : Integer;
	
begin
	Cancel:=false;
	Randomize;
	gd := Detect;
	InitGraph(gd,gm,'c:\bp\bgi');
	for y := -getmaxy div 2 to getmaxy div 2 do
		for x:=-getmaxx div 2 to getmaxx div 2 do 
		begin
			n := 0;
			z.x := x * 0.01;
			z.y := y * 0.01;
			c.x := 1.00003;
			c.y := 1.01828;
			while ((sqr(z.x) < max) and (sqr(z.y) < max)) and (n < iter) do 
			begin
				t := z;
				z.x := t.x * t.x * t.x * t.x + t.y * t.y * t.y * t.y - 
					6 * t.x * t.x * t.y * t.y + c.x;
				z.y := 4 * t.x * t.x * t.x * t.y - 4 * t.x * t.y * t.y * t.y + c.y;
            			inc(n);
				if keypressed then 
					cancel := true;
			end;
			if (abs(z.x) > 10) or (abs(z.y) > 1000) then 
				PutPixel(GetMaxM div 2 + x, GetMaxY div 2 + y, n mod 16);
			if Cancel then 
				Exit;
		end;
	ReadKey;
	CloseGraph;
end.

Ещё несколько формул:

  • .
    Биоморф

  • .
  • .
    Биоморф

  • .
  • .
    Биоморф

  • .
  • .

Ссылки:

Дерево Барнсли

Рассмотрим фрактал Жюлиа, где в качестве берётся функция , .


Дерево Барнсли

/* BarnsleyJ1 */
#include 
#include 
#include 
#include 

double sgn(double x) 
{
	return (x >= 0) ? 1 : -1;
}

void main() 
{
	int gd = DETECT, gm;
	int mx, my;
	complex c, z;
	int it = 50, max = 2;
	int k;
	initgraph(&gd, &gm, "C:\\BORLANDC\\BGI");
	mx = getmaxx() / 2;
	my = getmaxy() / 2;
	for (int x = -mx; x <= mx; x++) 
	{
		for (int y = -my; y <= my; y++) 
		{
			z = complex(x*0.008, y*0.008);
			c = complex(0.6, 1.1);
			k = 0;
			while ((k < it)&&(abs(z) < max)) 
			{
				z = c*(z-sgn(real(z)));
				k++;
			}
			putpixel(mx+x, my+y, (k % 15)+1);
		}
	}
	getch();
	closegraph();
	return;
}

Если в качестве взять , то получится следующее:

Дерево Барнсли

program BarnsleyJ2;
uses Graph, CRT;
type
	Complex = record
		x: Real;
		y: Real;
	end;
	
const
	Iter = 50;
	Max = 4;
	
var
	z, t, c: Complex;
	x, y, n : Integer;
	gd, gm  : Integer;
	mx, my  : Integer;
Begin
	gd := Detect;
	InitGraph(gd,gm,'c:\bp\bgi');
	Randomize;
	mx := GetMaxX div 2;
	my := GetMaxY div 2;
	for y := -my to my do
		for x := -mx to mx do 
		begin
			n := 0;
			z.x := x * 0.008;
			z.y := y * 0.008;
			c.x := 0.6;
			c.y := 1.1;
			while (sqr(z.x)+sqr(z.y) < max) and (n= 0 then 
				begin
					z.x := t.x * c.x - t.y * c.y - c.x;
					z.y := t.x * c.y + t.y * c.x - c.y;
				end 
				else 
				begin
					z.x := t.x * c.x - t.y * c.y + c.x;
					a.y := t.x * c.y + t.y * c.x + c.y;
				end;
				inc(n);
			end;
			PutPixel(mx+x, my+y, n mod 16);
			if KeyPressed then 
				Break;
		end;
	ReadKey;
	CloseGraph;
end.

Ссылки:

Лямбда-фрактал

Рассмотрим множество Мандельброта при , .

#include 
#include 
#include 
#include 
void main() {
	int gd = DETECT, gm;
	int mx, my;
	complex l, z;
	int it = 35, max = 100;
	int k;
	initgraph(&gd, &gm, "C:\\BORLANDC\\BGI");
	mx = getmaxx() / 2;
	my = getmaxy() / 2;
	for (int x = -mx; x <= mx; x++) 
	{
		for (int y = -my; y <= my; y++) 
		{
			l = complex(x*0.01+1, y*0.01);
			z = 0.5;
			k = 0;
			while ((k < it)&&(abs(z) < max)) 
			{
				z = l * z * (1 - z);
				k++;
			}
			if (k < it) putpixel(mx+x, my+y, k % 16);
		}
	}
	getch();
	closegraph();
	return;
}

program Lambda;

uses Graph, Crt;

type
	Complex = record
		X : Real;
		Y : Real;
	end;
	
const
	iter = 30;
	max  = 100;
var
	z, c    : Complex;
	p, q    : Real;
	x, y, n : Integer;
	gd, gm  : Integer;
	mx, my  : Integer;
	
begin
	Randomize;
	gd := Detect;
	InitGraph(gd,gm,'c:\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.01 + 1;
			c.y := y * 0.01;
			z.x := 0.5;
			z.y := 0;
			while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do 
			begin
				p := z.x - sqr(z.x) + sqr(z.y);
				q := z.y - 2 * z.x * z.y;
				z.x := c.x * p - c.y * q;
				z.y := c.x * q + c.y * p;
				Inc(n);
				if KeyPressed then 
					Exit;
			end;
			if n < iter then 
				PutPixel(mx + x, my + y, 16 - (n mod 16));
		end;
	Readkey;
	CloseGraph;
end.

Лямбда-фрактал

Ниже приведено множество Жюлиа для , .


Лямбда-фрактал

Ссылки:

  • Мандельброт Б. Фрактальная геометрия природы. — Москва: Институт компьютерных исследований, 2002. 257—272.

Горящий корабль


Фрактальный горящий корабль

program Ship;

uses Graph, Crt;

type
	Complex = Record
		X : Real;
		Y : Real;
	end;
const
	iter = 30;
	max  = 16;
	
var
	z, t, c : Complex;
	x, y, n : Integer;
	Cancel  : Boolean;
	gd, gm  : Integer;
	mx, my  : Integer;
	
begin
	Cancel := false;
	Randomize;
	gd := Detect;
	InitGraph(gd,gm,'c:\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 - 0.2;
			c.y := y * 0.005 - 0.3;
			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 * abs(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.

Ссылки:

Паук


Фрактальный паук

Рассматривается множество таких , которые стремятся к бесконечности при итерировании вида

program Spider;

uses Graph, CRT;

type
	Complex = record 
		x: Real;
		y: Real; 
	end;
   
const
	iter = 50;
	max = 16;
   
var
	z, z1, c, c1: Complex;
	x, y, n: Integer;
	Cancel: Boolean;
	gd, gm : Integer;
   
begin
	gd := Detect;
	InitGraph(gd,gm,'c:\bp\bgi');
	Cancel := false;
	Randomize;
	for y := -GetMaxY div 2 to GetMaxY div 2 do
		for x := -GetMaxX div 2 to GetMaxX div 2 do
		begin
			n := 0;
			z.x := x * 0.01;
			z.y := y * 0.01;
			c.x := z.x;
			c.y := z.y;
			while (sqr(z.x) + sqr(z.y) < max) and (n < iter) do 
			begin
				z1 := z;
				c1 := c;
				z.x:=sqr(z1.x)-sqr(z1.y)+c.x;
				z.y:=2*z1.x*z1.y+c.y;
				c.x:=c1.x/2+z.x;
				c.y:=c1.y/2+z.y;
				inc(n);
				if KeyPressed then 
					Cancel := true;
			end;
			if n < iter then
				PutPixel(GetMaxX div 2 + x, GetMaxY div 2 + y, n mod 16);
			if Cancel then 
				Exit;
		end;
	ReadKey;
	CloseGraph;
end.

Смотрите также: