9 void Add(Vector3D vector1, Vector3D vector2)
11 x = vector1.x + vector2.x;
12 y = vector1.y + vector2.y;
13 z = vector1.z + vector2.z;
16 void Subtract(Vector3D vector1, Vector3D vector2)
18 x = vector1.x - vector2.x;
19 y = vector1.y - vector2.y;
20 z = vector1.z - vector2.z;
23 void Scale(Vector3D vector1, double s)
30 double DotProduct(Vector3D vector2)
32 return x * vector2.x + y * vector2.y + z * vector2.z;
35 double DotProductf(Vector3Df vector2)
37 return x * vector2.x + y * vector2.y + z * vector2.z;
40 void CrossProduct(Vector3D vector1, Vector3D vector2)
42 x = vector1.y * vector2.z - vector1.z * vector2.y;
43 y = vector1.z * vector2.x - vector1.x * vector2.z;
44 z = vector1.x * vector2.y - vector1.y * vector2.x;
47 void Normalize(Vector3D source)
49 double m = source.length;
60 void MultMatrix(Vector3D source, Matrix matrix)
62 x = source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0];
63 y = source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1];
64 z = source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2];
67 void MultMatrixf(Vector3Df source, Matrix matrix)
69 x = source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0];
70 y = source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1];
71 z = source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2];
74 void DivideMatrix(Vector3D source, Matrix matrix)
79 vectorX=sourceX*m00+sourceY*m10+sourceZ*m20+m30,
80 vectorY=sourceZ*m01+sourceY*m11+sourceZ*m21+m31,
81 vectorZ=sourceX*m02+sourceY*m12+sourceZ*m22+m32
82 }, { sourceX, sourceY, sourceZ });
86 matrix.m[2][0] * matrix.m[0][2] * matrix.m[1][1]
87 - matrix.m[0][2] * matrix.m[2][1] * matrix.m[1][0]
88 - matrix.m[2][2] * matrix.m[0][0] * matrix.m[1][1]
89 - matrix.m[0][2] * matrix.m[0][1] * matrix.m[1][0]
90 + matrix.m[2][1] * matrix.m[0][0] * matrix.m[1][2]
91 + matrix.m[0][1] * matrix.m[0][0] * matrix.m[1][2];
94 - matrix.m[2][2] * source.x * matrix.m[1][1]
95 + matrix.m[2][2] * matrix.m[1][0] * source.y
96 - matrix.m[2][2] * matrix.m[1][0] * matrix.m[3][1]
97 + matrix.m[2][2] * matrix.m[3][0] * matrix.m[1][1]
98 - matrix.m[2][0] * matrix.m[3][2] * matrix.m[1][1]
99 + source.x * matrix.m[2][1] * matrix.m[1][2]
100 + source.x * matrix.m[0][1] * matrix.m[1][2]
101 - matrix.m[1][0] * matrix.m[0][1] * source.z
102 + matrix.m[1][0] * matrix.m[2][1] * matrix.m[3][2]
103 + matrix.m[1][0] * matrix.m[0][1] * matrix.m[3][2]
104 - matrix.m[1][0] * matrix.m[2][1] * source.z
105 - matrix.m[3][0] * matrix.m[2][1] * matrix.m[1][2]
106 - matrix.m[2][0] * matrix.m[1][2] * source.y
107 + matrix.m[2][0] * matrix.m[1][2] * matrix.m[3][1]
108 + matrix.m[2][0] * source.z * matrix.m[1][1]
109 - matrix.m[3][0] * matrix.m[0][1] * matrix.m[1][2]
113 - matrix.m[2][0] * matrix.m[0][2] * source.y
114 + matrix.m[2][1] * matrix.m[0][0] * matrix.m[3][2]
115 + matrix.m[2][0] * matrix.m[0][2] * matrix.m[3][1]
116 + matrix.m[0][1] * matrix.m[0][0] * matrix.m[3][2]
117 - matrix.m[2][1] * matrix.m[0][0] * source.z
118 - matrix.m[0][2] * matrix.m[2][1] * matrix.m[3][0]
119 + matrix.m[0][2] * matrix.m[0][1] * source.x
120 - matrix.m[0][2] * matrix.m[0][1] * matrix.m[3][0]
121 + matrix.m[0][2] * matrix.m[2][1] * source.x
122 + matrix.m[2][2] * matrix.m[0][0] * source.y
123 - matrix.m[0][1] * matrix.m[0][0] * source.z
124 - matrix.m[2][2] * matrix.m[0][0] * matrix.m[3][1]
128 source.x * matrix.m[0][2] * matrix.m[1][1]
129 + matrix.m[0][0] * matrix.m[3][2] * matrix.m[1][1]
130 + matrix.m[0][0] * matrix.m[1][2] * source.y
131 - matrix.m[0][0] * matrix.m[1][2] * matrix.m[3][1]
132 - matrix.m[0][0] * source.z * matrix.m[1][1]
133 - matrix.m[1][0] * matrix.m[0][2] * source.y
134 + matrix.m[1][0] * matrix.m[0][2] * matrix.m[3][1]
135 - matrix.m[3][0] * matrix.m[0][2] * matrix.m[1][1]
139 property double length { get { return (double)sqrt(x * x + y * y + z * z); } };
140 property double lengthApprox
144 double ix = Abs(x), iy = Abs(y), iz = Abs(z);
146 if(ix < iy) { tmp = ix; ix = iy; iy = tmp; }
147 if(ix < iz) { tmp = ix; ix = iz; iz = tmp; }
148 if(iz > iy) { iz = iy; }
154 public struct Vector3Df
158 void Add(Vector3Df vector1, Vector3Df vector2)
160 x = vector1.x + vector2.x;
161 y = vector1.y + vector2.y;
162 z = vector1.z + vector2.z;
165 void Subtract(Vector3Df vector1, Vector3Df vector2)
167 x = vector1.x - vector2.x;
168 y = vector1.y - vector2.y;
169 z = vector1.z - vector2.z;
172 void Scale(Vector3Df vector1, float s)
179 double DotProduct(Vector3Df vector2)
181 return (double)x * (double)vector2.x + (double)y * (double)vector2.y + (double)z * (double)vector2.z;
184 void CrossProduct(Vector3Df vector1, Vector3Df vector2)
186 x = vector1.y * vector2.z - vector1.z * vector2.y;
187 y = vector1.z * vector2.x - vector1.x * vector2.z;
188 z = vector1.x * vector2.y - vector1.y * vector2.x;
191 void Normalize(Vector3Df source)
193 float m = source.length;
204 void MultMatrix(Vector3Df source, Matrix matrix)
206 x = (float)(source.x * matrix.m[0][0] + source.y * matrix.m[1][0] + source.z * matrix.m[2][0] + matrix.m[3][0]);
207 y = (float)(source.x * matrix.m[0][1] + source.y * matrix.m[1][1] + source.z * matrix.m[2][1] + matrix.m[3][1]);
208 z = (float)(source.x * matrix.m[0][2] + source.y * matrix.m[1][2] + source.z * matrix.m[2][2] + matrix.m[3][2]);
211 void DivideMatrix(Vector3Df source, Matrix matrix)
216 vectorX=sourceX*m00+sourceY*m10+sourceZ*m20+m30,
217 vectorY=sourceZ*m01+sourceY*m11+sourceZ*m21+m31,
218 vectorZ=sourceX*m02+sourceY*m12+sourceZ*m22+m32
219 }, { sourceX, sourceY, sourceZ });
222 float var1 = (float)(
223 matrix.m[2][0] * matrix.m[0][2] * matrix.m[1][1]
224 - matrix.m[0][2] * matrix.m[2][1] * matrix.m[1][0]
225 - matrix.m[2][2] * matrix.m[0][0] * matrix.m[1][1]
226 - matrix.m[0][2] * matrix.m[0][1] * matrix.m[1][0]
227 + matrix.m[2][1] * matrix.m[0][0] * matrix.m[1][2]
228 + matrix.m[0][1] * matrix.m[0][0] * matrix.m[1][2]);
231 - matrix.m[2][2] * source.x * matrix.m[1][1]
232 + matrix.m[2][2] * matrix.m[1][0] * source.y
233 - matrix.m[2][2] * matrix.m[1][0] * matrix.m[3][1]
234 + matrix.m[2][2] * matrix.m[3][0] * matrix.m[1][1]
235 - matrix.m[2][0] * matrix.m[3][2] * matrix.m[1][1]
236 + source.x * matrix.m[2][1] * matrix.m[1][2]
237 + source.x * matrix.m[0][1] * matrix.m[1][2]
238 - matrix.m[1][0] * matrix.m[0][1] * source.z
239 + matrix.m[1][0] * matrix.m[2][1] * matrix.m[3][2]
240 + matrix.m[1][0] * matrix.m[0][1] * matrix.m[3][2]
241 - matrix.m[1][0] * matrix.m[2][1] * source.z
242 - matrix.m[3][0] * matrix.m[2][1] * matrix.m[1][2]
243 - matrix.m[2][0] * matrix.m[1][2] * source.y
244 + matrix.m[2][0] * matrix.m[1][2] * matrix.m[3][1]
245 + matrix.m[2][0] * source.z * matrix.m[1][1]
246 - matrix.m[3][0] * matrix.m[0][1] * matrix.m[1][2]
250 - matrix.m[2][0] * matrix.m[0][2] * source.y
251 + matrix.m[2][1] * matrix.m[0][0] * matrix.m[3][2]
252 + matrix.m[2][0] * matrix.m[0][2] * matrix.m[3][1]
253 + matrix.m[0][1] * matrix.m[0][0] * matrix.m[3][2]
254 - matrix.m[2][1] * matrix.m[0][0] * source.z
255 - matrix.m[0][2] * matrix.m[2][1] * matrix.m[3][0]
256 + matrix.m[0][2] * matrix.m[0][1] * source.x
257 - matrix.m[0][2] * matrix.m[0][1] * matrix.m[3][0]
258 + matrix.m[0][2] * matrix.m[2][1] * source.x
259 + matrix.m[2][2] * matrix.m[0][0] * source.y
260 - matrix.m[0][1] * matrix.m[0][0] * source.z
261 - matrix.m[2][2] * matrix.m[0][0] * matrix.m[3][1]
265 source.x * matrix.m[0][2] * matrix.m[1][1]
266 + matrix.m[0][0] * matrix.m[3][2] * matrix.m[1][1]
267 + matrix.m[0][0] * matrix.m[1][2] * source.y
268 - matrix.m[0][0] * matrix.m[1][2] * matrix.m[3][1]
269 - matrix.m[0][0] * source.z * matrix.m[1][1]
270 - matrix.m[1][0] * matrix.m[0][2] * source.y
271 + matrix.m[1][0] * matrix.m[0][2] * matrix.m[3][1]
272 - matrix.m[3][0] * matrix.m[0][2] * matrix.m[1][1]
276 property float length { get { return (float)sqrt(x * x + y * y + z * z); } };
277 property float lengthApprox
281 float ix = Abs(x), iy = Abs(y), iz = Abs(z);
283 if(ix < iy) { tmp = ix; ix = iy; iy = tmp; }
284 if(ix < iz) { tmp = ix; ix = iz; iz = tmp; }
285 if(iz > iy) { iz = iy; }
294 value.x = (double) x;
295 value.y = (double) y;
296 value.z = (double) z;