logo search
Лекция Фрактальная графика

4.3. Драконова ломаная

Драконова ломаная относится к классу самоподобных рекурсивно порождаемых геометрических структур. Ломаная нулевого порядка представляет собой просто прямой угол. Изображение фигуры каждого следующего порядка строится путем рекурсивных замен каждого из отрезков фигуры младшего порядка на два отрезка, сложенных также в виде прямого угла.

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

Предположим, что угол в каждом сгибе один и тот же. Обозначим этот угол через . Заметим, что на каждой вкладке мы поварачиваем либо влево либо вправо. Поэтому введём параметр , который принимает значение 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

}