Тема: Fractal Tree
Этот пример рисует фрактальное дерево в окно.
Нажимайте клавишу ENTER, чтобы сгенерировать новое дерево.
Исходный код:
program FractalTree;
uses
KolibriOS;
const
WINDOW_BORDER_SIZE = 5;
KEY_CODE_ENTER = #13;
var
WndLeft, WndTop: LongInt;
WndHeight, WndWidth: LongWord;
function Sin(Value: Extended): Extended;
asm
FLD Value
FSIN
FWAIT
end;
function Cos(Value: Extended): Extended;
asm
FLD Value
FCOS
FWAIT
end;
function Round(Value: Extended): Int64;
asm
FLD Value
SUB ESP, 8
FISTP qword ptr [ESP]
FWAIT
POP EAX
POP EDX
end;
procedure BoldLine(X1, Y1, X2, Y2: LongInt; Color: LongWord);
begin
DrawLine(X1, Y1, X2, Y2, Color);
DrawLine(X1 + 1, Y1, X2 + 1, Y2, Color);
DrawLine(X1 - 1, Y1, X2 - 1, Y2, Color);
DrawLine(X1, Y1 + 1, X2, Y2 + 1, Color);
DrawLine(X1, Y1 - 1, X2, Y2 - 1, Color);
end;
procedure Tree(X, Y, Size: LongInt; Angle: Extended);
Var
X2, Y2: LongInt;
Color: LongWord;
begin
case Size of
0..2: Color := $FFFF00;
3..4: Color := $00FF00;
5..8: Color := $808000;
9..16: Color := $008000;
17..32: Color := $2c5400;
else
Color := $562a00;
end;
X2 := Round(X + Size * Sin(Angle));
Y2 := Round(Y + Size * Cos(Angle));
if Size < 8 then
DrawLine(X, Y, X2, Y2, Color)
else
BoldLine(X, Y, X2, Y2, Color);
if Size > 0 then
begin
Tree(X2, Y2, Size * 3 div 4, Angle + Pi / 5 / (Random + 1));
Tree(X2, Y2, Size * 3 div 4, Angle - Pi / 5 / (Random + 1));
end
end;
procedure On_Redraw;
begin
BeginDraw;
DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'FractalTree; Press key ENTER to generate new Tree', $00A0A0A0,
WS_SKINNED_FIXED + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
Randomize;
Tree(WndWidth div 2, WndHeight - WINDOW_BORDER_SIZE - GetSkinHeight, WndHeight div 4, Pi);
EndDraw;
end;
begin
with GetScreenSize do
begin
WndHeight := Height div 2;
WndWidth := Width div 2;
WndLeft := (Width - WndWidth) div 2;
WndTop := (Height - WndHeight) div 2;
end;
while True do
case WaitEvent of
REDRAW_EVENT:
On_Redraw;
KEY_EVENT:
if GetKey.Code = KEY_CODE_ENTER then
On_Redraw;
BUTTON_EVENT:
Break;
end;
end.
Раньше я уже делал рисование других фрактальных деревьев вот в этой теме, но там на ассемблере.
Также прикладываю уже готовое приложение FractalTree.kex