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

Обобщения кривой Коха


Кривая Коха с восьмизвенным генератором

Инициатором является отрезок единичной длины, а генератором является довольно сложная структура из восьми отрезков.

Первые шаги построения кривой:

Кривая Коха с восьмизвенным генератором

program Koch6;

uses CRT, Graph;

const
	min = 4;
var
	a, b: integer;

procedure rotate_plus(var x, y: integer);

var 
	t:integer;

begin
	t := x;
	x := y;
	y := -t
end;

procedure rotate_minus(var x,y:integer);

var 
	t:integer;

begin
	t := x;
	x := -y;
	y := t
end;

procedure draw(x, y: integer; length: word);

var 
	t:word;

begin
	if keypressed then 
		exit;
	if length>= min then
	begin
		t:=length div 4;
		draw(x, y, t);
		rotate_plus(x, y);
		draw(x, y, t);
		rotate_minus(x, y);
		draw(x, y, t);
		rotate_minus(x, y);
		draw(x, y, t);
		draw(x, y, t);
		rotate_plus(x, y);
		draw(x, y, t);
		rotate_plus(x, y);
		draw(x, y, t);
		rotate_minus(x, y);
		draw(x, y, t)
	end
	else 
		inerel(length*x, length*y)
end;

begin
	initgraph(a, b, 'c:\bp\bgi');
	moveto(50, 200);
	draw(1, 0, 512);
	readkey;
	closegraph
end.

Кривую Коха можно строить с помощью восьмеричной системы счисления.

program Koch4;
uses CRT, Graph;
const
	p=4;
var
	gd, gm: Integer;
	i, j: Integer;
	x, y, l: Real;
	a: Real;
	n, m: 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;
		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;
		until n < 1;
		x := x + l*cos(a);
		y := y + l*sin(a);
		LineTo(Round(x), Round(y));
	end;
	ReadKey;
	CloseGraph;
end.

Если кривую Коха строить на сторонах квадрата, то получится квадратичный остров Коха.


Кривая Коха с восьмизвенным генератором

program Koch2;
uses 
	CRT, Graph;
var
	gd, gm: Integer;

procedure Draw(x, y, l, u : Real; t : Integer);

procedure Draw2(Var x, y: Real; l, u : Real; t : Integer);

begin
	Draw(x, y, l, u, t);
	x := x + l*cos(u);
	y := y - l*sin(u);
end;

begin
	if t > 0 then 
	begin
		l := 0.25*l;
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u, t-1);
	end
	else 
		Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l))
end;

begin
	gd:=Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	Draw(100, 100, 280, 0,     3);
	Draw(380, 100, 280, -pi/2,  3);
	Draw(380, 380, 280, -pi,    3);
	Draw(100, 380, 280, -3*pi/2,3);
	ReadKey;
	CloseGraph
end.

При написании приведенной выше программы использовался код, предоставленный Аслановым А. М.

Используя генератор из восемнадцати звеньев, можно получить кривую, изображённую на рисунке ниже.


Кривая Коха с генератором из 18 звеньев Кривая Коха с генератором из 18 звеньев Кривая Коха с генератором из 18 звеньев

program Curve10;

uses CRT, Graph;

var
	gd, gm: Integer;

procedure Draw(x, y, l, u : Real; t : Integer);

procedure Draw2(Var x, y: Real; l, u : Real; t : Integer);

begin
	Draw(x, y, l, u, t);
	x := x + l*cos(u);
	y := y - l*sin(u);
end;

begin
	if t > 0 then 
	begin
		l := l/6;
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u-pi, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u-pi, t-1);
		Draw2(x, y, l, u-pi/2, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u+pi/2, t-1);
		Draw2(x, y, l, u, t-1);
	end
	else 
		Line(Round(x), Round(y), Round(x + cos(u)*l), Round(y - sin(u)*l))
end;

begin
	gd := Detect;
	InitGraph(gd, gm, 'c:\bp\bgi');
	Draw(310, 110, 200, -pi, 2);
	Draw(110, 310, 200, 0, 2);
	Draw(110, 110, 200, -pi/2, 2);
	Draw(310, 310, 200, pi/2, 2);
	ReadKey;
	CloseGraph
end.

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


Кривая Коха с генератором из 32 звеньев Кривая Коха с генератором из 32 звеньев Кривая Коха с генератором из 32 звеньев

...
l := l/8;
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi, t-1);
raw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
...

Используя генератор из 98 двух звеньев, можно получить кривую, изображенную на рисунке ниже.


Кривая Коха с генератором из 98 звеньев Кривая Коха с генератором из 98 звеньев Кривая Коха с генератором из 98 звеньев

...
l := l/14;
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1); {}
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi, t-1);
Draw2(x, y, l, u+pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);{}
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u-pi, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u-pi/2, t-1);
Draw2(x, y, l, u, t-1);
Draw2(x, y, l, u+pi/2, t-1);
Draw2(x, y, l, u, t-1);  
...

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

Ссылки:

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