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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Дракон Хартера — Хейтуэя

Кривая дракона — Пример системы итерируемых функций, общее название для некоторых фрактальных кривых, которые могут быть аппроксимированы рекурсивными методами, такими как L-системы.

Дракон Хартера — Хейтуэя[править | править исходный текст]

Дракон Хартера, также известный как дракон Хартера — Хейтуэя, был впервые исследован физиками NASA — John Heighway, Bruce Banks, и William Harter. Он был описан в 1967 году Мартином Гарднером (Martin Gardner) в колонке «Математические игры» журнала «Scientific American». Многие свойства фрактала были описаны Chandler Davis и Дональдом Кнутом.

«Дракон Хартера — Хейтуэя» с числом итераций от 1 до 23

Фрактал может быть записан как L-система с параметрами:

  • угол равен 90°
  • начальная строка — FX
  • правила преобразования строк:
    • X \mapsto X+YF+
    • Y \mapsto -FX-Y

Кроме того, фрактал может быть описан системой итерируемых функций на комплексной плоскости:

f_1(z)=\frac{(1+i)z}{2}
f_2(z)=1-\frac{(1-i)z}{2}.


Берём отрезок, сгибаем его пополам. Затем многократно повторяем итерацию. Если после этого снова разогнуть получившуюся (сложенную) линию так, чтобы все углы были равны 90°, мы получим драконову ломаную.


Пример алгоритма на PHP[править | править исходный текст]

<?php
        $i = 20;
 
        $image = imagecreatetruecolor(640, 480);
        imagefilledrectangle($image, 0, 0, imagesx($image) - 1, imagesy($image) - 1,
                imagecolorresolve($image, 255, 255, 255));
        $color = imagecolorresolve($image, 0, 0, 0);
 
        drawDragon($image, imagesx($image) * 3/8, imagesy($image) * 3/8,
                imagesx($image) * 5/8, imagesy($image) * 5/8, $i, $color);
 
        /**
         * Draws dragon curve between two points.
         * @return void
         */
        function drawDragon($image, $xa, $ya, $xc, $yc, $i, $color) {
            if($i == 0)
                imageline($image, $xa, $ya, $xc, $yc, $color);
            else {
                // A---B
                //     |
                //     C
                $xb = ($xa + $xc) / 2 + ($yc - $ya) / 2;
                $yb = ($ya + $yc) / 2 - ($xc - $xa) / 2;
                drawDragon($image, $xa, $ya, $xb, $yb, $i - 1, $color);
                drawDragon($image, $xc, $yc, $xb, $yb, $i - 1, $color);
            } 
        }
 
        header('Content-type: image/png');
        imagepng($image);
        imagedestroy($image);

Пример алгоритма на Delphi (VCL)[править | править исходный текст]

procedure Dragon(x1,y1,x2,y2,Depth:Longint;canv:TCanvas);
  procedure Paint(x1,y1,x2,y2,k:Longint);
  var tx,ty:Longint;
  begin
   if k=0 then
    begin
     canv.MoveTo(x1,y1);
     canv.LineTo(x2,y2);
     Exit;
    end;
   tx:=(x1+x2) div 2+(y2-y1) div 2;
   ty:=(y1+y2) div 2-(x2-x1) div 2;
   Paint(x2,y2,tx,ty,k-1);
   Paint(x1,y1,tx,ty,k-1);
  end;
begin
 Paint(x1,y1,x2,y2,Depth);
end;

Ссылки[править | править исходный текст]