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

Кривая дракона

Проделаем следующее: сложим полоску бумаги поперёк вдвое. Повторим это пару раз. После развертывания получим полоску, состоящую из восьми кусков. Посмотрев на эту полоску в профиль, мы увидим ломаную линию. Этот эксперимент можно продолжать и дальше, но не очень долго, из-за конечной толщины бумаги.


Кривая дракона

Предположим, что угол в каждом сгибе один и тот же. Обозначим этот угол через . Заметим, что на каждой вкладке мы поварачиваем либо влево либо вправо. Поэтому введём параметр , который принимает значение 1 когда мы поварачиваем влево и -1, когда вправо. Имеем:

Тогда
Следовательно, имеет следующие правила:

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

На рисунке ниже приведена ломаная с .


Кривая дракона

А если положить , то получим дракон Хартера-Хейтуэя.


Кривая дракона

Можно также немного закруглять углы.


Кривая дракона

program Dragon;

uses Graph, Crt;

const
	c = 1024*16;
	d = 3;
	da =pi/2;
var
	i : Integer;
	gd, gm : Integer;
	a, x, y : Real;
	
procedure Lineto1(x, y, l, u : Real);

begin
	Line(Round(x), Round(y), Round(x + l*cos(u)),
		Round(y - l*sin(u)));
end;

function Opra(n : Integer) : Integer;

label
	nach;
var
	j : Integer;
begin
	j := n;
	nach:
	if (j - 1) mod 4 = 0 then 
		Opra := -1
	else if (j-3) mod 4 = 0 
		then Opra := 1
	else 
	begin
		j:=j div 2;
		goto nach;
	end;
end;

begin
	gd := Detect;
	InitGraph(gd,gm,'e:\bp\bgi');
	x := 150;
	y := 150;
	a := pi/2;
	for i := 1 to c + 1 do 
	begin
		Lineto1(x,y,d,a);
		x := x + d*cos(a);
		y := y - d*sin(a);
		a := a - da*Opra(i);
	end;
	ReadKey;
	CloseGraph;
end.

Рассмотрим ещё один способ генерации последовательности . Но при этом (для удобства) мы будем использовать не 1 и -1, а 1 и 0. Пусть 1 отвечает за поворот влево, а 0 — за поворот вправо. Кривую первого порядка обозначим 1. Для кривых более высокого порядка добавляем единицу в конце, затем предшествующую ей строку цифр копируем в конец, а среднюю цифру меняем. Например, для кривой второго порядка , для кривой третьего порядка: . Продолжая далее получим: .

Для построения дракона Хартера-Хейтуэя с помощью IFS, используются следущие преобразования:

Dragon_2 {
 0.5 -0.5 0.5  0.5 0    0   0.5
-0.5 -0.5 0.5 -0.5 1.5 -0.5 0.5
}


Кривая дракона

Если два одинаковых дракона Хартера-Хейтуэя состыковать так, чтобы один был повернут относительно другого на и между ними не было пробелов, то получится фигура, называемая двойным драконом.


Двойной дракон

Dragon_3 {
 0.5 -0.5  0.5  0.5 0   0   0.5
-0.5  0.5 -0.5 -0.5 1.5 0.5 0.5
}

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

Ссылки: