-
Notifications
You must be signed in to change notification settings - Fork 0
/
Cube.pas
124 lines (108 loc) · 3.94 KB
/
Cube.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{********************************
Autor: Dumitru Uzun (DUzun)
Data: 25.05.2009
********************************}
Unit Cube;
interface
USES CRT, Graph, UFig, UCalcVec, UCalc3D;
CONST Unu = 5;
VAR GD, GM : integer; {Pentru initierea modului grafic}
MidX, MidY : word; {Mijlocul ecranului}
Reper : TReper; {Reperul figurii}
V : TVector;
alfa : Integer;
ax : Byte; {Axa de rotatie}
Rel : Boolean;
{---------------------------------------------------------------}
PROCEDURE InitFiguri; {Initializarea valorilor}
PROCEDURE Moves; {Efectuarea transformarilor si desenarea}
PROCEDURE Help;
FUNCTION Taste(Key: char): Char;
{---------------------------------------------------------------}
implementation
{---------------------------------------------------------------}
PROCEDURE Help;
BEGIN
writeln(['Copyright (C) 2009. Dumitru Uzun (DUzun)'#10]);
Writeln(['Deplasare: <Sus>, <Jos>, <Dreapta>, <Stanga>, <+>, <->']);
Writeln(['Deplasare: <8>, <2>, <6>, <4>, <5>, <0>']);
Writeln(['Directie rotire: <X>, <Y>, <Z>']);
Writeln(['Viteza rotire: <,>, <.>, <Spatiu>']);
Writeln(['Tip proiectie: <C>entrala, <P>aralela']);
Writeln(['Iesire: <Esc>']);
readkey;
END;
{---------------------------------------------------------------}
FUNCTION Taste(Key: Char): Char;
BEGIN
Key := UpCase(Key);
case Key of
'X'..'Z': {'X': ax := 1; 'Y': ax := 2; 'Z': ax := 3;}
BEGIN
ax := ord(UpCase(Key))-ord('X')+1;
if (alfa = 0) then inc(alfa);
END;
',': dec(alfa);
'.': inc(alfa);
' ': alfa := 0;
'8': Reper[0][2] := Reper[0][2]+Unu; {Up}
'2': Reper[0][2] := Reper[0][2]-Unu; {Down}
'6': Reper[0][1] := Reper[0][1]+Unu; {Right}
'4': Reper[0][1] := Reper[0][1]-Unu; {Left}
'5': Reper[2][2] := Reper[2][2]+Unu;
'0': Reper[2][2] := Reper[2][2]-Unu;
'-': Reper[0][3] := Reper[0][3]+Unu*5; {-}
'+': Reper[0][3] := Reper[0][3]-Unu*5; {+}
'R': Rel := not Rel;
'F': inc(ActiveFig);
#27: Halt(0);
END;
Taste := Key;
END;
{---------------------------------------------------------------}
PROCEDURE InitFiguri;
BEGIN
GD := Detect;
InitGraph(GD, GM, '');
IF (GraphResult <> 0) THEN
BEGIN
Writeln(['Erroare initializare modul grafic!']);
ReadKey;
Halt(1);
END;
// Help;
{Setari ale modului grafic}
SetBkColor(BLACK);
SetColor(GREEN);
SetFillColor(GREEN);
ClearViewPort;
alfa := 1; {Viteza de rotire in grade}
ax := Ax_Y; {axa de rotire: 1 - Ox, 2 - Oy, 3 - Oz}
Rel := false; {Rotirea este relativa sau absoluta}
// Depth := (MidX + MidY) div 2; {Distanta pana la centrul de proiectie}
{Pozitionarea reperului Reper}
Reper[0] := VecZero;
VecParal(Reper[1], VecI, 10);
VecParal(Reper[2], VecJ, 10);
VecParal(Reper[3], VecK, 10);
RotSis(Reper, r(30), Ax_X);
Moves;
END;
{---------------------------------------------------------------}
PROCEDURE Moves; {Efectuarea transformarilor si desenarea}
BEGIN
{Mijlocul ecranului}
MidX := GetMaxX div 2;
MidY := GetMaxY div 2;
RazaFig := (MidX + MidY) div 50;
if Rel then RotSisRel(Reper, r(alfa), ax) {Rotirea fata de axele de coordonate}
else RotSis (Reper, r(alfa), ax); {Rotirea fata relativa, fata de figura}
ClearViewPort;
DrowFig(Reper); {Procedura de desenare a figurei}
VecParal(V, Reper[1], RazaFig); AddVec(V, Reper[0], V); Line2D(Reper[0], V);
VecParal(V, Reper[2], RazaFig); AddVec(V, Reper[0], V); Line2D(Reper[0], V);
VecParal(V, Reper[3], RazaFig); AddVec(V, Reper[0], V); Line2D(Reper[0], V);
END;
{---------------------------------------------------------------}
BEGIN
END.