Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
10.12.2013
Размер:
5.8 Кб
Скачать
(***********************************************)
(* *)
(* Graph Unit Demo *)
(* Copyright (c) 1998 by TMT Development Corp. *)
(* Author: Vadim Bodrov, TMT Development Corp. *)
(* Based on original code by Ryan Jones *)
(* *)
(* Targets: *)
(* MS-DOS 32-bit protected mode *)
(* Win32 application *)
(***********************************************)

uses Crt, Graph;

const
ZInc = 25;
ZOfs = 256;
ZScale = 400;
Sc = 0.7;

type
ABType = record
LSide, RSide: Longint;
end;

Triangle = record
X1, Y1, Z1,
X2, Y2, Z2,
X3, Y3, Z3: Extended;
Color: DWORD;
end;

var
Tris: array [0..100] of Triangle;
Trin, l, i, hn: DWORD;
Ch: Char;
Page: Boolean := false;
Color: DWORD;

procedure ChangePage;
begin
if Page then begin
SetActivePage(0);
SetVisualPage(1,true);
Page:=false;
end else begin
SetActivePage(1);
SetVisualPage(0,true);
Page:=true;
end;
ClearPage;
OutTextXY(500, 468, 'Fractal-3D demo');
end;

procedure AddTris(i: DWORD);
var
OX1, OY1, OZ1,
OX2, OY2, OZ2,
OX3, OY3, OZ3: Extended;
OC: DWORD;
begin
with Tris[i] do begin
OX1 := X1; OY1 := Y1; OZ1 := Z1;
OX2 := X2; OY2 := Y2; OZ2 := Z2;
OX3 := X3; OY3 := Y3; OZ3 := Z3;
OC := Color + 24;
end;
with Tris[Trin] do begin
X1 := OX1;
Y1 := OY1;
Z1 := OZ1 + ZInc;
X2 := OX1 * 2 / 3 + OX2 / 3;
Y2 := OY1 * 2 / 3 + OY2 / 3;
Z2 := OZ2 + ZInc;
X3 := OX1 * 2 / 3 + OX3 / 3;
Y3 := OY1 * 2 / 3 + OY3 / 3;
Z3 := OZ3 + ZInc;
Color := OC;
end;
with Tris[Trin+1] do begin
X1 := OX2 * 2 / 3 + OX1 / 3;
Y1 := OY2 * 2 / 3 + OY1 / 3;
Z1 := OZ1 + ZInc;
X2 := OX2;
Y2 := OY2;
Z2 := OZ2 + ZInc;
X3 := OX2 * 2 / 3 + OX3 / 3;
Y3 := OY2 * 2 / 3 + OY3 / 3;
Z3 := OZ3 + ZInc;
Color := OC;
end;
with Tris[Trin+2] do begin
X1 := OX3 * 2 / 3 + OX1 / 3;
Y1 := OY3 * 2 / 3 + OY1 / 3;
Z1 := OZ1 + ZInc;
X2 := OX3 * 2 / 3 + OX2 / 3;
Y2 := OY3 * 2 / 3 + OY2 / 3;
Z2 := OZ2 + ZInc;
X3 := OX3;
Y3 := OY3;
Z3 := OZ3 + ZInc;
Color := OC;
end;
inc(Trin, 3);
end;

procedure DrawTris;
var SX1, SY1, SX2, SY2, SX3, SY3, i: DWORD;
begin
i := 0;
repeat
with Tris[i] do begin
SX1 := Round((ZScale * X1) / (Z1 - ZOfs));
SY1 := Round((ZScale * Y1) / (Z1 - ZOfs));
SX2 := Round((ZScale * X2) / (Z2 - ZOfs));
SY2 := Round((ZScale * Y2) / (Z2 - ZOfs));
SX3 := Round((ZScale * X3) / (Z3 - ZOfs));
SY3 := Round((ZScale * Y3) / (Z3 - ZOfs));
SetFillColor(Color);
FillTriangle(320 + SX1, 200 + SY1, 320 + SX2, 200 + SY2, 320 + SX3, 200 + SY3);
end;
inc(i);
until i = Trin;
ChangePage;
end;

procedure Rotate(var X,Y: Extended; Ang: Extended);
var XX, YY: Extended;
begin
XX := X * Cos(Ang / 180 * pi) + Y * Sin(Ang / 180 * pi);
YY := Y * Cos(Ang / 180 * pi) - X * Sin(Ang / 180 * pi);
X := XX;
Y := YY;
end;

procedure RotateTris(Ang: Extended);
var i: DWORD;
begin
i := 0;
repeat
with Tris[i] do begin
Rotate(X1, Z1, Ang);
Rotate(X2, Z2, Ang);
Rotate(X3, Z3, Ang);
end;
inc(i);
until i = Trin;
end;

procedure RotateTrisb(Ang: Extended);
var i: DWORD;
begin
i := 0;
repeat
with Tris[i] do begin
Rotate(X1, Y1, Ang);
Rotate(X2, Y2, Ang);
Rotate(X3, Y3, Ang);
end;
inc(i);
until i = Trin;
end;

procedure RotateTrisc(Ang: Extended);
var i: DWORD;
begin
i := 0;
repeat
with Tris[i] do begin
Rotate(Y1, Z1, Ang);
Rotate(Y2, Z2, Ang);
Rotate(Y3, Z3, Ang);
end;
inc(i);
until i = Trin;
end;

procedure ExpandTris;
const
Scd = 0.95;
var
i: DWORD;
begin
i := 0;
repeat
with Tris[i] do begin
X1 := X1 * Scd;
Y1 := Y1 * Scd;
X2 := X2 * Scd;
Y2 := Y2 * Scd;
X3 := X3 * Scd;
Y3 := Y3 * Scd;
end;
inc(i);
until i = Trin;
end;

begin
SetSVGAMode(640, 480, 8, LfbOrBanked);
OutTextXY(270, 230, 'Please wait...');
for i := 1 to 254 do
SetRGBPalette(i, i div 3 + 25, 2, i div 3 + 30);
SetRGBPalette(255, 63, 63, 63);
SetColor(255);
DrawBorder := false;
with Tris[0] do begin
X1 := 0; Y1 := 86; Z1 := 0;
X2 := 100; Y2 := -86; Z2 := 0;
X3 := -100; Y3 := -86; Z3 := 0;
X1 := X1 * Sc; Y1 := Y1 * Sc; Z1 := Z1 * Sc;
X2 := X2 * Sc; Y2 := Y2 * Sc; Z2 := Z2 * Sc;
X3 := X3 * Sc; Y3 := Y3 * Sc; Z3 := Z3 * Sc;
Color := 24;
end;
Trin := 1;
l := 3;
repeat
i := 0;
hn := Trin;
repeat
AddTris(i);
inc(i);
until i = hn;
dec(l);
until l = 0;
Tris[0].Color := 24;

repeat // main loop
i := 0;
repeat
DrawTris;
RotateTris(4);
inc(i);
until (KeyPressed) or (i = 45);
i := 0;
repeat
DrawTris;
RotateTrisb(4);
inc(i);
until (KeyPressed) or (i = 45);
i := 0;
repeat
DrawTris;
RotateTrisc(4);
inc(i);
until (KeyPressed) or (i = 45);
until KeyPressed;
repeat
Ch := ReadKey
until not KeyPressed;
i := 100;
repeat // outro
DrawTris;
ExpandTris;
RotateTris(4);
RotateTrisb(4);
RotateTrisc(4);
dec(i);
until (i = 0) or (KeyPressed);
if KeyPressed then
repeat
Ch:=ReadKey
until not KeyPressed;
RestoreCrtMode;
end.
Соседние файлы в папке GRAPH