![]() |
Матрица статей Список статей Всячина Контакты | ||||||||||||
|
Фракталы и системы счисления
Некоторые фрактальные кривые можно строить следующим образом. Пусть необходимо постоить
предфрактал порядка
Рассмотрим кривую Коха. Воспользуемся системой счисления по основанию 4.
Определим функцию
Ниже приведена программа построения кривой Коха с использованием данного алгоритма. program Koch; uses CRT, Graph; const p = 4; var gd, gm: Integer; i: Integer; x, y, l: Real; a: Real; n, m, k: Integer; begin gd := Detect; InitGraph(gd, gm, 'c:\bp\bgi'); x := 0; y := 400; l := 640 / (exp(p*ln(3))); MoveTo(Round(x), Round(y)); for i := 0 to Round(exp(p*ln(4)))-1 do begin a := 0; n := i; k := 0; repeat m := n mod 4; n:=n div 4; case m of 0: a := a + 0; 1: a := a - pi/3; 2: a := a + pi/3; 3: a := a + 0; end; inc(k); until k >= p; x := x + l*cos(a); y := y + l*sin(a); LineTo(Round(x), Round(y)); end; ReadKey; CloseGraph; end.
Рассмотрим построение обобщения
кривой Коха с восьмизвенным генератором.
Для этого воспользуемся восьмеричной системой счисления и функцию
program Koch10; uses CRT, Graph; const p = 4; var gd, gm: Integer; i: Integer; x, y, l: Real; a: Real; n, m, k: 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; k := 0; 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; inc(k); until k >= p; x := x + l*cos(a); y := y + l*sin(a); LineTo(Round(x), Round(y)); end; ReadKey; CloseGraph; end.
Для построения кривой Леви воспользуется двоичной системой счисления, program Levy; uses CRT, Graph; const p = 12; var gd, gm: Integer; i: Integer; x, y, l: Real; a: Real; n, m, k: Integer; begin gd := Detect; InitGraph(gd, gm, 'c:\bp\bgi'); x := 300; y := 240; l := 3; MoveTo(Round(x), Round(y)); for i := 0 to Round(exp(p*ln(2)))-1 do begin a := 0; n := i; m := 0; k := 0; repeat m := n mod 2; n := n div 2; case m of 0: a := a+pi/4; 1: a := a-pi/4 end; inc(k); until k >= p; x := x + l*cos(a); y := y + l*sin(a); LineTo(Round(x), Round(y)); end; ReadKey; CloseGraph; end. Смотрите также: Ссылки:
|