21
function GetM(const Y_, X_: Integer): Integer;
22
procedure SetM(const Y_, X_: Integer; const M_: Integer);
24
property M[const Y_, X_: Integer]: Integer read GetM write SetM; default;
27
(_: array [1 .. 4, 1 .. 4] of Integer;);
29
(_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42,
36
function GetM(const Y_, X_: Integer): Single;
37
procedure SetM(const Y_, X_: Integer; const M_: Single);
38
function GetAxisX: TSingle3D;
39
procedure SetAxisX(const AxisX_: TSingle3D);
40
function GetAxisY: TSingle3D;
41
procedure SetAxisY(const AxisY_: TSingle3D);
42
function GetAxisZ: TSingle3D;
43
procedure SetAxisZ(const AxisZ_: TSingle3D);
44
function GetAxisP: TSingle3D;
45
procedure SetAxisP(const AxisP_: TSingle3D);
47
constructor Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_, _24_,
48
_31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: Single); overload;
49
constructor Create(const X_, Y_, Z_, P_: TSingle3D); overload;
50
property M[const Y_, X_: Integer]: Single read GetM write SetM; default;
51
property AxisX: TSingle3D read GetAxisX write SetAxisX;
52
property AxisY: TSingle3D read GetAxisY write SetAxisY;
53
property AxisZ: TSingle3D read GetAxisZ write SetAxisZ;
54
property AxisP: TSingle3D read GetAxisP write SetAxisP;
55
class operator Multiply(const A_, B_: TSingleM4): TSingleM4;
56
class operator Multiply(const A_: Single; const B_: TSingleM4): TSingleM4;
57
class operator Multiply(const A_: TSingleM4; const B_: Single): TSingleM4;
58
class operator Multiply(const A_: TSingleM4; const B_: TSingleRay3D)
60
class operator Multiply(const A_: TSingleM4; const B_: TSingle4D)
62
class operator Multiply(const A_: TSingle4D; const B_: TSingleM4)
64
class operator Divide(const A_: TSingleM4; const B_: Single): TSingleM4;
65
class operator Implicit(const V_: Single): TSingleM4;
66
class operator Implicit(const V_: TMatrix3D): TSingleM4;
67
class operator Explicit(const V_: TSingleM4): TMatrix3D;
68
class operator Implicit(const V_: TSingleM3): TSingleM4;
69
class operator Explicit(const V_: TSingleM4): TSingleM3;
70
function MultPos(const B_: TSingle3D): TSingle3D;
71
function MultVec(const B_: TSingle3D): TSingle3D;
72
function Adjugate: TSingleM4;
73
function Transpose: TSingleM4;
74
function Inverse: TSingleM4;
75
class function Translate(const X_, Y_, Z_: Single): TSingleM4;
77
class function Translate(const T_: TSingle3D): TSingleM4; overload; static;
78
class function Scale(const X_, Y_, Z_: Single): TSingleM4; overload; static;
79
class function Scale(const S_: TSingle3D): TSingleM4; overload; static;
80
class function RotateX(const T_: Single): TSingleM4; static;
81
class function RotateY(const T_: Single): TSingleM4; static;
82
class function RotateZ(const T_: Single): TSingleM4; static;
83
class function Identity: TSingleM4; static;
84
class function ProjOrth(const L_, R_, B_, T_, N_, F_: Single)
86
class function ProjPers(const L_, R_, B_, T_, N_, F_: Single)
91
(_: array [1 .. 4, 1 .. 4] of Single;);
93
(_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42,
100
function GetM(const Y_, X_: Integer): Double;
101
procedure SetM(const Y_, X_: Integer; const M_: Double);
102
function GetAxisX: TDouble3D;
103
procedure SetAxisX(const AxisX_: TDouble3D);
104
function GetAxisY: TDouble3D;
105
procedure SetAxisY(const AxisY_: TDouble3D);
106
function GetAxisZ: TDouble3D;
107
procedure SetAxisZ(const AxisZ_: TDouble3D);
108
function GetAxisP: TDouble3D;
109
procedure SetAxisP(const AxisP_: TDouble3D);
111
constructor Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_, _24_,
112
_31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: Double); overload;
113
constructor Create(const X_, Y_, Z_, P_: TDouble3D); overload;
114
property M[const Y_, X_: Integer]: Double read GetM write SetM; default;
115
property AxisX: TDouble3D read GetAxisX write SetAxisX;
116
property AxisY: TDouble3D read GetAxisY write SetAxisY;
117
property AxisZ: TDouble3D read GetAxisZ write SetAxisZ;
118
property AxisP: TDouble3D read GetAxisP write SetAxisP;
119
class operator Multiply(const A_, B_: TDoubleM4): TDoubleM4;
120
class operator Multiply(const A_: Double; const B_: TDoubleM4): TDoubleM4;
121
class operator Multiply(const A_: TDoubleM4; const B_: Double): TDoubleM4;
122
class operator Multiply(const A_: TDoubleM4; const B_: TDoubleRay3D)
124
class operator Multiply(const A_: TDoubleM4; const B_: TDouble4D)
126
class operator Multiply(const A_: TDouble4D; const B_: TDoubleM4)
128
class operator Divide(const A_: TDoubleM4; const B_: Double): TDoubleM4;
129
class operator Implicit(const V_: Double): TDoubleM4;
130
class operator Implicit(const V_: TMatrix3D): TDoubleM4;
131
class operator Explicit(const V_: TDoubleM4): TMatrix3D;
132
class operator Implicit(const V_: TSingleM4): TDoubleM4;
133
class operator Explicit(const V_: TDoubleM4): TSingleM4;
134
class operator Implicit(const V_: TDoubleM3): TDoubleM4;
135
class operator Explicit(const V_: TDoubleM4): TDoubleM3;
136
function MultPos(const B_: TDouble3D): TDouble3D;
137
function MultVec(const B_: TDouble3D): TDouble3D;
138
function Adjugate: TDoubleM4;
139
function Transpose: TDoubleM4;
140
function Inverse: TDoubleM4;
141
class function Translate(const X_, Y_, Z_: Double): TDoubleM4;
143
class function Translate(const T_: TDouble3D): TDoubleM4; overload; static;
144
class function Scale(const X_, Y_, Z_: Double): TDoubleM4; overload; static;
145
class function Scale(const S_: TDouble3D): TDoubleM4; overload; static;
146
class function RotateX(const T_: Double): TDoubleM4; static;
147
class function RotateY(const T_: Double): TDoubleM4; static;
148
class function RotateZ(const T_: Double): TDoubleM4; static;
149
class function Identity: TDoubleM4; static;
150
class function ProjOrth(const L_, R_, B_, T_, N_, F_: Double)
152
class function ProjPers(const L_, R_, B_, T_, N_, F_: Double)
157
(_: array [1 .. 4, 1 .. 4] of Double;);
159
(_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42,
166
function GetM(const Y_, X_: Integer): TdSingle;
167
procedure SetM(const Y_, X_: Integer; const M_: TdSingle);
168
function GetAxisX: TdSingle3D;
169
procedure SetAxisX(const AxisX_: TdSingle3D);
170
function GetAxisY: TdSingle3D;
171
procedure SetAxisY(const AxisY_: TdSingle3D);
172
function GetAxisZ: TdSingle3D;
173
procedure SetAxisZ(const AxisZ_: TdSingle3D);
174
function GetAxisP: TdSingle3D;
175
procedure SetAxisP(const AxisP_: TdSingle3D);
177
constructor Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_, _24_,
178
_31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: TdSingle); overload;
179
constructor Create(const X_, Y_, Z_, P_: TdSingle3D); overload;
180
property M[const Y_, X_: Integer]: TdSingle read GetM write SetM; default;
181
property AxisX: TdSingle3D read GetAxisX write SetAxisX;
182
property AxisY: TdSingle3D read GetAxisY write SetAxisY;
183
property AxisZ: TdSingle3D read GetAxisZ write SetAxisZ;
184
property AxisP: TdSingle3D read GetAxisP write SetAxisP;
185
class operator Multiply(const A_, B_: TdSingleM4): TdSingleM4;
186
class operator Multiply(const A_: TdSingle; const B_: TdSingleM4)
188
class operator Multiply(const A_: TdSingleM4; const B_: TdSingle)
190
class operator Multiply(const A_: TdSingleM4; const B_: TdSingle4D)
192
class operator Multiply(const A_: TdSingle4D; const B_: TdSingleM4)
194
class operator Divide(const A_: TdSingleM4; const B_: TdSingle): TdSingleM4;
195
class operator Implicit(const V_: TdSingle): TdSingleM4;
196
class operator Implicit(const V_: TMatrix3D): TdSingleM4;
197
class operator Explicit(const V_: TdSingleM4): TMatrix3D;
198
class operator Implicit(const V_: TdSingleM3): TdSingleM4;
199
class operator Explicit(const V_: TdSingleM4): TdSingleM3;
200
function MultPos(const B_: TdSingle3D): TdSingle3D;
201
function MultVec(const B_: TdSingle3D): TdSingle3D;
202
function Adjugate: TdSingleM4;
203
function Transpose: TdSingleM4;
204
function Inverse: TdSingleM4;
205
class function Translate(const X_, Y_, Z_: TdSingle): TdSingleM4;
207
class function Translate(const T_: TdSingle3D): TdSingleM4;
209
class function Scale(const X_, Y_, Z_: TdSingle): TdSingleM4;
211
class function Scale(const S_: TdSingle3D): TdSingleM4; overload; static;
212
class function RotateX(const T_: TdSingle): TdSingleM4; static;
213
class function RotateY(const T_: TdSingle): TdSingleM4; static;
214
class function RotateZ(const T_: TdSingle): TdSingleM4; static;
215
class function Identity: TdSingleM4; static;
219
(_: array [1 .. 4, 1 .. 4] of TdSingle;);
221
(_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42,
228
function GetM(const Y_, X_: Integer): TdDouble;
229
procedure SetM(const Y_, X_: Integer; const M_: TdDouble);
230
function GetAxisX: TdDouble3D;
231
procedure SetAxisX(const AxisX_: TdDouble3D);
232
function GetAxisY: TdDouble3D;
233
procedure SetAxisY(const AxisY_: TdDouble3D);
234
function GetAxisZ: TdDouble3D;
235
procedure SetAxisZ(const AxisZ_: TdDouble3D);
236
function GetAxisP: TdDouble3D;
237
procedure SetAxisP(const AxisP_: TdDouble3D);
239
constructor Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_, _24_,
240
_31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: TdDouble); overload;
241
constructor Create(const X_, Y_, Z_, P_: TdDouble3D); overload;
242
property M[const Y_, X_: Integer]: TdDouble read GetM write SetM; default;
243
property AxisX: TdDouble3D read GetAxisX write SetAxisX;
244
property AxisY: TdDouble3D read GetAxisY write SetAxisY;
245
property AxisZ: TdDouble3D read GetAxisZ write SetAxisZ;
246
property AxisP: TdDouble3D read GetAxisP write SetAxisP;
247
class operator Multiply(const A_, B_: TdDoubleM4): TdDoubleM4;
248
class operator Multiply(const A_: TdDouble; const B_: TdDoubleM4)
250
class operator Multiply(const A_: TdDoubleM4; const B_: TdDouble)
252
class operator Multiply(const A_: TdDoubleM4; const B_: TdDouble4D)
254
class operator Multiply(const A_: TdDouble4D; const B_: TdDoubleM4)
256
class operator Divide(const A_: TdDoubleM4; const B_: TdDouble): TdDoubleM4;
257
class operator Implicit(const V_: TdDouble): TdDoubleM4;
258
class operator Implicit(const V_: TMatrix3D): TdDoubleM4;
259
class operator Explicit(const V_: TdDoubleM4): TMatrix3D;
260
class operator Implicit(const V_: TdSingleM4): TdDoubleM4;
261
class operator Explicit(const V_: TdDoubleM4): TdSingleM4;
262
class operator Implicit(const V_: TdDoubleM3): TdDoubleM4;
263
class operator Explicit(const V_: TdDoubleM4): TdDoubleM3;
264
function MultPos(const B_: TdDouble3D): TdDouble3D;
265
function MultVec(const B_: TdDouble3D): TdDouble3D;
266
function Adjugate: TdDoubleM4;
267
function Transpose: TdDoubleM4;
268
function Inverse: TdDoubleM4;
269
class function Translate(const X_, Y_, Z_: TdDouble): TdDoubleM4;
271
class function Translate(const T_: TdDouble3D): TdDoubleM4;
273
class function Scale(const X_, Y_, Z_: TdDouble): TdDoubleM4;
275
class function Scale(const S_: TdDouble3D): TdDoubleM4; overload; static;
276
class function RotateX(const T_: TdDouble): TdDoubleM4; static;
277
class function RotateY(const T_: TdDouble): TdDoubleM4; static;
278
class function RotateZ(const T_: TdDouble): TdDoubleM4; static;
279
class function Identity: TdDoubleM4; static;
283
(_: array [1 .. 4, 1 .. 4] of TdDouble;);
285
(_11, _12, _13, _14, _21, _22, _23, _24, _31, _32, _33, _34, _41, _42,
290
TSingleDualM4 = record
294
procedure Seto(const o_: TSingleM4);
295
procedure Seti(const i_: TSingleM4);
297
property o: TSingleM4 read _o write Seto;
298
property i: TSingleM4 read _i write Seti;
299
class operator Multiply(const A_, B_: TSingleDualM4): TSingleDualM4;
300
class operator Multiply(const A_: Single; B_: TSingleDualM4): TSingleDualM4;
301
class operator Multiply(const A_: TSingleDualM4; B_: Single): TSingleDualM4;
302
class operator Divide(const A_: TSingleDualM4; const B_: Single)
304
class function Translate(const X_, Y_, Z_: Single): TSingleDualM4; static;
305
class function Scale(const X_, Y_, Z_: Single): TSingleDualM4; static;
306
class function RotateX(const T_: Single): TSingleDualM4; static;
307
class function RotateY(const T_: Single): TSingleDualM4; static;
308
class function RotateZ(const T_: Single): TSingleDualM4; static;
309
class function Identity: TSingleDualM4; static;
312
function Tensor(const T_: TSingle2D;
313
const Func_: TConstFunc<TdSingle2D, TdSingle3D>): TSingleM4; overload;
314
function Tensor(const T_: TDouble2D;
315
const Func_: TConstFunc<TdDouble2D, TdDouble3D>): TDoubleM4; overload;
317
function ArrowPose(const P0_, P1_: TSingle3D): TSingleM4; overload;
318
function ArrowPose(const P0_, P1_: TDouble3D): TDoubleM4; overload;
320
implementation // --------------------------------------------------------------
322
function TIntegerM4.GetM(const Y_, X_: Integer): Integer;
327
procedure TIntegerM4.SetM(const Y_, X_: Integer; const M_: Integer);
332
function TSingleM4.GetM(const Y_, X_: Integer): Single;
337
procedure TSingleM4.SetM(const Y_, X_: Integer; const M_: Single);
342
// ------------------------------------------------------------------------------
344
function TSingleM4.GetAxisX: TSingle3D;
354
procedure TSingleM4.SetAxisX(const AxisX_: TSingle3D);
364
function TSingleM4.GetAxisY: TSingle3D;
374
procedure TSingleM4.SetAxisY(const AxisY_: TSingle3D);
384
function TSingleM4.GetAxisZ: TSingle3D;
394
procedure TSingleM4.SetAxisZ(const AxisZ_: TSingle3D);
404
function TSingleM4.GetAxisP: TSingle3D;
414
procedure TSingleM4.SetAxisP(const AxisP_: TSingle3D);
424
constructor TSingleM4.Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_,
425
_24_, _31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: Single);
445
constructor TSingleM4.Create(const X_, Y_, Z_: TSingle3D; const P_: TSingle3D);
465
class operator TSingleM4.Multiply(const A_, B_: TSingleM4): TSingleM4;
469
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14
471
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14
473
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14
475
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14
478
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24
480
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24
482
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24
484
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24
487
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34
489
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34
491
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34
493
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34
496
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44
498
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44
500
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44
502
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44
507
class operator TSingleM4.Multiply(const A_: Single; const B_: TSingleM4)
531
class operator TSingleM4.Multiply(const A_: TSingleM4; const B_: Single)
555
class operator TSingleM4.Multiply(const A_: TSingleM4; const B_: TSingleRay3D)
560
Pos := A_.MultPos(B_.Pos);
561
Vec := A_.MultVec(B_.Vec);
565
class operator TSingleM4.Multiply(const A_: TSingleM4; const B_: TSingle4D)
570
_1 := A_._11 * B_._1 + A_._12 * B_._2 + A_._13 * B_._3 + A_._14 * B_._4;
571
_2 := A_._21 * B_._1 + A_._22 * B_._2 + A_._23 * B_._3 + A_._24 * B_._4;
572
_3 := A_._31 * B_._1 + A_._32 * B_._2 + A_._33 * B_._3 + A_._34 * B_._4;
573
_4 := A_._41 * B_._1 + A_._42 * B_._2 + A_._43 * B_._3 + A_._44 * B_._4;
577
class operator TSingleM4.Multiply(const A_: TSingle4D; const B_: TSingleM4)
582
_1 := A_._1 * B_._11 + A_._2 * B_._21 + A_._3 * B_._31 + A_._4 * B_._41;
583
_2 := A_._1 * B_._12 + A_._2 * B_._22 + A_._3 * B_._32 + A_._4 * B_._42;
584
_3 := A_._1 * B_._13 + A_._2 * B_._23 + A_._3 * B_._33 + A_._4 * B_._43;
585
_4 := A_._1 * B_._14 + A_._2 * B_._24 + A_._3 * B_._34 + A_._4 * B_._44;
589
// ------------------------------------------------------------------------------
591
class operator TSingleM4.Divide(const A_: TSingleM4; const B_: Single)
596
Result._11 := _11 / B_;
597
Result._12 := _12 / B_;
598
Result._13 := _13 / B_;
599
Result._14 := _14 / B_;
600
Result._21 := _21 / B_;
601
Result._22 := _22 / B_;
602
Result._23 := _23 / B_;
603
Result._24 := _24 / B_;
604
Result._31 := _31 / B_;
605
Result._32 := _32 / B_;
606
Result._33 := _33 / B_;
607
Result._34 := _34 / B_;
608
Result._41 := _41 / B_;
609
Result._42 := _42 / B_;
610
Result._43 := _43 / B_;
611
Result._44 := _44 / B_;
615
class operator TSingleM4.Implicit(const V_: Single): TSingleM4;
638
class operator TSingleM4.Implicit(const V_: TMatrix3D): TSingleM4;
661
class operator TSingleM4.Explicit(const V_: TSingleM4): TMatrix3D;
684
class operator TSingleM4.Implicit(const V_: TSingleM3): TSingleM4;
707
class operator TSingleM4.Explicit(const V_: TSingleM4): TSingleM3;
723
function TSingleM4.MultPos(const B_: TSingle3D): TSingle3D;
725
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
726
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
727
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
730
function TSingleM4.MultVec(const B_: TSingle3D): TSingle3D;
732
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
733
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
734
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
737
function TSingleM4.Adjugate: TSingleM4;
739
Result._11 := +TSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
740
{ 21 } _22, _23, _24,
741
{ 31 } _32, _33, _34,
742
{ 41 } _42, _43, _44).Det;
744
Result._21 := -TSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
745
_21, { 22 } _23, _24, _31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
747
Result._31 := +TSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
748
_21, _22, { 23 } _24, _31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
750
Result._41 := -TSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
751
_21, _22, _23, { 24 }
752
_31, _32, _33, { 34 }
753
_41, _42, _43 { 44 } ).Det;
755
Result._12 := -TSingleM3.Create( { 11 } _12, _13, _14,
756
{ 21 } { 22 } { 23 } { 24 }
757
{ 31 } _32, _33, _34,
758
{ 41 } _42, _43, _44).Det;
760
Result._22 := +TSingleM3.Create(_11, { 12 } _13, _14,
761
{ 21 } { 22 } { 23 } { 24 }
762
_31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
764
Result._32 := -TSingleM3.Create(_11, _12, { 13 } _14,
765
{ 21 } { 22 } { 23 } { 24 }
766
_31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
768
Result._42 := +TSingleM3.Create(_11, _12, _13, { 14 }
769
{ 21 } { 22 } { 23 } { 24 }
770
_31, _32, _33, { 34 }
771
_41, _42, _43 { 44 } ).Det;
773
Result._13 := +TSingleM3.Create( { 11 } _12, _13, _14,
774
{ 21 } _22, _23, _24,
775
{ 31 } { 32 } { 33 } { 34 }
776
{ 41 } _42, _43, _44).Det;
778
Result._23 := -TSingleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
779
{ 31 } { 32 } { 33 } { 34 }
780
_41, { 42 } _43, _44).Det;
782
Result._33 := +TSingleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
783
{ 31 } { 32 } { 33 } { 34 }
784
_41, _42, { 43 } _44).Det;
786
Result._43 := -TSingleM3.Create(_11, _12, _13, { 14 }
787
_21, _22, _23, { 24 }
788
{ 31 } { 32 } { 33 } { 34 }
789
_41, _42, _43 { 44 } ).Det;
791
Result._14 := -TSingleM3.Create( { 11 } _12, _13, _14,
792
{ 21 } _22, _23, _24,
794
{ 41 } { 42 } { 43 } { 44 } ).Det;
796
Result._24 := +TSingleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
798
{ 41 } { 42 } { 43 } { 44 } ).Det;
800
Result._34 := -TSingleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
802
{ 41 } { 42 } { 43 } { 44 } ).Det;
804
Result._44 := +TSingleM3.Create(_11, _12, _13, { 14 }
805
_21, _22, _23, { 24 }
807
{ 41 } { 42 } { 43 } { 44 } ).Det;
810
// ------------------------------------------------------------------------------
812
function TSingleM4.Transpose: TSingleM4;
832
// ------------------------------------------------------------------------------
834
function TSingleM4.Inverse: TSingleM4;
840
Result := A / (_11 * A._11 + _12 * A._21 + _13 * A._31 + _14 * A._41)
843
class function TSingleM4.Translate(const X_, Y_, Z_: Single): TSingleM4;
866
class function TSingleM4.Translate(const T_: TSingle3D): TSingleM4;
869
Result := Translate(X, Y, Z);
872
// ------------------------------------------------------------------------------
874
class function TSingleM4.Scale(const X_, Y_, Z_: Single): TSingleM4;
897
class function TSingleM4.Scale(const S_: TSingle3D): TSingleM4;
900
Result := Scale(X, Y, Z);
903
// ------------------------------------------------------------------------------
905
class function TSingleM4.RotateX(const T_: Single): TSingleM4;
932
class function TSingleM4.RotateY(const T_: Single): TSingleM4;
959
class function TSingleM4.RotateZ(const T_: Single): TSingleM4;
986
// ------------------------------------------------------------------------------
988
class function TSingleM4.Identity: TSingleM4;
1011
// ------------------------------------------------------------------------------
1013
class function TSingleM4.ProjOrth(const L_, R_, B_, T_, N_, F_: Single)
1027
_14 := -(R_ + L_) / RL;
1031
_24 := -(T_ + B_) / TB;
1035
_34 := -(F_ + N_) / FN;
1043
class function TSingleM4.ProjPers(const L_, R_, B_, T_, N_, F_: Single)
1054
_11 := +2 * N_ / RL;
1056
_13 := +(R_ + L_) / RL;
1059
_22 := +2 * N_ / TB;
1060
_23 := +(T_ + B_) / TB;
1064
_33 := -(F_ + N_) / FN;
1065
_34 := -2 * F_ * N_ / FN;
1073
function TDoubleM4.GetM(const Y_, X_: Integer): Double;
1075
Result := _[Y_, X_];
1078
procedure TDoubleM4.SetM(const Y_, X_: Integer; const M_: Double);
1083
// ------------------------------------------------------------------------------
1085
function TDoubleM4.GetAxisX: TDouble3D;
1095
procedure TDoubleM4.SetAxisX(const AxisX_: TDouble3D);
1105
function TDoubleM4.GetAxisY: TDouble3D;
1115
procedure TDoubleM4.SetAxisY(const AxisY_: TDouble3D);
1125
function TDoubleM4.GetAxisZ: TDouble3D;
1135
procedure TDoubleM4.SetAxisZ(const AxisZ_: TDouble3D);
1145
function TDoubleM4.GetAxisP: TDouble3D;
1155
procedure TDoubleM4.SetAxisP(const AxisP_: TDouble3D);
1165
constructor TDoubleM4.Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_,
1166
_24_, _31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: Double);
1186
constructor TDoubleM4.Create(const X_, Y_, Z_, P_: TDouble3D);
1206
class operator TDoubleM4.Multiply(const A_, B_: TDoubleM4): TDoubleM4;
1210
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14
1212
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14
1214
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14
1216
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14
1219
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24
1221
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24
1223
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24
1225
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24
1228
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34
1230
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34
1232
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34
1234
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34
1237
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44
1239
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44
1241
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44
1243
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44
1248
class operator TDoubleM4.Multiply(const A_: Double; const B_: TDoubleM4)
1272
class operator TDoubleM4.Multiply(const A_: TDoubleM4; const B_: Double)
1296
class operator TDoubleM4.Multiply(const A_: TDoubleM4; const B_: TDoubleRay3D)
1301
Pos := A_.MultPos(B_.Pos);
1302
Vec := A_.MultVec(B_.Vec);
1306
class operator TDoubleM4.Multiply(const A_: TDoubleM4; const B_: TDouble4D)
1311
_1 := A_._11 * B_._1 + A_._12 * B_._2 + A_._13 * B_._3 + A_._14 * B_._4;
1312
_2 := A_._21 * B_._1 + A_._22 * B_._2 + A_._23 * B_._3 + A_._24 * B_._4;
1313
_3 := A_._31 * B_._1 + A_._32 * B_._2 + A_._33 * B_._3 + A_._34 * B_._4;
1314
_4 := A_._41 * B_._1 + A_._42 * B_._2 + A_._43 * B_._3 + A_._44 * B_._4;
1318
class operator TDoubleM4.Multiply(const A_: TDouble4D; const B_: TDoubleM4)
1323
_1 := A_._1 * B_._11 + A_._2 * B_._21 + A_._3 * B_._31 + A_._4 * B_._41;
1324
_2 := A_._1 * B_._12 + A_._2 * B_._22 + A_._3 * B_._32 + A_._4 * B_._42;
1325
_3 := A_._1 * B_._13 + A_._2 * B_._23 + A_._3 * B_._33 + A_._4 * B_._43;
1326
_4 := A_._1 * B_._14 + A_._2 * B_._24 + A_._3 * B_._34 + A_._4 * B_._44;
1330
class operator TDoubleM4.Divide(const A_: TDoubleM4; const B_: Double)
1335
Result._11 := _11 / B_;
1336
Result._12 := _12 / B_;
1337
Result._13 := _13 / B_;
1338
Result._14 := _14 / B_;
1339
Result._21 := _21 / B_;
1340
Result._22 := _22 / B_;
1341
Result._23 := _23 / B_;
1342
Result._24 := _24 / B_;
1343
Result._31 := _31 / B_;
1344
Result._32 := _32 / B_;
1345
Result._33 := _33 / B_;
1346
Result._34 := _34 / B_;
1347
Result._41 := _41 / B_;
1348
Result._42 := _42 / B_;
1349
Result._43 := _43 / B_;
1350
Result._44 := _44 / B_;
1354
class operator TDoubleM4.Implicit(const V_: Double): TDoubleM4;
1377
class operator TDoubleM4.Implicit(const V_: TMatrix3D): TDoubleM4;
1400
class operator TDoubleM4.Explicit(const V_: TDoubleM4): TMatrix3D;
1423
class operator TDoubleM4.Implicit(const V_: TSingleM4): TDoubleM4;
1446
class operator TDoubleM4.Explicit(const V_: TDoubleM4): TSingleM4;
1469
class operator TDoubleM4.Implicit(const V_: TDoubleM3): TDoubleM4;
1492
class operator TDoubleM4.Explicit(const V_: TDoubleM4): TDoubleM3;
1508
function TDoubleM4.MultPos(const B_: TDouble3D): TDouble3D;
1510
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
1511
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
1512
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
1515
function TDoubleM4.MultVec(const B_: TDouble3D): TDouble3D;
1517
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
1518
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
1519
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
1522
function TDoubleM4.Adjugate: TDoubleM4;
1524
Result._11 := +TDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
1525
{ 21 } _22, _23, _24,
1526
{ 31 } _32, _33, _34,
1527
{ 41 } _42, _43, _44).Det;
1529
Result._21 := -TDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
1530
_21, { 22 } _23, _24, _31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
1532
Result._31 := +TDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
1533
_21, _22, { 23 } _24, _31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
1535
Result._41 := -TDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
1536
_21, _22, _23, { 24 }
1537
_31, _32, _33, { 34 }
1538
_41, _42, _43 { 44 } ).Det;
1540
Result._12 := -TDoubleM3.Create( { 11 } _12, _13, _14,
1541
{ 21 } { 22 } { 23 } { 24 }
1542
{ 31 } _32, _33, _34,
1543
{ 41 } _42, _43, _44).Det;
1545
Result._22 := +TDoubleM3.Create(_11, { 12 } _13, _14,
1546
{ 21 } { 22 } { 23 } { 24 }
1547
_31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
1549
Result._32 := -TDoubleM3.Create(_11, _12, { 13 } _14,
1550
{ 21 } { 22 } { 23 } { 24 }
1551
_31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
1553
Result._42 := +TDoubleM3.Create(_11, _12, _13, { 14 }
1554
{ 21 } { 22 } { 23 } { 24 }
1555
_31, _32, _33, { 34 }
1556
_41, _42, _43 { 44 } ).Det;
1558
Result._13 := +TDoubleM3.Create( { 11 } _12, _13, _14,
1559
{ 21 } _22, _23, _24,
1560
{ 31 } { 32 } { 33 } { 34 }
1561
{ 41 } _42, _43, _44).Det;
1563
Result._23 := -TDoubleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
1564
{ 31 } { 32 } { 33 } { 34 }
1565
_41, { 42 } _43, _44).Det;
1567
Result._33 := +TDoubleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
1568
{ 31 } { 32 } { 33 } { 34 }
1569
_41, _42, { 43 } _44).Det;
1571
Result._43 := -TDoubleM3.Create(_11, _12, _13, { 14 }
1572
_21, _22, _23, { 24 }
1573
{ 31 } { 32 } { 33 } { 34 }
1574
_41, _42, _43 { 44 } ).Det;
1576
Result._14 := -TDoubleM3.Create( { 11 } _12, _13, _14,
1577
{ 21 } _22, _23, _24,
1578
{ 31 } _32, _33, _34
1579
{ 41 } { 42 } { 43 } { 44 } ).Det;
1581
Result._24 := +TDoubleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
1582
_31, { 32 } _33, _34
1583
{ 41 } { 42 } { 43 } { 44 } ).Det;
1585
Result._34 := -TDoubleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
1586
_31, _32, { 33 } _34
1587
{ 41 } { 42 } { 43 } { 44 } ).Det;
1589
Result._44 := +TDoubleM3.Create(_11, _12, _13, { 14 }
1590
_21, _22, _23, { 24 }
1591
_31, _32, _33 { 34 }
1592
{ 41 } { 42 } { 43 } { 44 } ).Det;
1595
function TDoubleM4.Transpose: TDoubleM4;
1615
function TDoubleM4.Inverse: TDoubleM4;
1621
Result := A / (_11 * A._11 + _12 * A._21 + _13 * A._31 + _14 * A._41)
1624
class function TDoubleM4.Translate(const X_, Y_, Z_: Double): TDoubleM4;
1647
class function TDoubleM4.Translate(const T_: TDouble3D): TDoubleM4;
1650
Result := Translate(X, Y, Z);
1653
// ------------------------------------------------------------------------------
1655
class function TDoubleM4.Scale(const X_, Y_, Z_: Double): TDoubleM4;
1678
class function TDoubleM4.Scale(const S_: TDouble3D): TDoubleM4;
1681
Result := Scale(X, Y, Z);
1684
// ------------------------------------------------------------------------------
1686
class function TDoubleM4.RotateX(const T_: Double): TDoubleM4;
1713
class function TDoubleM4.RotateY(const T_: Double): TDoubleM4;
1740
class function TDoubleM4.RotateZ(const T_: Double): TDoubleM4;
1767
// ------------------------------------------------------------------------------
1769
class function TDoubleM4.Identity: TDoubleM4;
1792
// ------------------------------------------------------------------------------
1794
class function TDoubleM4.ProjOrth(const L_, R_, B_, T_, N_, F_: Double)
1808
_14 := -(R_ + L_) / RL;
1812
_24 := -(T_ + B_) / TB;
1816
_34 := -(F_ + N_) / FN;
1824
class function TDoubleM4.ProjPers(const L_, R_, B_, T_, N_, F_: Double)
1835
_11 := +2 * N_ / RL;
1837
_13 := +(R_ + L_) / RL;
1840
_22 := +2 * N_ / TB;
1841
_23 := +(T_ + B_) / TB;
1845
_33 := -(F_ + N_) / FN;
1846
_34 := -2 * F_ * N_ / FN;
1854
function TdSingleM4.GetM(const Y_, X_: Integer): TdSingle;
1856
Result := _[Y_, X_];
1859
procedure TdSingleM4.SetM(const Y_, X_: Integer; const M_: TdSingle);
1864
// ------------------------------------------------------------------------------
1866
function TdSingleM4.GetAxisX: TdSingle3D;
1876
procedure TdSingleM4.SetAxisX(const AxisX_: TdSingle3D);
1886
function TdSingleM4.GetAxisY: TdSingle3D;
1896
procedure TdSingleM4.SetAxisY(const AxisY_: TdSingle3D);
1906
function TdSingleM4.GetAxisZ: TdSingle3D;
1916
procedure TdSingleM4.SetAxisZ(const AxisZ_: TdSingle3D);
1926
function TdSingleM4.GetAxisP: TdSingle3D;
1936
procedure TdSingleM4.SetAxisP(const AxisP_: TdSingle3D);
1946
constructor TdSingleM4.Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_,
1947
_24_, _31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: TdSingle);
1967
constructor TdSingleM4.Create(const X_, Y_, Z_: TdSingle3D;
1968
const P_: TdSingle3D);
1988
class operator TdSingleM4.Multiply(const A_, B_: TdSingleM4): TdSingleM4;
1992
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14
1994
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14
1996
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14
1998
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14
2001
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24
2003
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24
2005
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24
2007
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24
2010
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34
2012
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34
2014
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34
2016
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34
2019
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44
2021
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44
2023
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44
2025
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44
2030
class operator TdSingleM4.Multiply(const A_: TdSingle; const B_: TdSingleM4)
2054
class operator TdSingleM4.Multiply(const A_: TdSingleM4; const B_: TdSingle)
2078
class operator TdSingleM4.Multiply(const A_: TdSingleM4; const B_: TdSingle4D)
2083
_1 := A_._11 * B_._1 + A_._12 * B_._2 + A_._13 * B_._3 + A_._14 * B_._4;
2084
_2 := A_._21 * B_._1 + A_._22 * B_._2 + A_._23 * B_._3 + A_._24 * B_._4;
2085
_3 := A_._31 * B_._1 + A_._32 * B_._2 + A_._33 * B_._3 + A_._34 * B_._4;
2086
_4 := A_._41 * B_._1 + A_._42 * B_._2 + A_._43 * B_._3 + A_._44 * B_._4;
2090
class operator TdSingleM4.Multiply(const A_: TdSingle4D; const B_: TdSingleM4)
2095
_1 := A_._1 * B_._11 + A_._2 * B_._21 + A_._3 * B_._31 + A_._4 * B_._41;
2096
_2 := A_._1 * B_._12 + A_._2 * B_._22 + A_._3 * B_._32 + A_._4 * B_._42;
2097
_3 := A_._1 * B_._13 + A_._2 * B_._23 + A_._3 * B_._33 + A_._4 * B_._43;
2098
_4 := A_._1 * B_._14 + A_._2 * B_._24 + A_._3 * B_._34 + A_._4 * B_._44;
2102
class operator TdSingleM4.Divide(const A_: TdSingleM4; const B_: TdSingle)
2107
Result._11 := _11 / B_;
2108
Result._12 := _12 / B_;
2109
Result._13 := _13 / B_;
2110
Result._14 := _14 / B_;
2111
Result._21 := _21 / B_;
2112
Result._22 := _22 / B_;
2113
Result._23 := _23 / B_;
2114
Result._24 := _24 / B_;
2115
Result._31 := _31 / B_;
2116
Result._32 := _32 / B_;
2117
Result._33 := _33 / B_;
2118
Result._34 := _34 / B_;
2119
Result._41 := _41 / B_;
2120
Result._42 := _42 / B_;
2121
Result._43 := _43 / B_;
2122
Result._44 := _44 / B_;
2126
class operator TdSingleM4.Implicit(const V_: TdSingle): TdSingleM4;
2149
class operator TdSingleM4.Implicit(const V_: TMatrix3D): TdSingleM4;
2172
class operator TdSingleM4.Explicit(const V_: TdSingleM4): TMatrix3D;
2195
class operator TdSingleM4.Implicit(const V_: TdSingleM3): TdSingleM4;
2218
class operator TdSingleM4.Explicit(const V_: TdSingleM4): TdSingleM3;
2234
function TdSingleM4.MultPos(const B_: TdSingle3D): TdSingle3D;
2236
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
2237
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
2238
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
2241
function TdSingleM4.MultVec(const B_: TdSingle3D): TdSingle3D;
2243
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
2244
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
2245
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
2248
function TdSingleM4.Adjugate: TdSingleM4;
2250
Result._11 := +TdSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
2251
{ 21 } _22, _23, _24,
2252
{ 31 } _32, _33, _34,
2253
{ 41 } _42, _43, _44).Det;
2255
Result._21 := -TdSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
2256
_21, { 22 } _23, _24, _31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
2258
Result._31 := +TdSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
2259
_21, _22, { 23 } _24, _31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
2261
Result._41 := -TdSingleM3.Create( { 11 } { 12 } { 13 } { 14 }
2262
_21, _22, _23, { 24 }
2263
_31, _32, _33, { 34 }
2264
_41, _42, _43 { 44 } ).Det;
2266
Result._12 := -TdSingleM3.Create( { 11 } _12, _13, _14,
2267
{ 21 } { 22 } { 23 } { 24 }
2268
{ 31 } _32, _33, _34,
2269
{ 41 } _42, _43, _44).Det;
2271
Result._22 := +TdSingleM3.Create(_11, { 12 } _13, _14,
2272
{ 21 } { 22 } { 23 } { 24 }
2273
_31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
2275
Result._32 := -TdSingleM3.Create(_11, _12, { 13 } _14,
2276
{ 21 } { 22 } { 23 } { 24 }
2277
_31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
2279
Result._42 := +TdSingleM3.Create(_11, _12, _13, { 14 }
2280
{ 21 } { 22 } { 23 } { 24 }
2281
_31, _32, _33, { 34 }
2282
_41, _42, _43 { 44 } ).Det;
2284
Result._13 := +TdSingleM3.Create( { 11 } _12, _13, _14,
2285
{ 21 } _22, _23, _24,
2286
{ 31 } { 32 } { 33 } { 34 }
2287
{ 41 } _42, _43, _44).Det;
2289
Result._23 := -TdSingleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
2290
{ 31 } { 32 } { 33 } { 34 }
2291
_41, { 42 } _43, _44).Det;
2293
Result._33 := +TdSingleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
2294
{ 31 } { 32 } { 33 } { 34 }
2295
_41, _42, { 43 } _44).Det;
2297
Result._43 := -TdSingleM3.Create(_11, _12, _13, { 14 }
2298
_21, _22, _23, { 24 }
2299
{ 31 } { 32 } { 33 } { 34 }
2300
_41, _42, _43 { 44 } ).Det;
2302
Result._14 := -TdSingleM3.Create( { 11 } _12, _13, _14,
2303
{ 21 } _22, _23, _24,
2304
{ 31 } _32, _33, _34
2305
{ 41 } { 42 } { 43 } { 44 } ).Det;
2307
Result._24 := +TdSingleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
2308
_31, { 32 } _33, _34
2309
{ 41 } { 42 } { 43 } { 44 } ).Det;
2311
Result._34 := -TdSingleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
2312
_31, _32, { 33 } _34
2313
{ 41 } { 42 } { 43 } { 44 } ).Det;
2315
Result._44 := +TdSingleM3.Create(_11, _12, _13, { 14 }
2316
_21, _22, _23, { 24 }
2317
_31, _32, _33 { 34 }
2318
{ 41 } { 42 } { 43 } { 44 } ).Det;
2321
function TdSingleM4.Transpose: TdSingleM4;
2341
function TdSingleM4.Inverse: TdSingleM4;
2347
Result := A / (_11 * A._11 + _12 * A._21 + _13 * A._31 + _14 * A._41)
2350
class function TdSingleM4.Translate(const X_, Y_, Z_: TdSingle): TdSingleM4;
2373
class function TdSingleM4.Translate(const T_: TdSingle3D): TdSingleM4;
2376
Result := Translate(X, Y, Z);
2379
// ------------------------------------------------------------------------------
2381
class function TdSingleM4.Scale(const X_, Y_, Z_: TdSingle): TdSingleM4;
2404
class function TdSingleM4.Scale(const S_: TdSingle3D): TdSingleM4;
2407
Result := Scale(X, Y, Z);
2410
// ------------------------------------------------------------------------------
2412
class function TdSingleM4.RotateX(const T_: TdSingle): TdSingleM4;
2439
class function TdSingleM4.RotateY(const T_: TdSingle): TdSingleM4;
2466
class function TdSingleM4.RotateZ(const T_: TdSingle): TdSingleM4;
2493
// ------------------------------------------------------------------------------
2495
class function TdSingleM4.Identity: TdSingleM4;
2518
function TdDoubleM4.GetM(const Y_, X_: Integer): TdDouble;
2520
Result := _[Y_, X_];
2523
procedure TdDoubleM4.SetM(const Y_, X_: Integer; const M_: TdDouble);
2528
// ------------------------------------------------------------------------------
2530
function TdDoubleM4.GetAxisX: TdDouble3D;
2540
procedure TdDoubleM4.SetAxisX(const AxisX_: TdDouble3D);
2550
function TdDoubleM4.GetAxisY: TdDouble3D;
2560
procedure TdDoubleM4.SetAxisY(const AxisY_: TdDouble3D);
2570
function TdDoubleM4.GetAxisZ: TdDouble3D;
2580
procedure TdDoubleM4.SetAxisZ(const AxisZ_: TdDouble3D);
2590
function TdDoubleM4.GetAxisP: TdDouble3D;
2600
procedure TdDoubleM4.SetAxisP(const AxisP_: TdDouble3D);
2610
constructor TdDoubleM4.Create(const _11_, _12_, _13_, _14_, _21_, _22_, _23_,
2611
_24_, _31_, _32_, _33_, _34_, _41_, _42_, _43_, _44_: TdDouble);
2631
constructor TdDoubleM4.Create(const X_, Y_, Z_, P_: TdDouble3D);
2651
class operator TdDoubleM4.Multiply(const A_, B_: TdDoubleM4): TdDoubleM4;
2655
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14
2657
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14
2659
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14
2661
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14
2664
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24
2666
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24
2668
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24
2670
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24
2673
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34
2675
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34
2677
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34
2679
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34
2682
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44
2684
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44
2686
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44
2688
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44
2693
class operator TdDoubleM4.Multiply(const A_: TdDouble; const B_: TdDoubleM4)
2717
class operator TdDoubleM4.Multiply(const A_: TdDoubleM4; const B_: TdDouble)
2741
class operator TdDoubleM4.Multiply(const A_: TdDoubleM4; const B_: TdDouble4D)
2746
_1 := A_._11 * B_._1 + A_._12 * B_._2 + A_._13 * B_._3 + A_._14 * B_._4;
2747
_2 := A_._21 * B_._1 + A_._22 * B_._2 + A_._23 * B_._3 + A_._24 * B_._4;
2748
_3 := A_._31 * B_._1 + A_._32 * B_._2 + A_._33 * B_._3 + A_._34 * B_._4;
2749
_4 := A_._41 * B_._1 + A_._42 * B_._2 + A_._43 * B_._3 + A_._44 * B_._4;
2753
class operator TdDoubleM4.Multiply(const A_: TdDouble4D; const B_: TdDoubleM4)
2758
_1 := A_._1 * B_._11 + A_._2 * B_._21 + A_._3 * B_._31 + A_._4 * B_._41;
2759
_2 := A_._1 * B_._12 + A_._2 * B_._22 + A_._3 * B_._32 + A_._4 * B_._42;
2760
_3 := A_._1 * B_._13 + A_._2 * B_._23 + A_._3 * B_._33 + A_._4 * B_._43;
2761
_4 := A_._1 * B_._14 + A_._2 * B_._24 + A_._3 * B_._34 + A_._4 * B_._44;
2765
class operator TdDoubleM4.Divide(const A_: TdDoubleM4; const B_: TdDouble)
2770
Result._11 := _11 / B_;
2771
Result._12 := _12 / B_;
2772
Result._13 := _13 / B_;
2773
Result._14 := _14 / B_;
2774
Result._21 := _21 / B_;
2775
Result._22 := _22 / B_;
2776
Result._23 := _23 / B_;
2777
Result._24 := _24 / B_;
2778
Result._31 := _31 / B_;
2779
Result._32 := _32 / B_;
2780
Result._33 := _33 / B_;
2781
Result._34 := _34 / B_;
2782
Result._41 := _41 / B_;
2783
Result._42 := _42 / B_;
2784
Result._43 := _43 / B_;
2785
Result._44 := _44 / B_;
2789
class operator TdDoubleM4.Implicit(const V_: TdDouble): TdDoubleM4;
2812
class operator TdDoubleM4.Implicit(const V_: TMatrix3D): TdDoubleM4;
2835
class operator TdDoubleM4.Explicit(const V_: TdDoubleM4): TMatrix3D;
2858
class operator TdDoubleM4.Implicit(const V_: TdSingleM4): TdDoubleM4;
2881
class operator TdDoubleM4.Explicit(const V_: TdDoubleM4): TdSingleM4;
2904
class operator TdDoubleM4.Implicit(const V_: TdDoubleM3): TdDoubleM4;
2927
class operator TdDoubleM4.Explicit(const V_: TdDoubleM4): TdDoubleM3;
2943
function TdDoubleM4.MultPos(const B_: TdDouble3D): TdDouble3D;
2945
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
2946
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
2947
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
2950
function TdDoubleM4.MultVec(const B_: TdDouble3D): TdDouble3D;
2952
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
2953
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
2954
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
2957
function TdDoubleM4.Adjugate: TdDoubleM4;
2959
Result._11 := +TdDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
2960
{ 21 } _22, _23, _24,
2961
{ 31 } _32, _33, _34,
2962
{ 41 } _42, _43, _44).Det;
2964
Result._21 := -TdDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
2965
_21, { 22 } _23, _24, _31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
2967
Result._31 := +TdDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
2968
_21, _22, { 23 } _24, _31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
2970
Result._41 := -TdDoubleM3.Create( { 11 } { 12 } { 13 } { 14 }
2971
_21, _22, _23, { 24 }
2972
_31, _32, _33, { 34 }
2973
_41, _42, _43 { 44 } ).Det;
2975
Result._12 := -TdDoubleM3.Create( { 11 } _12, _13, _14,
2976
{ 21 } { 22 } { 23 } { 24 }
2977
{ 31 } _32, _33, _34,
2978
{ 41 } _42, _43, _44).Det;
2980
Result._22 := +TdDoubleM3.Create(_11, { 12 } _13, _14,
2981
{ 21 } { 22 } { 23 } { 24 }
2982
_31, { 32 } _33, _34, _41, { 42 } _43, _44).Det;
2984
Result._32 := -TdDoubleM3.Create(_11, _12, { 13 } _14,
2985
{ 21 } { 22 } { 23 } { 24 }
2986
_31, _32, { 33 } _34, _41, _42, { 43 } _44).Det;
2988
Result._42 := +TdDoubleM3.Create(_11, _12, _13, { 14 }
2989
{ 21 } { 22 } { 23 } { 24 }
2990
_31, _32, _33, { 34 }
2991
_41, _42, _43 { 44 } ).Det;
2993
Result._13 := +TdDoubleM3.Create( { 11 } _12, _13, _14,
2994
{ 21 } _22, _23, _24,
2995
{ 31 } { 32 } { 33 } { 34 }
2996
{ 41 } _42, _43, _44).Det;
2998
Result._23 := -TdDoubleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
2999
{ 31 } { 32 } { 33 } { 34 }
3000
_41, { 42 } _43, _44).Det;
3002
Result._33 := +TdDoubleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
3003
{ 31 } { 32 } { 33 } { 34 }
3004
_41, _42, { 43 } _44).Det;
3006
Result._43 := -TdDoubleM3.Create(_11, _12, _13, { 14 }
3007
_21, _22, _23, { 24 }
3008
{ 31 } { 32 } { 33 } { 34 }
3009
_41, _42, _43 { 44 } ).Det;
3011
Result._14 := -TdDoubleM3.Create( { 11 } _12, _13, _14,
3012
{ 21 } _22, _23, _24,
3013
{ 31 } _32, _33, _34
3014
{ 41 } { 42 } { 43 } { 44 } ).Det;
3016
Result._24 := +TdDoubleM3.Create(_11, { 12 } _13, _14, _21, { 22 } _23, _24,
3017
_31, { 32 } _33, _34
3018
{ 41 } { 42 } { 43 } { 44 } ).Det;
3020
Result._34 := -TdDoubleM3.Create(_11, _12, { 13 } _14, _21, _22, { 23 } _24,
3021
_31, _32, { 33 } _34
3022
{ 41 } { 42 } { 43 } { 44 } ).Det;
3024
Result._44 := +TdDoubleM3.Create(_11, _12, _13, { 14 }
3025
_21, _22, _23, { 24 }
3026
_31, _32, _33 { 34 }
3027
{ 41 } { 42 } { 43 } { 44 } ).Det;
3030
function TdDoubleM4.Transpose: TdDoubleM4;
3050
function TdDoubleM4.Inverse: TdDoubleM4;
3056
Result := A / (_11 * A._11 + _12 * A._21 + _13 * A._31 + _14 * A._41)
3059
class function TdDoubleM4.Translate(const X_, Y_, Z_: TdDouble): TdDoubleM4;
3082
class function TdDoubleM4.Translate(const T_: TdDouble3D): TdDoubleM4;
3085
Result := Translate(X, Y, Z);
3088
// ------------------------------------------------------------------------------
3090
class function TdDoubleM4.Scale(const X_, Y_, Z_: TdDouble): TdDoubleM4;
3113
class function TdDoubleM4.Scale(const S_: TdDouble3D): TdDoubleM4;
3116
Result := Scale(X, Y, Z);
3119
// ------------------------------------------------------------------------------
3121
class function TdDoubleM4.RotateX(const T_: TdDouble): TdDoubleM4;
3148
class function TdDoubleM4.RotateY(const T_: TdDouble): TdDoubleM4;
3175
class function TdDoubleM4.RotateZ(const T_: TdDouble): TdDoubleM4;
3202
// ------------------------------------------------------------------------------
3204
class function TdDoubleM4.Identity: TdDoubleM4;
3227
procedure TSingleDualM4.Seto(const o_: TSingleM4);
3233
procedure TSingleDualM4.Seti(const i_: TSingleM4);
3239
class operator TSingleDualM4.Multiply(const A_, B_: TSingleDualM4)
3249
class operator TSingleDualM4.Multiply(const A_: Single; B_: TSingleDualM4)
3259
class operator TSingleDualM4.Multiply(const A_: TSingleDualM4; B_: Single)
3269
class operator TSingleDualM4.Divide(const A_: TSingleDualM4; const B_: Single)
3279
class function TSingleDualM4.Translate(const X_, Y_, Z_: Single): TSingleDualM4;
3283
_o := TSingleM4.Translate(+X_, +Y_, +Z_);
3284
_i := TSingleM4.Translate(-X_, -Y_, -Z_);
3288
class function TSingleDualM4.Scale(const X_, Y_, Z_: Single): TSingleDualM4;
3292
_o := TSingleM4.Scale(+X_, +Y_, +Z_);
3293
_i := TSingleM4.Scale(-X_, -Y_, -Z_);
3297
class function TSingleDualM4.RotateX(const T_: Single): TSingleDualM4;
3301
_o := TSingleM4.RotateX(+T_);
3302
_i := TSingleM4.RotateX(-T_);
3306
class function TSingleDualM4.RotateY(const T_: Single): TSingleDualM4;
3310
_o := TSingleM4.RotateY(+T_);
3311
_i := TSingleM4.RotateY(-T_);
3315
class function TSingleDualM4.RotateZ(const T_: Single): TSingleDualM4;
3319
_o := TSingleM4.RotateZ(+T_);
3320
_i := TSingleM4.RotateZ(-T_);
3324
class function TSingleDualM4.Identity: TSingleDualM4;
3328
_o := TSingleM4.Identity;
3329
_i := TSingleM4.Identity;
3333
function Tensor(const T_: TSingle2D;
3334
const Func_: TConstFunc<TdSingle2D, TdSingle3D>): TSingleM4;
3337
FP, FX, FY: TdSingle3D;
3360
AxisZ := CrossProduct(FX.d, FY.d);
3364
function Tensor(const T_: TDouble2D;
3365
const Func_: TConstFunc<TdDouble2D, TdDouble3D>): TDoubleM4;
3368
FP, FX, FY: TdDouble3D;
3391
AxisZ := CrossProduct(FX.d, FY.d);
3395
// ------------------------------------------------------------------------------
3397
function ArrowPose(const P0_, P1_: TSingle3D): TSingleM4;
3399
Result := ArrowRot(P0_, P1_);
3401
Result.AxisP := (P1_ + P0_) / 2;
3404
function ArrowPose(const P0_, P1_: TDouble3D): TDoubleM4;
3406
Result := ArrowRot(P0_, P1_);
3408
Result.AxisP := (P1_ + P0_) / 2;
3411
initialization // ------------------------------------------------------------