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

Фракталы и системы счисления

Некоторые фрактальные кривые можно строить следующим образом. Пусть необходимо постоить предфрактал порядка . Он представляет собой совокупность отрезков. Пронумеруем их от 0 до . Тогда направление отрезка с номером определяется функцией , которая имеет вид

где -й разряд числа в системе счисления по основанию , .

Рассмотрим кривую Коха. Воспользуемся системой счисления по основанию 4. Определим функцию следующим образом:


Построение кривой Коха

Ниже приведена программа построения кривой Коха с использованием данного алгоритма.

program Koch;

uses CRT, Graph;

const
	p = 4;
	
var
	gd, gm: Integer;
	i: Integer;
	x, y, l: Real;
	a: Real;
	n, m, k: Integer;
	
begin
	gd := Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	x := 0;
	y := 400;
	l := 640 / (exp(p*ln(3)));
	MoveTo(Round(x), Round(y));
	for i := 0 to Round(exp(p*ln(4)))-1 do 
	begin
		a := 0;
		n := i;
		k := 0;
		repeat
			m := n mod 4;
			n:=n div 4;
			case m of
				0: a := a + 0;
				1: a := a - pi/3;
				2: a := a + pi/3;
				3: a := a + 0;
			end;
			inc(k);
		until k >= p;
		x := x + l*cos(a);
		y := y + l*sin(a);
		LineTo(Round(x), Round(y));
	end;
	ReadKey;
	CloseGraph;
end.

Построение кривой Коха

Рассмотрим построение обобщения кривой Коха с восьмизвенным генератором. Для этого воспользуемся восьмеричной системой счисления и функцию определим следующим образом:


Построение кривой Коха

program Koch10;

uses CRT, Graph;

const
	p = 4;
	
var
	gd, gm: Integer;
	i: Integer;
	x, y, l: Real;
	a: Real;
	n, m, k: Integer;
	
begin
	gd := Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	x := 0;
	y := 240;
	l := 640 / (exp(p*ln(4)));
	MoveTo(Round(x), Round(y));
	for i := 0 to Round(exp(p*ln(8)))-1 do 
	begin
		a := 0;
		n := i;
		k := 0;
		repeat
			m := n mod 8;
			n := n div 8;
			case m of
				0: a := a + 0;
				1: a := a - pi/2;
				2: a := a + 0;
				3: a := a + pi/2;
				4: a := a + pi/2;
				5: a := a + 0;
				6: a := a - pi/2;
				7: a := a + 0;
			end;
			inc(k);
		until k >= p;
		x := x + l*cos(a);
		y := y + l*sin(a);
		LineTo(Round(x), Round(y));
	end;
	ReadKey;
	CloseGraph;
end.

Построение кривой Коха

Для построения кривой Леви воспользуется двоичной системой счисления,

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

program Levy;

uses CRT, Graph;

const
	p = 12;
  
var
	gd, gm: Integer;
	i: Integer;
	x, y, l: Real;
	a: Real;
	n, m, k: Integer;
	
begin
	gd := Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	x := 300;
	y := 240;
	l := 3;
	MoveTo(Round(x), Round(y));
	for i := 0 to Round(exp(p*ln(2)))-1 do 
	begin
		a := 0;
		n := i;
		m := 0;
		k := 0;
		repeat
			m := n mod 2;
			n := n div 2;
			case m of
				0: a := a+pi/4;
				1: a := a-pi/4
			end;
			inc(k);
		until k >= p;
		x := x + l*cos(a);
		y := y + l*sin(a);
		LineTo(Round(x), Round(y));
	end;
	ReadKey;
	CloseGraph;
end.

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

Ссылки:

  • Морозов А. Д. Введение в теорию фракталов. — Москва-Ижевск: Институт компьютерных исследований, 2002, 25—37.
  • Газале М. ГНОМОН. От фараонов до фракталов. Москва-Ижевск: Институт компьютерных исследований, 2002, 245—253.