Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
22780_ПОБУДОВА ФРАКТАЛЬНИХ ЗОБРАЖЕНЬ.doc
Скачиваний:
57
Добавлен:
14.02.2016
Размер:
2.91 Mб
Скачать

Побудова графічного зображення кривої Коха

Криву Коха можна побудувати за допомогою такої програми:

Program Koch;

Uses CRT, Graph;

Var

gd,gm : Integer;

Const

iter = 50000;

Procedure draw;

Var

t, x, y, p : Real;

k : LongInt;

mx, my, rad : Integer;

Begin

mx := 10;

my := 250;

rad :=600;

Randomize;

x := 0.0;

y := 0.0;

For k := 1 To iter Do Begin

p := Random;

t := x;

If p <= 1/2 Then Begin

x := 1/2 * x + 1/(2*sqrt(3)) * y;

y := 1/(2*sqrt(3)) * t - 1/2 * y;

End

Else

Begin

x := 1/2 * x - 1/(2*sqrt(3)) * y +1/2;

y := -1/(2*sqrt(3)) * t - 1/2 * y + 1/(2*sqrt(3));

End;

PutPixel(mx + Round(rad * x), my - Round(rad * y), 2);

End;

End;

End.

Крива Гільберта

Крива Гільберта складається з чотирьох з’єднананих прямими елементів: a, b, c, d.

Кожен елемент , будує відповідна процедура. Потрібно звернути увагу на наступні особливості реалізації програми.

Процедура, яка малює елемент а, крім самої себе (для малювання кривої а

меншого порядку) викликає процедури d і b, текст яких в програмі знаходитьсяя після процедури а.

Щоб компілятор не вивів звістку про помилку, в текст програми записане об'явлення процедури з ключовим словом forward, яке означає,що це тільки об’ява, а реалізація знаходиться далі.Таким чином в процесі компіляції процедури а, компілятор "знає", що імена b і d означають процедури.

Кожен елемент строїть відповідна процедура:

procedure a1(i:integer; canvas: TCanvas); forward;

procedure b(i:integer; canvas: TCanvas); forward;

procedure c(i:integer; canvas: TCanvas); forward;

procedure d(i:integer; canvas: TCanvas); forward;

Побудова:

var

p: integer = 5; // порядок кривої

u: integer = 7; // довжина штриха

Елементи кривої

procedure a(i: integer; canvas: TCanvas); forward;

procedure b(i: integer; canvas: TCanvas); forward;

procedure с(i: integer; canvas: TCanvas); forward;

procedure d(i: integer; canvas: TCanvas); forward;

procedure a(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

d(i - l, canvas);

canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);

a(i - l, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);

a(i - l, canvas);

canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);

с(i - 1, canvas);

end;

end;

procedure b(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

c(i - l, canvas);

canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);

b(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);

b(i - l, canvas);

canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);

d(i - l, canvas);

end;

end;

procedure c(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

b(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);

с(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);

c(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);

a(i - 1, canvas);

end;

end;

procedure d(i: integer; canvas: TCanvas);

begin

if i > 0 then

begin

a(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);

d(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);

d(i - 1, canvas);

canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);

b(i - 1, canvas);

end;

end;

Намалювати Криву Гільберта

procedure TForml.FormPaint(Sender: TObject);

begin

Form1.Canvas.MoveTo(u, u);

a(5, Form1.Canvas);

end;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]