-
Notifications
You must be signed in to change notification settings - Fork 1
/
VERTICES.PAS
114 lines (91 loc) · 3 KB
/
VERTICES.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
{ Unidad VERTICES.PAS }
unit Vertices;
interface
{ tablas trigonom‚tricas }
var Seno, Coseno : array[0..359] of double; { Tablas trigonom‚tricas }
procedure GeneraTablas;
{ Tipo V‚rtice }
type TVertice = record
x, y, z : double; { Coordenadas del v‚rtice }
x2d, y2d : integer; { Coordenadas de la proyecci¢n en 2D }
end;
procedure VerticeCalcula2D(var v : TVertice; cx, cy, cz : double);
procedure VerticeRota(var v : TVertice; ax, ay, az : integer);
procedure VerticeNormaliza(var v : TVertice);
procedure VerticeEscala(var v : TVertice; sx, sy, sz : double);
implementation
{ El siguiente procedimiento genera las tablas trigonom‚tricas }
procedure GeneraTablas;
var a : integer;
begin
for a := 0 to 359 do
begin
Seno[a] := sin(a * Pi / 180.0);
Coseno[a] := cos(a * Pi / 180.0);
end;
end;
{ Procedimientos de los v‚rtices }
{ Este procedimiento calcula la proyecci¢n a 2D de un v‚rtice }
procedure VerticeCalcula2D(var v : TVertice; cx, cy, cz : double);
var h,p : double;
begin
{ Zdist es la coordenada Z del origen del objeto tridimensional }
h := 00.0;
p:=1024.0;
v.x2d := round((((v.x+cx)*p)/(p-cz-v.z))/2) + 160;
v.y2d := round((((v.y+cy-h)*p)/((p-cz-v.z)+h))/2) + 100 ;
end;
{ Este procedimiento rota un v‚rtice sobre cualquier eje }
procedure VerticeRota(var v : TVertice; ax, ay, az : integer);
var nx, ny, nz : double;
begin
{ Aseguramos que los ngulos sean positivos (entre 0 y 359) }
if ax < 0 then inc(ax, 360);
if ay < 0 then inc(ay, 360);
if az < 0 then inc(az, 360);
{ Rotaci¢n sobre el eje X }
if ax <> 0 then
begin
ny := v.y * Coseno[ax] - v.z * Seno[ax];
nz := v.y * Seno[ax] + v.z * Coseno[ax];
v.y := ny;
v.z := nz;
end;
{ Rotaci¢n sobre el eje Y }
if ay <> 0 then
begin
nx := v.x * Coseno[ay] - v.z * Seno[ay];
nz := v.x * Seno[ay] + v.z * Coseno[ay];
v.x := nx;
v.z := nz;
end;
{ Rotaci¢n sobre el eje Z }
if az <> 0 then
begin
nx := v.x * Coseno[az] - v.y * Seno[az];
ny := v.x * Seno[az] + v.y * Coseno[az];
v.x := nx;
v.y := ny;
end;
end;
{ Este procedimiento normaliza un vector }
procedure VerticeNormaliza(var v : TVertice);
var mag : double; { magnitud }
begin
mag := sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
if mag = 0.0 then exit;
mag := 1.0 / mag; { obtenemos el inverso de la magnitud }
v.x := v.x * mag; { porque es m s r pido multiplicar }
v.y := v.y * mag; { que dividir }
v.z := v.z * mag;
end;
{ Procedimiento que escala un vector }
procedure VerticeEscala(var v : TVertice; sx, sy, sz : double);
begin
v.x := v.x * sx;
v.y := v.y * sy;
v.z := v.z * sz;
end;
begin
GeneraTablas; { Inicializaci¢n }
end.