![]() |
Матрица статей Список статей Всячина Контакты | ||||||||||||
|
Обобщения кривой Коха
Инициатором является отрезок единичной длины, а генератором является довольно сложная структура из восьми отрезков.
Первые шаги построения кривой:
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. При написании приведенной выше программы использовался код, предоставленный Аслановым А. М. Используя генератор из восемнадцати звеньев, можно получить кривую, изображённую на рисунке ниже.
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. Используя генератор из тридцати двух звеньев, можно получить кривую, изображенную на рисунке ниже.
... 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 двух звеньев, можно получить кривую, изображенную на рисунке ниже.
...
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);
...
Смотрите также: Ссылки:
|