Loading AI tools
З Вікіпедії, вільної енциклопедії
Крива дракона — приклад системи ітераційних функцій, загальна назва для деяких фрактальних кривих, які можуть бути апроксимовані рекурсивними методами, такими як L-система[en].
Дракон Хартера, також відомий як дракон Хартера — Хейтуея, був вперше досліджений фізиками NASA. Він був описаний в 1967 році Мартіном Гарднером в колонці «Математичні ігри» журналу «Scientific American». Багато властивостей фрактала були описані Чандлерльдом Девісом[en] і Дональдом Кнутом.
Фрактал може бути записаний як L-система[en] з параметрами:
Це може бути описано так: Починаючи з базового сегмента, замінити кожен сегмент двома сегментами з прямим кутом і з обертанням на 45°, альтернативно, праворуч і ліворуч:
Крім того, фрактал може бути описаний системою ітераційних функцій на комплексній площині:
з початковим набором пунктів.
Використання натомість пар дійсних чисел ілюструють дві функції:
Це подання найчастіше використовується у програмах, таких як Apophysis.
При трасуванні ітерації кривої дракона від одного кінця до іншого, один стикається з низкою витків 90 градусів. Протягом перших декількох ітерацій послідовність праворуч (R) і ліворуч (L) виявляється таким чином:
Ця схема говорить про те, що кожна ітерація формується шляхом прийняття попередньої ітерації, додавання R в кінці, а потім ретроградного повороту з оригінальної ітерації, заміняти кожну букву і додавати результат після R.
Ця модель, у свою чергу, передбачає такий метод створення моделей ітерацій кривої дракона по складанню смужки паперу. Візьміть смужку паперу і складіть її навпіл з правого боку. Складіть її навпіл і знову праворуч. Якщо смуга була відкрита зараз, розгинайте кожну складку, щоб отримати 90-градусний поворот, послідовність черги буде RRL тобто другої ітерації дракона. Складіть смужку навпіл і знову праворуч, і наступна послідовність розкладеної смуги тепер RRLRRLL — третьої ітерації дракона. Продовжуючи складання смуги наполовину вправо, будуть створюватися додаткові ітерації дракона (на практиці, смуга стає занадто товстою, щоб різко скинути після чотирьох або п'яти ітерацій).
Ця модель також дає метод для визначення напрямку -го повороту послідовності дракона. По-перше, виразити у вигляді , де — це непарне число. Напрямок у свою чергу, визначається тобто залишок наліво, коли ділиться на 4. Якщо , то -й елемент у черзі є R; якщо , то -й елемент у черзі є L.
Наприклад, щоб визначити напрямок повороту 76376:
Існує простий однолінійной нерекурсивний метод реалізації наведеного вище методу знаходження напрямку повороту в коді. Обчислення повороту у вигляді двійкового числа, обчислюється наступним логічним значенням:
Інший спосіб обробки — зменшення за нижчезазначеним алгоритмом. Використання коду Грея, починаючи з нуля, визначає зміну до наступного значення. Якщо зміна 1, то повернути наліво, і якщо він дорівнює 0, то повернути праворуч. Враховуючи дискретний вхід, B, відповідний код Грея, G, дається «G = B XOR (B>>1)». Використання Gi та Gi−1, поворот дорівнює «(не Gi), а Gi−1».
Насправді він може бути знайдений аналітично[2]:
У цьому корінь рівняння
Twindragon (також відомий як дракон Девіс-Кнута) може бути побудований шляхом розміщення двох кривих дракона спина до спини. Ця система функцій може мати також безліч повторів:
де вихідна форма визначається наступним набором.
Це також можна записати у вигляді L-системи — достатньо лише додати ще один розділ в початковому рядку:
Terdragon може бути записаний у вигляді системи:
Ця система функцій може мати безліч повторів:
де :
Також відома як дракон Леві[3].
<?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);
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;
from turtle import *
def go_drakoning(t, length, depth, sign = 1):
if depth == 1:
t.forward(length)
else:
t.left(45*sign)
go_drakoning(t, length/2**0.5, depth - 1, 1)
t.right(90*sign)
go_drakoning(t, length/2**0.5, depth - 1, -1)
t.left(45*sign)
t = Turtle()
t.color("blue")
go_drakoning(t, 100, 9)
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; PaintBox1: TPaintBox; procedure Button1Click(Sender: TObject); procedure Paint(x1,y1,x2,y2,k:Longint); private { Private declarations } public n: integer { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Paint(x1,y1,x2,y2,k:Longint); var tx,ty:Longint; begin if n=1 then begin PaintBox1.Canvas.Pen.Color:=clRed; end else begin PaintBox1.Canvas.Pen.Color:=clRed; end; if k=0 then begin PaintBox1.Canvas.MoveTo(x1,y1); PaintBox1.Canvas.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; procedure TForm1.Button1Click(Sender: TObject); Var x1,y1,x2,y2,k: Integer; begin PaintBox1.Width := 1000; PaintBox1.Height:= 650; PaintBox1.Canvas.Brush.Color := clWhite; PaintBox1.Canvas.Rectangle(0,0,PaintBox1.width,PaintBox1.height); x1 := 200; y1 := 200; x2 := 500; y2 := 500; k := 24; Paint(x1,y1,x2,y2,k); end; end.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.