3
interface //#################################################################### ■
5
uses System.Math.Vectors,
6
LUX, LUX.D1, LUX.D2, LUX.D3, LUX.Matrix.L2, LUX.Matrix.L3;
8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
10
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
12
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIntegerM4
17
function GetM( const Y_,X_:Integer ) :Integer;
18
procedure SetM( const Y_,X_:Integer; const M_:Integer );
21
property M[ const Y_,X_:Integer ] :Integer read GetM write SetM; default;
23
0:( _ :array [ 1..4, 1..4 ] of Integer; );
24
1:( _11, _12, _13, _14,
27
_41, _42, _43, _44 :Integer; );
30
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleM4
35
function GetM( const Y_,X_:Integer ) :Single;
36
procedure SetM( const Y_,X_:Integer; const M_:Single );
37
function GetAxisX :TSingle3D;
38
procedure SetAxisX( const AxisX_:TSingle3D );
39
function GetAxisY :TSingle3D;
40
procedure SetAxisY( const AxisY_:TSingle3D );
41
function GetAxisZ :TSingle3D;
42
procedure SetAxisZ( const AxisZ_:TSingle3D );
43
function GetAxisP :TSingle3D;
44
procedure SetAxisP( const AxisP_:TSingle3D );
46
constructor Create( const _11_,_12_,_13_,_14_,
49
_41_,_42_,_43_,_44_ :Single ); overload;
50
constructor Create( const X_,Y_,Z_,P_:TSingle3D ); overload;
52
property M[ const Y_,X_:Integer ] :Single read GetM write SetM ; default;
53
property AxisX :TSingle3D read GetAxisX write SetAxisX;
54
property AxisY :TSingle3D read GetAxisY write SetAxisY;
55
property AxisZ :TSingle3D read GetAxisZ write SetAxisZ;
56
property AxisP :TSingle3D read GetAxisP write SetAxisP;
58
class operator Multiply( const A_,B_:TSingleM4 ) :TSingleM4;
59
class operator Multiply( const A_:Single; const B_:TSingleM4 ) :TSingleM4;
60
class operator Multiply( const A_:TSingleM4; const B_:Single ) :TSingleM4;
61
class operator Multiply( const A_:TSingleM4; const B_:TSingleRay3D ) :TSingleRay3D;
62
class operator Divide( const A_:TSingleM4; const B_:Single ) :TSingleM4;
64
class operator Implicit( const V_:Single ) :TSingleM4;
65
class operator Implicit( const V_:TMatrix3D ) :TSingleM4;
66
class operator Explicit( const V_:TSingleM4 ) :TMatrix3D;
67
class operator Implicit( const V_:TSingleM3 ) :TSingleM4;
68
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;
76
class function Translate( const X_,Y_,Z_:Single ) :TSingleM4; static;
77
class function Scale( const X_,Y_,Z_:Single ) :TSingleM4; static;
78
class function RotateX( const T_:Single ) :TSingleM4; static;
79
class function RotateY( const T_:Single ) :TSingleM4; static;
80
class function RotateZ( const T_:Single ) :TSingleM4; static;
81
class function Identify :TSingleM4; static;
84
0:( _ :array [ 1..4, 1..4 ] of Single; );
85
1:( _11, _12, _13, _14,
88
_41, _42, _43, _44 :Single; );
91
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleM4
96
function GetM( const Y_,X_:Integer ) :Double;
97
procedure SetM( const Y_,X_:Integer; const M_:Double );
98
function GetAxisX :TDouble3D;
99
procedure SetAxisX( const AxisX_:TDouble3D );
100
function GetAxisY :TDouble3D;
101
procedure SetAxisY( const AxisY_:TDouble3D );
102
function GetAxisZ :TDouble3D;
103
procedure SetAxisZ( const AxisZ_:TDouble3D );
104
function GetAxisP :TDouble3D;
105
procedure SetAxisP( const AxisP_:TDouble3D );
107
constructor Create( const _11_,_12_,_13_,_14_,
110
_41_,_42_,_43_,_44_ :Double ); overload;
111
constructor Create( const X_,Y_,Z_,P_:TDouble3D ); overload;
113
property M[ const Y_,X_:Integer ] :Double read GetM write SetM ; default;
114
property AxisX :TDouble3D read GetAxisX write SetAxisX;
115
property AxisY :TDouble3D read GetAxisY write SetAxisY;
116
property AxisZ :TDouble3D read GetAxisZ write SetAxisZ;
117
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 ) :TDoubleRay3D;
123
class operator Divide( const A_:TDoubleM4; const B_:Double ) :TDoubleM4;
125
class operator Implicit( const V_:Double ) :TDoubleM4;
126
class operator Implicit( const V_:TMatrix3D ) :TDoubleM4;
127
class operator Explicit( const V_:TDoubleM4 ) :TMatrix3D;
128
class operator Implicit( const V_:TSingleM4 ) :TDoubleM4;
129
class operator Explicit( const V_:TDoubleM4 ) :TSingleM4;
130
class operator Implicit( const V_:TDoubleM3 ) :TDoubleM4;
131
class operator Explicit( const V_:TDoubleM4 ) :TDoubleM3;
133
function MultPos( const B_:TDouble3D ) :TDouble3D;
134
function MultVec( const B_:TDouble3D ) :TDouble3D;
135
function Adjugate :TDoubleM4;
136
function Transpose :TDoubleM4;
137
function Inverse :TDoubleM4;
139
class function Translate( const X_,Y_,Z_:Double ) :TDoubleM4; static;
140
class function Scale( const X_,Y_,Z_:Double ) :TDoubleM4; static;
141
class function RotateX( const T_:Double ) :TDoubleM4; static;
142
class function RotateY( const T_:Double ) :TDoubleM4; static;
143
class function RotateZ( const T_:Double ) :TDoubleM4; static;
144
class function Identify :TDoubleM4; static;
147
0:( _ :array [ 1..4, 1..4 ] of Double; );
148
1:( _11, _12, _13, _14,
151
_41, _42, _43, _44 :Double; );
154
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdSingleM4
159
function GetM( const Y_,X_:Integer ) :TdSingle;
160
procedure SetM( const Y_,X_:Integer; const M_:TdSingle );
161
function GetAxisX :TdSingle3D;
162
procedure SetAxisX( const AxisX_:TdSingle3D );
163
function GetAxisY :TdSingle3D;
164
procedure SetAxisY( const AxisY_:TdSingle3D );
165
function GetAxisZ :TdSingle3D;
166
procedure SetAxisZ( const AxisZ_:TdSingle3D );
167
function GetAxisP :TdSingle3D;
168
procedure SetAxisP( const AxisP_:TdSingle3D );
170
constructor Create( const _11_,_12_,_13_,_14_,
173
_41_,_42_,_43_,_44_ :TdSingle ); overload;
174
constructor Create( const X_,Y_,Z_,P_:TdSingle3D ); overload;
176
property M[ const Y_,X_:Integer ] :TdSingle read GetM write SetM ; default;
177
property AxisX :TdSingle3D read GetAxisX write SetAxisX;
178
property AxisY :TdSingle3D read GetAxisY write SetAxisY;
179
property AxisZ :TdSingle3D read GetAxisZ write SetAxisZ;
180
property AxisP :TdSingle3D read GetAxisP write SetAxisP;
182
class operator Multiply( const A_,B_:TdSingleM4 ) :TdSingleM4;
183
class operator Multiply( const A_:TdSingle; const B_:TdSingleM4 ) :TdSingleM4;
184
class operator Multiply( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
185
class operator Divide( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
187
class operator Implicit( const V_:TdSingle ) :TdSingleM4;
188
class operator Implicit( const V_:TMatrix3D ) :TdSingleM4;
189
class operator Explicit( const V_:TdSingleM4 ) :TMatrix3D;
190
class operator Implicit( const V_:TdSingleM3 ) :TdSingleM4;
191
class operator Explicit( const V_:TdSingleM4 ) :TdSingleM3;
193
function MultPos( const B_:TdSingle3D ) :TdSingle3D;
194
function MultVec( const B_:TdSingle3D ) :TdSingle3D;
195
function Adjugate :TdSingleM4;
196
function Transpose :TdSingleM4;
197
function Inverse :TdSingleM4;
199
class function Translate( const X_,Y_,Z_:TdSingle ) :TdSingleM4; static;
200
class function Scale( const X_,Y_,Z_:TdSingle ) :TdSingleM4; static;
201
class function RotateX( const T_:TdSingle ) :TdSingleM4; static;
202
class function RotateY( const T_:TdSingle ) :TdSingleM4; static;
203
class function RotateZ( const T_:TdSingle ) :TdSingleM4; static;
204
class function Identify :TdSingleM4; static;
207
0:( _ :array [ 1..4, 1..4 ] of TdSingle; );
208
1:( _11, _12, _13, _14,
211
_41, _42, _43, _44 :TdSingle; );
214
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdDoubleM4
219
function GetM( const Y_,X_:Integer ) :TdDouble;
220
procedure SetM( const Y_,X_:Integer; const M_:TdDouble );
221
function GetAxisX :TdDouble3D;
222
procedure SetAxisX( const AxisX_:TdDouble3D );
223
function GetAxisY :TdDouble3D;
224
procedure SetAxisY( const AxisY_:TdDouble3D );
225
function GetAxisZ :TdDouble3D;
226
procedure SetAxisZ( const AxisZ_:TdDouble3D );
227
function GetAxisP :TdDouble3D;
228
procedure SetAxisP( const AxisP_:TdDouble3D );
230
constructor Create( const _11_,_12_,_13_,_14_,
233
_41_,_42_,_43_,_44_ :TdDouble ); overload;
234
constructor Create( const X_,Y_,Z_,P_:TdDouble3D ); overload;
236
property M[ const Y_,X_:Integer ] :TdDouble read GetM write SetM ; default;
237
property AxisX :TdDouble3D read GetAxisX write SetAxisX;
238
property AxisY :TdDouble3D read GetAxisY write SetAxisY;
239
property AxisZ :TdDouble3D read GetAxisZ write SetAxisZ;
240
property AxisP :TdDouble3D read GetAxisP write SetAxisP;
242
class operator Multiply( const A_,B_:TdDoubleM4 ) :TdDoubleM4;
243
class operator Multiply( const A_:TdDouble; const B_:TdDoubleM4 ) :TdDoubleM4;
244
class operator Multiply( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
245
class operator Divide( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
247
class operator Implicit( const V_:TdDouble ) :TdDoubleM4;
248
class operator Implicit( const V_:TMatrix3D ) :TdDoubleM4;
249
class operator Explicit( const V_:TdDoubleM4 ) :TMatrix3D;
250
class operator Implicit( const V_:TdSingleM4 ) :TdDoubleM4;
251
class operator Explicit( const V_:TdDoubleM4 ) :TdSingleM4;
252
class operator Implicit( const V_:TdDoubleM3 ) :TdDoubleM4;
253
class operator Explicit( const V_:TdDoubleM4 ) :TdDoubleM3;
255
function MultPos( const B_:TdDouble3D ) :TdDouble3D;
256
function MultVec( const B_:TdDouble3D ) :TdDouble3D;
257
function Adjugate :TdDoubleM4;
258
function Transpose :TdDoubleM4;
259
function Inverse :TdDoubleM4;
261
class function Translate( const X_,Y_,Z_:TdDouble ) :TdDoubleM4; static;
262
class function Scale( const X_,Y_,Z_:TdDouble ) :TdDoubleM4; static;
263
class function RotateX( const T_:TdDouble ) :TdDoubleM4; static;
264
class function RotateY( const T_:TdDouble ) :TdDoubleM4; static;
265
class function RotateZ( const T_:TdDouble ) :TdDoubleM4; static;
266
class function Identify :TdDoubleM4; static;
269
0:( _ :array [ 1..4, 1..4 ] of TdDouble; );
270
1:( _11, _12, _13, _14,
273
_41, _42, _43, _44 :TdDouble; );
276
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleDualM4
278
TSingleDualM4 = record
283
procedure Seto( const o_:TSingleM4 );
284
procedure Seti( const i_:TSingleM4 );
287
property o :TSingleM4 read _o write Seto;
288
property i :TSingleM4 read _i write Seti;
290
class operator Multiply( const A_,B_:TSingleDualM4 ) :TSingleDualM4;
291
class operator Multiply( const A_:Single; B_:TSingleDualM4 ) :TSingleDualM4;
292
class operator Multiply( const A_:TSingleDualM4; B_:Single ) :TSingleDualM4;
293
class operator Divide( const A_:TSingleDualM4; const B_:Single ) :TSingleDualM4;
295
class function Translate( const X_,Y_,Z_:Single ) :TSingleDualM4; static;
296
class function Scale( const X_,Y_,Z_:Single ) :TSingleDualM4; static;
297
class function RotateX( const T_:Single ) :TSingleDualM4; static;
298
class function RotateY( const T_:Single ) :TSingleDualM4; static;
299
class function RotateZ( const T_:Single ) :TSingleDualM4; static;
300
class function Identify :TSingleDualM4; static;
303
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
305
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
307
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
309
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
311
implementation //############################################################### ■
315
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
317
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIntegerM4
319
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
321
/////////////////////////////////////////////////////////////////////// アクセス
323
function TIntegerM4.GetM( const Y_,X_:Integer ) :Integer;
325
Result := _[ Y_, X_ ];
328
procedure TIntegerM4.SetM( const Y_,X_:Integer; const M_:Integer );
333
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
335
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleM4
337
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
339
/////////////////////////////////////////////////////////////////////// アクセス
341
function TSingleM4.GetM( const Y_,X_:Integer ) :Single;
343
Result := _[ Y_, X_ ];
346
procedure TSingleM4.SetM( const Y_,X_:Integer; const M_:Single );
351
//------------------------------------------------------------------------------
353
function TSingleM4.GetAxisX :TSingle3D;
363
procedure TSingleM4.SetAxisX( const AxisX_:TSingle3D );
373
function TSingleM4.GetAxisY :TSingle3D;
383
procedure TSingleM4.SetAxisY( const AxisY_:TSingle3D );
393
function TSingleM4.GetAxisZ :TSingle3D;
403
procedure TSingleM4.SetAxisZ( const AxisZ_:TSingle3D );
413
function TSingleM4.GetAxisP :TSingle3D;
423
procedure TSingleM4.SetAxisP( const AxisP_:TSingle3D );
433
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
435
constructor TSingleM4.Create( const _11_, _12_, _13_, _14_,
436
_21_, _22_, _23_, _24_,
437
_31_, _32_, _33_, _34_,
438
_41_, _42_, _43_, _44_ :Single );
440
_11 := _11_; _12 := _12_; _13 := _13_; _14 := _14_;
441
_21 := _21_; _22 := _22_; _23 := _23_; _24 := _24_;
442
_31 := _31_; _32 := _32_; _33 := _33_; _34 := _34_;
443
_41 := _41_; _42 := _42_; _43 := _43_; _44 := _44_;
446
constructor TSingleM4.Create( const X_,Y_,Z_:TSingle3D; const P_:TSingle3D );
448
_11 := X_.X; _12 := Y_.X; _13 := Z_.X; _14 := P_.X;
449
_21 := X_.Y; _22 := Y_.Y; _23 := Z_.Y; _24 := P_.Y;
450
_31 := X_.Z; _32 := Y_.Z; _33 := Z_.Z; _34 := P_.Z;
451
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
454
///////////////////////////////////////////////////////////////////////// 演算子
456
class operator TSingleM4.Multiply( const A_,B_:TSingleM4 ) :TSingleM4;
460
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14 * B_._41;
461
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14 * B_._42;
462
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14 * B_._43;
463
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14 * B_._44;
465
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24 * B_._41;
466
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24 * B_._42;
467
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24 * B_._43;
468
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24 * B_._44;
470
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34 * B_._41;
471
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34 * B_._42;
472
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34 * B_._43;
473
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34 * B_._44;
475
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44 * B_._41;
476
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44 * B_._42;
477
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44 * B_._43;
478
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44 * B_._44;
482
class operator TSingleM4.Multiply( const A_:Single; const B_:TSingleM4 ) :TSingleM4;
486
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13; _14 := A_ * B_._14;
487
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23; _24 := A_ * B_._24;
488
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33; _34 := A_ * B_._34;
489
_41 := A_ * B_._41; _42 := A_ * B_._42; _43 := A_ * B_._43; _44 := A_ * B_._44;
493
class operator TSingleM4.Multiply( const A_:TSingleM4; const B_:Single ) :TSingleM4;
497
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_; _14 := A_._14 * B_;
498
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_; _24 := A_._24 * B_;
499
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_; _34 := A_._34 * B_;
500
_41 := A_._41 * B_; _42 := A_._42 * B_; _43 := A_._43 * B_; _44 := A_._44 * B_;
504
class operator TSingleM4.Multiply( const A_:TSingleM4; const B_:TSingleRay3D ) :TSingleRay3D;
508
Pos := A_.MultPos( B_.Pos );
509
Vec := A_.MultVec( B_.Vec );
513
class operator TSingleM4.Divide( const A_:TSingleM4; const B_:Single ) :TSingleM4;
517
Result._11 := _11 / B_; Result._12 := _12 / B_; Result._13 := _13 / B_; Result._14 := _14 / B_;
518
Result._21 := _21 / B_; Result._22 := _22 / B_; Result._23 := _23 / B_; Result._24 := _24 / B_;
519
Result._31 := _31 / B_; Result._32 := _32 / B_; Result._33 := _33 / B_; Result._34 := _34 / B_;
520
Result._41 := _41 / B_; Result._42 := _42 / B_; Result._43 := _43 / B_; Result._44 := _44 / B_;
524
///////////////////////////////////////////////////////////////////////// 型変換
526
class operator TSingleM4.Implicit( const V_:Single ) :TSingleM4;
530
_11 := V_; _12 := 0 ; _13 := 0 ; _14 := 0 ;
531
_21 := 0 ; _22 := V_; _23 := 0 ; _24 := 0 ;
532
_31 := 0 ; _32 := 0 ; _33 := V_; _34 := 0 ;
533
_41 := 0 ; _42 := 0 ; _43 := 0 ; _44 := V_;
537
class operator TSingleM4.Implicit( const V_:TMatrix3D ) :TSingleM4;
541
_11 := +V_.m11; _12 := +V_.m21; _13 := +V_.m31; _14 := +V_.m41;
542
_21 := -V_.m12; _22 := -V_.m22; _23 := -V_.m32; _24 := -V_.m42;
543
_31 := -V_.m13; _32 := -V_.m23; _33 := -V_.m33; _34 := -V_.m43;
544
_41 := +V_.m14; _42 := +V_.m24; _43 := +V_.m34; _44 := +V_.m44;
548
class operator TSingleM4.Explicit( const V_:TSingleM4 ) :TMatrix3D;
552
m11 := +V_._11; m21 := +V_._12; m31 := +V_._13; m41 := +V_._14;
553
m12 := -V_._21; m22 := -V_._22; m32 := -V_._23; m42 := -V_._24;
554
m13 := -V_._31; m23 := -V_._32; m33 := -V_._33; m43 := -V_._34;
555
m14 := +V_._41; m24 := +V_._42; m34 := +V_._43; m44 := +V_._44;
559
class operator TSingleM4.Implicit( const V_:TSingleM3 ) :TSingleM4;
563
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := 0;
564
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := 0;
565
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := 0;
566
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
570
class operator TSingleM4.Explicit( const V_:TSingleM4 ) :TSingleM3;
574
_11 := V_._11; _12 := V_._12; _13 := V_._13;
575
_21 := V_._21; _22 := V_._22; _23 := V_._23;
576
_31 := V_._31; _32 := V_._32; _33 := V_._33;
580
////////////////////////////////////////////////////////////////////////////////
582
function TSingleM4.MultPos( const B_:TSingle3D ) :TSingle3D;
584
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
585
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
586
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
589
function TSingleM4.MultVec( const B_:TSingle3D ) :TSingle3D;
591
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
592
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
593
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
596
function TSingleM4.Adjugate :TSingleM4;
598
Result._11 := +TSingleM3.Create( {11} {12} {13} {14}
601
{41} _42, _43, _44 ).Det;
603
Result._21 := -TSingleM3.Create( {11} {12} {13} {14}
606
_41, {42} _43, _44 ).Det;
608
Result._31 := +TSingleM3.Create( {11} {12} {13} {14}
611
_41, _42, {43} _44 ).Det;
613
Result._41 := -TSingleM3.Create( {11} {12} {13} {14}
616
_41, _42, _43 {44} ).Det;
619
Result._12 := -TSingleM3.Create( {11} _12, _13, _14,
622
{41} _42, _43, _44 ).Det;
624
Result._22 := +TSingleM3.Create( _11, {12} _13, _14,
627
_41, {42} _43, _44 ).Det;
629
Result._32 := -TSingleM3.Create( _11, _12, {13} _14,
632
_41, _42, {43} _44 ).Det;
634
Result._42 := +TSingleM3.Create( _11, _12, _13, {14}
637
_41, _42, _43 {44} ).Det;
640
Result._13 := +TSingleM3.Create( {11} _12, _13, _14,
643
{41} _42, _43, _44 ).Det;
645
Result._23 := -TSingleM3.Create( _11, {12} _13, _14,
648
_41, {42} _43, _44 ).Det;
650
Result._33 := +TSingleM3.Create( _11, _12, {13} _14,
653
_41, _42, {43} _44 ).Det;
655
Result._43 := -TSingleM3.Create( _11, _12, _13, {14}
658
_41, _42, _43 {44} ).Det;
661
Result._14 := -TSingleM3.Create( {11} _12, _13, _14,
664
{41} {42} {43} {44} ).Det;
666
Result._24 := +TSingleM3.Create( _11, {12} _13, _14,
669
{41} {42} {43} {44} ).Det;
671
Result._34 := -TSingleM3.Create( _11, _12, {13} _14,
674
{41} {42} {43} {44} ).Det;
676
Result._44 := +TSingleM3.Create( _11, _12, _13, {14}
679
{41} {42} {43} {44} ).Det;
682
function TSingleM4.Transpose :TSingleM4;
684
Result._11 := _11; Result._12 := _21; Result._13 := _31; Result._14 := _41;
685
Result._21 := _12; Result._22 := _22; Result._23 := _32; Result._24 := _42;
686
Result._31 := _13; Result._32 := _23; Result._33 := _33; Result._34 := _43;
687
Result._41 := _14; Result._42 := _24; Result._43 := _34; Result._44 := _44;
690
function TSingleM4.Inverse :TSingleM4;
696
Result := A / ( _11 * A._11
702
class function TSingleM4.Translate( const X_,Y_,Z_:Single ) :TSingleM4;
706
_11 := 1; _12 := 0; _13 := 0; _14 := X_;
707
_21 := 0; _22 := 1; _23 := 0; _24 := Y_;
708
_31 := 0; _32 := 0; _33 := 1; _34 := Z_;
709
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
713
class function TSingleM4.Scale( const X_,Y_,Z_:Single ) :TSingleM4;
717
_11 := X_; _12 := 0; _13 := 0; _14 := 0;
718
_21 := 0; _22 := Y_; _23 := 0; _24 := 0;
719
_31 := 0; _32 := 0; _33 := Z_; _34 := 0;
720
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
724
class function TSingleM4.RotateX( const T_:Single ) :TSingleM4;
732
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
733
_21 := 0; _22 := C; _23 := -S; _24 := 0;
734
_31 := 0; _32 := +S; _33 := C; _34 := 0;
735
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
739
class function TSingleM4.RotateY( const T_:Single ) :TSingleM4;
747
_11 := C; _12 := 0; _13 := +S; _14 := 0;
748
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
749
_31 := -S; _32 := 0; _33 := C; _34 := 0;
750
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
754
class function TSingleM4.RotateZ( const T_:Single ) :TSingleM4;
762
_11 := C; _12 := -S; _13 := 0; _14 := 0;
763
_21 := +S; _22 := C; _23 := 0; _24 := 0;
764
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
765
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
769
class function TSingleM4.Identify :TSingleM4;
773
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
774
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
775
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
776
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
780
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleM4
782
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
784
/////////////////////////////////////////////////////////////////////// アクセス
786
function TDoubleM4.GetM( const Y_,X_:Integer ) :Double;
788
Result := _[ Y_, X_ ];
791
procedure TDoubleM4.SetM( const Y_,X_:Integer; const M_:Double );
796
//------------------------------------------------------------------------------
798
function TDoubleM4.GetAxisX :TDouble3D;
808
procedure TDoubleM4.SetAxisX( const AxisX_:TDouble3D );
818
function TDoubleM4.GetAxisY :TDouble3D;
828
procedure TDoubleM4.SetAxisY( const AxisY_:TDouble3D );
838
function TDoubleM4.GetAxisZ :TDouble3D;
848
procedure TDoubleM4.SetAxisZ( const AxisZ_:TDouble3D );
858
function TDoubleM4.GetAxisP :TDouble3D;
868
procedure TDoubleM4.SetAxisP( const AxisP_:TDouble3D );
878
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
880
constructor TDoubleM4.Create( const _11_, _12_, _13_, _14_,
881
_21_, _22_, _23_, _24_,
882
_31_, _32_, _33_, _34_,
883
_41_, _42_, _43_, _44_ :Double );
885
_11 := _11_; _12 := _12_; _13 := _13_; _14 := _14_;
886
_21 := _21_; _22 := _22_; _23 := _23_; _24 := _24_;
887
_31 := _31_; _32 := _32_; _33 := _33_; _34 := _34_;
888
_41 := _41_; _42 := _42_; _43 := _43_; _44 := _44_;
891
constructor TDoubleM4.Create( const X_,Y_,Z_,P_:TDouble3D );
893
_11 := X_.X; _12 := Y_.X; _13 := Z_.X; _14 := P_.X;
894
_21 := X_.Y; _22 := Y_.Y; _23 := Z_.Y; _24 := P_.Y;
895
_31 := X_.Z; _32 := Y_.Z; _33 := Z_.Z; _34 := P_.Z;
896
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
899
///////////////////////////////////////////////////////////////////////// 演算子
901
class operator TDoubleM4.Multiply( const A_,B_:TDoubleM4 ) :TDoubleM4;
905
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14 * B_._41;
906
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14 * B_._42;
907
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14 * B_._43;
908
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14 * B_._44;
910
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24 * B_._41;
911
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24 * B_._42;
912
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24 * B_._43;
913
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24 * B_._44;
915
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34 * B_._41;
916
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34 * B_._42;
917
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34 * B_._43;
918
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34 * B_._44;
920
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44 * B_._41;
921
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44 * B_._42;
922
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44 * B_._43;
923
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44 * B_._44;
927
class operator TDoubleM4.Multiply( const A_:Double; const B_:TDoubleM4 ) :TDoubleM4;
931
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13; _14 := A_ * B_._14;
932
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23; _24 := A_ * B_._24;
933
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33; _34 := A_ * B_._34;
934
_41 := A_ * B_._41; _42 := A_ * B_._42; _43 := A_ * B_._43; _44 := A_ * B_._44;
938
class operator TDoubleM4.Multiply( const A_:TDoubleM4; const B_:Double ) :TDoubleM4;
942
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_; _14 := A_._14 * B_;
943
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_; _24 := A_._24 * B_;
944
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_; _34 := A_._34 * B_;
945
_41 := A_._41 * B_; _42 := A_._42 * B_; _43 := A_._43 * B_; _44 := A_._44 * B_;
949
class operator TDoubleM4.Multiply( const A_:TDoubleM4; const B_:TDoubleRay3D ) :TDoubleRay3D;
953
Pos := A_.MultPos( B_.Pos );
954
Vec := A_.MultVec( B_.Vec );
958
class operator TDoubleM4.Divide( const A_:TDoubleM4; const B_:Double ) :TDoubleM4;
962
Result._11 := _11 / B_; Result._12 := _12 / B_; Result._13 := _13 / B_; Result._14 := _14 / B_;
963
Result._21 := _21 / B_; Result._22 := _22 / B_; Result._23 := _23 / B_; Result._24 := _24 / B_;
964
Result._31 := _31 / B_; Result._32 := _32 / B_; Result._33 := _33 / B_; Result._34 := _34 / B_;
965
Result._41 := _41 / B_; Result._42 := _42 / B_; Result._43 := _43 / B_; Result._44 := _44 / B_;
969
///////////////////////////////////////////////////////////////////////// 型変換
971
class operator TDoubleM4.Implicit( const V_:Double ) :TDoubleM4;
975
_11 := V_; _12 := 0 ; _13 := 0 ; _14 := 0 ;
976
_21 := 0 ; _22 := V_; _23 := 0 ; _24 := 0 ;
977
_31 := 0 ; _32 := 0 ; _33 := V_; _34 := 0 ;
978
_41 := 0 ; _42 := 0 ; _43 := 0 ; _44 := V_;
982
class operator TDoubleM4.Implicit( const V_:TMatrix3D ) :TDoubleM4;
986
_11 := +V_.m11; _12 := +V_.m21; _13 := +V_.m31; _14 := +V_.m41;
987
_21 := -V_.m12; _22 := -V_.m22; _23 := -V_.m32; _24 := -V_.m42;
988
_31 := -V_.m13; _32 := -V_.m23; _33 := -V_.m33; _34 := -V_.m43;
989
_41 := +V_.m14; _42 := +V_.m24; _43 := +V_.m34; _44 := +V_.m44;
993
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TMatrix3D;
997
m11 := +V_._11; m21 := +V_._12; m31 := +V_._13; m41 := +V_._14;
998
m12 := -V_._21; m22 := -V_._22; m32 := -V_._23; m42 := -V_._24;
999
m13 := -V_._31; m23 := -V_._32; m33 := -V_._33; m43 := -V_._34;
1000
m14 := +V_._41; m24 := +V_._42; m34 := +V_._43; m44 := +V_._44;
1004
class operator TDoubleM4.Implicit( const V_:TSingleM4 ) :TDoubleM4;
1008
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := V_._14;
1009
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := V_._24;
1010
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := V_._34;
1011
_41 := V_._41; _42 := V_._42; _43 := V_._43; _44 := V_._44;
1015
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TSingleM4;
1019
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := V_._14;
1020
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := V_._24;
1021
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := V_._34;
1022
_41 := V_._41; _42 := V_._42; _43 := V_._43; _44 := V_._44;
1026
class operator TDoubleM4.Implicit( const V_:TDoubleM3 ) :TDoubleM4;
1030
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := 0;
1031
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := 0;
1032
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := 0;
1033
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1037
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TDoubleM3;
1041
_11 := V_._11; _12 := V_._12; _13 := V_._13;
1042
_21 := V_._21; _22 := V_._22; _23 := V_._23;
1043
_31 := V_._31; _32 := V_._32; _33 := V_._33;
1047
////////////////////////////////////////////////////////////////////////////////
1049
function TDoubleM4.MultPos( const B_:TDouble3D ) :TDouble3D;
1051
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
1052
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
1053
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
1056
function TDoubleM4.MultVec( const B_:TDouble3D ) :TDouble3D;
1058
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
1059
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
1060
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
1063
function TDoubleM4.Adjugate :TDoubleM4;
1065
Result._11 := +TDoubleM3.Create( {11} {12} {13} {14}
1068
{41} _42, _43, _44 ).Det;
1070
Result._21 := -TDoubleM3.Create( {11} {12} {13} {14}
1073
_41, {42} _43, _44 ).Det;
1075
Result._31 := +TDoubleM3.Create( {11} {12} {13} {14}
1078
_41, _42, {43} _44 ).Det;
1080
Result._41 := -TDoubleM3.Create( {11} {12} {13} {14}
1083
_41, _42, _43 {44} ).Det;
1086
Result._12 := -TDoubleM3.Create( {11} _12, _13, _14,
1089
{41} _42, _43, _44 ).Det;
1091
Result._22 := +TDoubleM3.Create( _11, {12} _13, _14,
1094
_41, {42} _43, _44 ).Det;
1096
Result._32 := -TDoubleM3.Create( _11, _12, {13} _14,
1099
_41, _42, {43} _44 ).Det;
1101
Result._42 := +TDoubleM3.Create( _11, _12, _13, {14}
1104
_41, _42, _43 {44} ).Det;
1107
Result._13 := +TDoubleM3.Create( {11} _12, _13, _14,
1110
{41} _42, _43, _44 ).Det;
1112
Result._23 := -TDoubleM3.Create( _11, {12} _13, _14,
1115
_41, {42} _43, _44 ).Det;
1117
Result._33 := +TDoubleM3.Create( _11, _12, {13} _14,
1120
_41, _42, {43} _44 ).Det;
1122
Result._43 := -TDoubleM3.Create( _11, _12, _13, {14}
1125
_41, _42, _43 {44} ).Det;
1128
Result._14 := -TDoubleM3.Create( {11} _12, _13, _14,
1131
{41} {42} {43} {44} ).Det;
1133
Result._24 := +TDoubleM3.Create( _11, {12} _13, _14,
1136
{41} {42} {43} {44} ).Det;
1138
Result._34 := -TDoubleM3.Create( _11, _12, {13} _14,
1141
{41} {42} {43} {44} ).Det;
1143
Result._44 := +TDoubleM3.Create( _11, _12, _13, {14}
1146
{41} {42} {43} {44} ).Det;
1149
function TDoubleM4.Transpose :TDoubleM4;
1151
Result._11 := _11; Result._12 := _21; Result._13 := _31; Result._14 := _41;
1152
Result._21 := _12; Result._22 := _22; Result._23 := _32; Result._24 := _42;
1153
Result._31 := _13; Result._32 := _23; Result._33 := _33; Result._34 := _43;
1154
Result._41 := _14; Result._42 := _24; Result._43 := _34; Result._44 := _44;
1157
function TDoubleM4.Inverse :TDoubleM4;
1163
Result := A / ( _11 * A._11
1169
/////////////////////////////////////////////////////////////////////////// 定数
1171
class function TDoubleM4.Translate( const X_,Y_,Z_:Double ) :TDoubleM4;
1175
_11 := 1; _12 := 0; _13 := 0; _14 := X_;
1176
_21 := 0; _22 := 1; _23 := 0; _24 := Y_;
1177
_31 := 0; _32 := 0; _33 := 1; _34 := Z_;
1178
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1182
class function TDoubleM4.Scale( const X_,Y_,Z_:Double ) :TDoubleM4;
1186
_11 := X_; _12 := 0; _13 := 0; _14 := 0;
1187
_21 := 0; _22 := Y_; _23 := 0; _24 := 0;
1188
_31 := 0; _32 := 0; _33 := Z_; _34 := 0;
1189
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1193
class function TDoubleM4.RotateX( const T_:Double ) :TDoubleM4;
1201
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
1202
_21 := 0; _22 := C; _23 := -S; _24 := 0;
1203
_31 := 0; _32 := +S; _33 := C; _34 := 0;
1204
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1208
class function TDoubleM4.RotateY( const T_:Double ) :TDoubleM4;
1216
_11 := C; _12 := 0; _13 := +S; _14 := 0;
1217
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
1218
_31 := -S; _32 := 0; _33 := C; _34 := 0;
1219
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1223
class function TDoubleM4.RotateZ( const T_:Double ) :TDoubleM4;
1231
_11 := C; _12 := -S; _13 := 0; _14 := 0;
1232
_21 := +S; _22 := C; _23 := 0; _24 := 0;
1233
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
1234
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1238
class function TDoubleM4.Identify :TDoubleM4;
1242
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
1243
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
1244
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
1245
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1249
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdSingleM4
1251
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1253
/////////////////////////////////////////////////////////////////////// アクセス
1255
function TdSingleM4.GetM( const Y_,X_:Integer ) :TdSingle;
1257
Result := _[ Y_, X_ ];
1260
procedure TdSingleM4.SetM( const Y_,X_:Integer; const M_:TdSingle );
1265
//------------------------------------------------------------------------------
1267
function TdSingleM4.GetAxisX :TdSingle3D;
1277
procedure TdSingleM4.SetAxisX( const AxisX_:TdSingle3D );
1287
function TdSingleM4.GetAxisY :TdSingle3D;
1297
procedure TdSingleM4.SetAxisY( const AxisY_:TdSingle3D );
1307
function TdSingleM4.GetAxisZ :TdSingle3D;
1317
procedure TdSingleM4.SetAxisZ( const AxisZ_:TdSingle3D );
1327
function TdSingleM4.GetAxisP :TdSingle3D;
1337
procedure TdSingleM4.SetAxisP( const AxisP_:TdSingle3D );
1347
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1349
constructor TdSingleM4.Create( const _11_,_12_,_13_,_14_,
1350
_21_,_22_,_23_,_24_,
1351
_31_,_32_,_33_,_34_,
1352
_41_,_42_,_43_,_44_ :TdSingle );
1354
_11 := _11_; _12 := _12_; _13 := _13_; _14 := _14_;
1355
_21 := _21_; _22 := _22_; _23 := _23_; _24 := _24_;
1356
_31 := _31_; _32 := _32_; _33 := _33_; _34 := _34_;
1357
_41 := _41_; _42 := _42_; _43 := _43_; _44 := _44_;
1360
constructor TdSingleM4.Create( const X_,Y_,Z_:TdSingle3D; const P_:TdSingle3D );
1362
_11 := X_.X; _12 := Y_.X; _13 := Z_.X; _14 := P_.X;
1363
_21 := X_.Y; _22 := Y_.Y; _23 := Z_.Y; _24 := P_.Y;
1364
_31 := X_.Z; _32 := Y_.Z; _33 := Z_.Z; _34 := P_.Z;
1365
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1368
///////////////////////////////////////////////////////////////////////// 演算子
1370
class operator TdSingleM4.Multiply( const A_,B_:TdSingleM4 ) :TdSingleM4;
1374
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14 * B_._41;
1375
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14 * B_._42;
1376
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14 * B_._43;
1377
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14 * B_._44;
1379
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24 * B_._41;
1380
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24 * B_._42;
1381
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24 * B_._43;
1382
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24 * B_._44;
1384
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34 * B_._41;
1385
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34 * B_._42;
1386
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34 * B_._43;
1387
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34 * B_._44;
1389
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44 * B_._41;
1390
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44 * B_._42;
1391
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44 * B_._43;
1392
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44 * B_._44;
1396
class operator TdSingleM4.Multiply( const A_:TdSingle; const B_:TdSingleM4 ) :TdSingleM4;
1400
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13; _14 := A_ * B_._14;
1401
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23; _24 := A_ * B_._24;
1402
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33; _34 := A_ * B_._34;
1403
_41 := A_ * B_._41; _42 := A_ * B_._42; _43 := A_ * B_._43; _44 := A_ * B_._44;
1407
class operator TdSingleM4.Multiply( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
1411
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_; _14 := A_._14 * B_;
1412
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_; _24 := A_._24 * B_;
1413
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_; _34 := A_._34 * B_;
1414
_41 := A_._41 * B_; _42 := A_._42 * B_; _43 := A_._43 * B_; _44 := A_._44 * B_;
1418
class operator TdSingleM4.Divide( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
1422
Result._11 := _11 / B_; Result._12 := _12 / B_; Result._13 := _13 / B_; Result._14 := _14 / B_;
1423
Result._21 := _21 / B_; Result._22 := _22 / B_; Result._23 := _23 / B_; Result._24 := _24 / B_;
1424
Result._31 := _31 / B_; Result._32 := _32 / B_; Result._33 := _33 / B_; Result._34 := _34 / B_;
1425
Result._41 := _41 / B_; Result._42 := _42 / B_; Result._43 := _43 / B_; Result._44 := _44 / B_;
1429
///////////////////////////////////////////////////////////////////////// 型変換
1431
class operator TdSingleM4.Implicit( const V_:TdSingle ) :TdSingleM4;
1435
_11 := V_; _12 := 0 ; _13 := 0 ; _14 := 0 ;
1436
_21 := 0 ; _22 := V_; _23 := 0 ; _24 := 0 ;
1437
_31 := 0 ; _32 := 0 ; _33 := V_; _34 := 0 ;
1438
_41 := 0 ; _42 := 0 ; _43 := 0 ; _44 := V_;
1442
class operator TdSingleM4.Implicit( const V_:TMatrix3D ) :TdSingleM4;
1446
_11 := +V_.m11; _12 := +V_.m21; _13 := +V_.m31; _14 := +V_.m41;
1447
_21 := -V_.m12; _22 := -V_.m22; _23 := -V_.m32; _24 := -V_.m42;
1448
_31 := -V_.m13; _32 := -V_.m23; _33 := -V_.m33; _34 := -V_.m43;
1449
_41 := +V_.m14; _42 := +V_.m24; _43 := +V_.m34; _44 := +V_.m44;
1453
class operator TdSingleM4.Explicit( const V_:TdSingleM4 ) :TMatrix3D;
1457
m11 := +V_._11.o; m21 := +V_._12.o; m31 := +V_._13.o; m41 := +V_._14.o;
1458
m12 := -V_._21.o; m22 := -V_._22.o; m32 := -V_._23.o; m42 := -V_._24.o;
1459
m13 := -V_._31.o; m23 := -V_._32.o; m33 := -V_._33.o; m43 := -V_._34.o;
1460
m14 := +V_._41.o; m24 := +V_._42.o; m34 := +V_._43.o; m44 := +V_._44.o;
1464
class operator TdSingleM4.Implicit( const V_:TdSingleM3 ) :TdSingleM4;
1468
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := 0;
1469
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := 0;
1470
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := 0;
1471
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1475
class operator TdSingleM4.Explicit( const V_:TdSingleM4 ) :TdSingleM3;
1479
_11 := V_._11; _12 := V_._12; _13 := V_._13;
1480
_21 := V_._21; _22 := V_._22; _23 := V_._23;
1481
_31 := V_._31; _32 := V_._32; _33 := V_._33;
1485
////////////////////////////////////////////////////////////////////////////////
1487
function TdSingleM4.MultPos( const B_:TdSingle3D ) :TdSingle3D;
1489
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
1490
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
1491
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
1494
function TdSingleM4.MultVec( const B_:TdSingle3D ) :TdSingle3D;
1496
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
1497
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
1498
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
1501
function TdSingleM4.Adjugate :TdSingleM4;
1503
Result._11 := +TdSingleM3.Create( {11} {12} {13} {14}
1506
{41} _42, _43, _44 ).Det;
1508
Result._21 := -TdSingleM3.Create( {11} {12} {13} {14}
1511
_41, {42} _43, _44 ).Det;
1513
Result._31 := +TdSingleM3.Create( {11} {12} {13} {14}
1516
_41, _42, {43} _44 ).Det;
1518
Result._41 := -TdSingleM3.Create( {11} {12} {13} {14}
1521
_41, _42, _43 {44} ).Det;
1524
Result._12 := -TdSingleM3.Create( {11} _12, _13, _14,
1527
{41} _42, _43, _44 ).Det;
1529
Result._22 := +TdSingleM3.Create( _11, {12} _13, _14,
1532
_41, {42} _43, _44 ).Det;
1534
Result._32 := -TdSingleM3.Create( _11, _12, {13} _14,
1537
_41, _42, {43} _44 ).Det;
1539
Result._42 := +TdSingleM3.Create( _11, _12, _13, {14}
1542
_41, _42, _43 {44} ).Det;
1545
Result._13 := +TdSingleM3.Create( {11} _12, _13, _14,
1548
{41} _42, _43, _44 ).Det;
1550
Result._23 := -TdSingleM3.Create( _11, {12} _13, _14,
1553
_41, {42} _43, _44 ).Det;
1555
Result._33 := +TdSingleM3.Create( _11, _12, {13} _14,
1558
_41, _42, {43} _44 ).Det;
1560
Result._43 := -TdSingleM3.Create( _11, _12, _13, {14}
1563
_41, _42, _43 {44} ).Det;
1566
Result._14 := -TdSingleM3.Create( {11} _12, _13, _14,
1569
{41} {42} {43} {44} ).Det;
1571
Result._24 := +TdSingleM3.Create( _11, {12} _13, _14,
1574
{41} {42} {43} {44} ).Det;
1576
Result._34 := -TdSingleM3.Create( _11, _12, {13} _14,
1579
{41} {42} {43} {44} ).Det;
1581
Result._44 := +TdSingleM3.Create( _11, _12, _13, {14}
1584
{41} {42} {43} {44} ).Det;
1587
function TdSingleM4.Transpose :TdSingleM4;
1589
Result._11 := _11; Result._12 := _21; Result._13 := _31; Result._14 := _41;
1590
Result._21 := _12; Result._22 := _22; Result._23 := _32; Result._24 := _42;
1591
Result._31 := _13; Result._32 := _23; Result._33 := _33; Result._34 := _43;
1592
Result._41 := _14; Result._42 := _24; Result._43 := _34; Result._44 := _44;
1595
function TdSingleM4.Inverse :TdSingleM4;
1601
Result := A / ( _11 * A._11
1607
class function TdSingleM4.Translate( const X_,Y_,Z_:TdSingle ) :TdSingleM4;
1611
_11 := 1; _12 := 0; _13 := 0; _14 := X_;
1612
_21 := 0; _22 := 1; _23 := 0; _24 := Y_;
1613
_31 := 0; _32 := 0; _33 := 1; _34 := Z_;
1614
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1618
class function TdSingleM4.Scale( const X_,Y_,Z_:TdSingle ) :TdSingleM4;
1622
_11 := X_; _12 := 0; _13 := 0; _14 := 0;
1623
_21 := 0; _22 := Y_; _23 := 0; _24 := 0;
1624
_31 := 0; _32 := 0; _33 := Z_; _34 := 0;
1625
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1629
class function TdSingleM4.RotateX( const T_:TdSingle ) :TdSingleM4;
1637
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
1638
_21 := 0; _22 := C; _23 := -S; _24 := 0;
1639
_31 := 0; _32 := +S; _33 := C; _34 := 0;
1640
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1644
class function TdSingleM4.RotateY( const T_:TdSingle ) :TdSingleM4;
1652
_11 := C; _12 := 0; _13 := +S; _14 := 0;
1653
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
1654
_31 := -S; _32 := 0; _33 := C; _34 := 0;
1655
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1659
class function TdSingleM4.RotateZ( const T_:TdSingle ) :TdSingleM4;
1667
_11 := C; _12 := -S; _13 := 0; _14 := 0;
1668
_21 := +S; _22 := C; _23 := 0; _24 := 0;
1669
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
1670
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1674
class function TdSingleM4.Identify :TdSingleM4;
1678
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
1679
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
1680
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
1681
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1685
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdDoubleM4
1687
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1689
/////////////////////////////////////////////////////////////////////// アクセス
1691
function TdDoubleM4.GetM( const Y_,X_:Integer ) :TdDouble;
1693
Result := _[ Y_, X_ ];
1696
procedure TdDoubleM4.SetM( const Y_,X_:Integer; const M_:TdDouble );
1701
//------------------------------------------------------------------------------
1703
function TdDoubleM4.GetAxisX :TdDouble3D;
1713
procedure TdDoubleM4.SetAxisX( const AxisX_:TdDouble3D );
1723
function TdDoubleM4.GetAxisY :TdDouble3D;
1733
procedure TdDoubleM4.SetAxisY( const AxisY_:TdDouble3D );
1743
function TdDoubleM4.GetAxisZ :TdDouble3D;
1753
procedure TdDoubleM4.SetAxisZ( const AxisZ_:TdDouble3D );
1763
function TdDoubleM4.GetAxisP :TdDouble3D;
1773
procedure TdDoubleM4.SetAxisP( const AxisP_:TdDouble3D );
1783
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1785
constructor TdDoubleM4.Create( const _11_,_12_,_13_,_14_,
1786
_21_,_22_,_23_,_24_,
1787
_31_,_32_,_33_,_34_,
1788
_41_,_42_,_43_,_44_ :TdDouble );
1790
_11 := _11_; _12 := _12_; _13 := _13_; _14 := _14_;
1791
_21 := _21_; _22 := _22_; _23 := _23_; _24 := _24_;
1792
_31 := _31_; _32 := _32_; _33 := _33_; _34 := _34_;
1793
_41 := _41_; _42 := _42_; _43 := _43_; _44 := _44_;
1796
constructor TdDoubleM4.Create( const X_,Y_,Z_,P_:TdDouble3D );
1798
_11 := X_.X; _12 := Y_.X; _13 := Z_.X; _14 := P_.X;
1799
_21 := X_.Y; _22 := Y_.Y; _23 := Z_.Y; _24 := P_.Y;
1800
_31 := X_.Z; _32 := Y_.Z; _33 := Z_.Z; _34 := P_.Z;
1801
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1804
///////////////////////////////////////////////////////////////////////// 演算子
1806
class operator TdDoubleM4.Multiply( const A_,B_:TdDoubleM4 ) :TdDoubleM4;
1810
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31 + A_._14 * B_._41;
1811
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32 + A_._14 * B_._42;
1812
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33 + A_._14 * B_._43;
1813
_14 := A_._11 * B_._14 + A_._12 * B_._24 + A_._13 * B_._34 + A_._14 * B_._44;
1815
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31 + A_._24 * B_._41;
1816
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32 + A_._24 * B_._42;
1817
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33 + A_._24 * B_._43;
1818
_24 := A_._21 * B_._14 + A_._22 * B_._24 + A_._23 * B_._34 + A_._24 * B_._44;
1820
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31 + A_._34 * B_._41;
1821
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32 + A_._34 * B_._42;
1822
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33 + A_._34 * B_._43;
1823
_34 := A_._31 * B_._14 + A_._32 * B_._24 + A_._33 * B_._34 + A_._34 * B_._44;
1825
_41 := A_._41 * B_._11 + A_._42 * B_._21 + A_._43 * B_._31 + A_._44 * B_._41;
1826
_42 := A_._41 * B_._12 + A_._42 * B_._22 + A_._43 * B_._32 + A_._44 * B_._42;
1827
_43 := A_._41 * B_._13 + A_._42 * B_._23 + A_._43 * B_._33 + A_._44 * B_._43;
1828
_44 := A_._41 * B_._14 + A_._42 * B_._24 + A_._43 * B_._34 + A_._44 * B_._44;
1832
class operator TdDoubleM4.Multiply( const A_:TdDouble; const B_:TdDoubleM4 ) :TdDoubleM4;
1836
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13; _14 := A_ * B_._14;
1837
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23; _24 := A_ * B_._24;
1838
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33; _34 := A_ * B_._34;
1839
_41 := A_ * B_._41; _42 := A_ * B_._42; _43 := A_ * B_._43; _44 := A_ * B_._44;
1843
class operator TdDoubleM4.Multiply( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
1847
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_; _14 := A_._14 * B_;
1848
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_; _24 := A_._24 * B_;
1849
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_; _34 := A_._34 * B_;
1850
_41 := A_._41 * B_; _42 := A_._42 * B_; _43 := A_._43 * B_; _44 := A_._44 * B_;
1854
class operator TdDoubleM4.Divide( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
1858
Result._11 := _11 / B_; Result._12 := _12 / B_; Result._13 := _13 / B_; Result._14 := _14 / B_;
1859
Result._21 := _21 / B_; Result._22 := _22 / B_; Result._23 := _23 / B_; Result._24 := _24 / B_;
1860
Result._31 := _31 / B_; Result._32 := _32 / B_; Result._33 := _33 / B_; Result._34 := _34 / B_;
1861
Result._41 := _41 / B_; Result._42 := _42 / B_; Result._43 := _43 / B_; Result._44 := _44 / B_;
1865
///////////////////////////////////////////////////////////////////////// 型変換
1867
class operator TdDoubleM4.Implicit( const V_:TdDouble ) :TdDoubleM4;
1871
_11 := V_; _12 := 0 ; _13 := 0 ; _14 := 0 ;
1872
_21 := 0 ; _22 := V_; _23 := 0 ; _24 := 0 ;
1873
_31 := 0 ; _32 := 0 ; _33 := V_; _34 := 0 ;
1874
_41 := 0 ; _42 := 0 ; _43 := 0 ; _44 := V_;
1878
class operator TdDoubleM4.Implicit( const V_:TMatrix3D ) :TdDoubleM4;
1882
_11 := +V_.m11; _12 := +V_.m21; _13 := +V_.m31; _14 := +V_.m41;
1883
_21 := -V_.m12; _22 := -V_.m22; _23 := -V_.m32; _24 := -V_.m42;
1884
_31 := -V_.m13; _32 := -V_.m23; _33 := -V_.m33; _34 := -V_.m43;
1885
_41 := +V_.m14; _42 := +V_.m24; _43 := +V_.m34; _44 := +V_.m44;
1889
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TMatrix3D;
1893
m11 := +V_._11.o; m21 := +V_._12.o; m31 := +V_._13.o; m41 := +V_._14.o;
1894
m12 := -V_._21.o; m22 := -V_._22.o; m32 := -V_._23.o; m42 := -V_._24.o;
1895
m13 := -V_._31.o; m23 := -V_._32.o; m33 := -V_._33.o; m43 := -V_._34.o;
1896
m14 := +V_._41.o; m24 := +V_._42.o; m34 := +V_._43.o; m44 := +V_._44.o;
1900
class operator TdDoubleM4.Implicit( const V_:TdSingleM4 ) :TdDoubleM4;
1904
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := V_._14;
1905
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := V_._24;
1906
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := V_._34;
1907
_41 := V_._41; _42 := V_._42; _43 := V_._43; _44 := V_._44;
1911
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TdSingleM4;
1915
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := V_._14;
1916
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := V_._24;
1917
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := V_._34;
1918
_41 := V_._41; _42 := V_._42; _43 := V_._43; _44 := V_._44;
1922
class operator TdDoubleM4.Implicit( const V_:TdDoubleM3 ) :TdDoubleM4;
1926
_11 := V_._11; _12 := V_._12; _13 := V_._13; _14 := 0;
1927
_21 := V_._21; _22 := V_._22; _23 := V_._23; _24 := 0;
1928
_31 := V_._31; _32 := V_._32; _33 := V_._33; _34 := 0;
1929
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
1933
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TdDoubleM3;
1937
_11 := V_._11; _12 := V_._12; _13 := V_._13;
1938
_21 := V_._21; _22 := V_._22; _23 := V_._23;
1939
_31 := V_._31; _32 := V_._32; _33 := V_._33;
1943
////////////////////////////////////////////////////////////////////////////////
1945
function TdDoubleM4.MultPos( const B_:TdDouble3D ) :TdDouble3D;
1947
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z + _14;
1948
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z + _24;
1949
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z + _34;
1952
function TdDoubleM4.MultVec( const B_:TdDouble3D ) :TdDouble3D;
1954
Result.X := _11 * B_.X + _12 * B_.Y + _13 * B_.Z;
1955
Result.Y := _21 * B_.X + _22 * B_.Y + _23 * B_.Z;
1956
Result.Z := _31 * B_.X + _32 * B_.Y + _33 * B_.Z;
1959
function TdDoubleM4.Adjugate :TdDoubleM4;
1961
Result._11 := +TdDoubleM3.Create( {11} {12} {13} {14}
1964
{41} _42, _43, _44 ).Det;
1966
Result._21 := -TdDoubleM3.Create( {11} {12} {13} {14}
1969
_41, {42} _43, _44 ).Det;
1971
Result._31 := +TdDoubleM3.Create( {11} {12} {13} {14}
1974
_41, _42, {43} _44 ).Det;
1976
Result._41 := -TdDoubleM3.Create( {11} {12} {13} {14}
1979
_41, _42, _43 {44} ).Det;
1982
Result._12 := -TdDoubleM3.Create( {11} _12, _13, _14,
1985
{41} _42, _43, _44 ).Det;
1987
Result._22 := +TdDoubleM3.Create( _11, {12} _13, _14,
1990
_41, {42} _43, _44 ).Det;
1992
Result._32 := -TdDoubleM3.Create( _11, _12, {13} _14,
1995
_41, _42, {43} _44 ).Det;
1997
Result._42 := +TdDoubleM3.Create( _11, _12, _13, {14}
2000
_41, _42, _43 {44} ).Det;
2003
Result._13 := +TdDoubleM3.Create( {11} _12, _13, _14,
2006
{41} _42, _43, _44 ).Det;
2008
Result._23 := -TdDoubleM3.Create( _11, {12} _13, _14,
2011
_41, {42} _43, _44 ).Det;
2013
Result._33 := +TdDoubleM3.Create( _11, _12, {13} _14,
2016
_41, _42, {43} _44 ).Det;
2018
Result._43 := -TdDoubleM3.Create( _11, _12, _13, {14}
2021
_41, _42, _43 {44} ).Det;
2024
Result._14 := -TdDoubleM3.Create( {11} _12, _13, _14,
2027
{41} {42} {43} {44} ).Det;
2029
Result._24 := +TdDoubleM3.Create( _11, {12} _13, _14,
2032
{41} {42} {43} {44} ).Det;
2034
Result._34 := -TdDoubleM3.Create( _11, _12, {13} _14,
2037
{41} {42} {43} {44} ).Det;
2039
Result._44 := +TdDoubleM3.Create( _11, _12, _13, {14}
2042
{41} {42} {43} {44} ).Det;
2045
function TdDoubleM4.Transpose :TdDoubleM4;
2047
Result._11 := _11; Result._12 := _21; Result._13 := _31; Result._14 := _41;
2048
Result._21 := _12; Result._22 := _22; Result._23 := _32; Result._24 := _42;
2049
Result._31 := _13; Result._32 := _23; Result._33 := _33; Result._34 := _43;
2050
Result._41 := _14; Result._42 := _24; Result._43 := _34; Result._44 := _44;
2053
function TdDoubleM4.Inverse :TdDoubleM4;
2059
Result := A / ( _11 * A._11
2065
/////////////////////////////////////////////////////////////////////////// 定数
2067
class function TdDoubleM4.Translate( const X_,Y_,Z_:TdDouble ) :TdDoubleM4;
2071
_11 := 1; _12 := 0; _13 := 0; _14 := X_;
2072
_21 := 0; _22 := 1; _23 := 0; _24 := Y_;
2073
_31 := 0; _32 := 0; _33 := 1; _34 := Z_;
2074
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2078
class function TdDoubleM4.Scale( const X_,Y_,Z_:TdDouble ) :TdDoubleM4;
2082
_11 := X_; _12 := 0; _13 := 0; _14 := 0;
2083
_21 := 0; _22 := Y_; _23 := 0; _24 := 0;
2084
_31 := 0; _32 := 0; _33 := Z_; _34 := 0;
2085
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2089
class function TdDoubleM4.RotateX( const T_:TdDouble ) :TdDoubleM4;
2097
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
2098
_21 := 0; _22 := C; _23 := -S; _24 := 0;
2099
_31 := 0; _32 := +S; _33 := C; _34 := 0;
2100
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2104
class function TdDoubleM4.RotateY( const T_:TdDouble ) :TdDoubleM4;
2112
_11 := C; _12 := 0; _13 := +S; _14 := 0;
2113
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
2114
_31 := -S; _32 := 0; _33 := C; _34 := 0;
2115
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2119
class function TdDoubleM4.RotateZ( const T_:TdDouble ) :TdDoubleM4;
2127
_11 := C; _12 := -S; _13 := 0; _14 := 0;
2128
_21 := +S; _22 := C; _23 := 0; _24 := 0;
2129
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
2130
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2134
class function TdDoubleM4.Identify :TdDoubleM4;
2138
_11 := 1; _12 := 0; _13 := 0; _14 := 0;
2139
_21 := 0; _22 := 1; _23 := 0; _24 := 0;
2140
_31 := 0; _32 := 0; _33 := 1; _34 := 0;
2141
_41 := 0; _42 := 0; _43 := 0; _44 := 1;
2145
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleDualM4
2147
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
2149
/////////////////////////////////////////////////////////////////////// アクセス
2151
procedure TSingleDualM4.Seto( const o_:TSingleM4 );
2157
procedure TSingleDualM4.Seti( const i_:TSingleM4 );
2163
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
2165
///////////////////////////////////////////////////////////////////////// 演算子
2167
class operator TSingleDualM4.Multiply( const A_,B_:TSingleDualM4 ) :TSingleDualM4;
2176
class operator TSingleDualM4.Multiply( const A_:Single; B_:TSingleDualM4 ) :TSingleDualM4;
2185
class operator TSingleDualM4.Multiply( const A_:TSingleDualM4; B_:Single ) :TSingleDualM4;
2194
class operator TSingleDualM4.Divide( const A_:TSingleDualM4; const B_:Single ) :TSingleDualM4;
2203
/////////////////////////////////////////////////////////////////////////// 定数
2205
class function TSingleDualM4.Translate( const X_,Y_,Z_:Single ) :TSingleDualM4;
2209
_o := TSingleM4.Translate( +X_, +Y_, +Z_ );
2210
_i := TSingleM4.Translate( -X_, -Y_, -Z_ );
2214
class function TSingleDualM4.Scale( const X_,Y_,Z_:Single ) :TSingleDualM4;
2218
_o := TSingleM4.Scale( +X_, +Y_, +Z_ );
2219
_i := TSingleM4.Scale( -X_, -Y_, -Z_ );
2223
class function TSingleDualM4.RotateX( const T_:Single ) :TSingleDualM4;
2227
_o := TSingleM4.RotateX( +T_ );
2228
_i := TSingleM4.RotateX( -T_ );
2232
class function TSingleDualM4.RotateY( const T_:Single ) :TSingleDualM4;
2236
_o := TSingleM4.RotateY( +T_ );
2237
_i := TSingleM4.RotateY( -T_ );
2241
class function TSingleDualM4.RotateZ( const T_:Single ) :TSingleDualM4;
2245
_o := TSingleM4.RotateZ( +T_ );
2246
_i := TSingleM4.RotateZ( -T_ );
2250
class function TSingleDualM4.Identify :TSingleDualM4;
2254
_o := TSingleM4.Identify;
2255
_i := TSingleM4.Identify;
2259
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
2261
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
2263
//############################################################################## □
2265
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
2267
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
2269
end. //######################################################################### ■