16
function GetM( const Y_,X_:Integer ) :Single;
17
procedure SetM( const Y_,X_:Integer; const M_:Single );
18
function GetAxisX :TSingle3D;
19
procedure SetAxisX( const AxisX_:TSingle3D );
20
function GetAxisY :TSingle3D;
21
procedure SetAxisY( const AxisY_:TSingle3D );
22
function GetAxisZ :TSingle3D;
23
procedure SetAxisZ( const AxisZ_:TSingle3D );
24
function GetSum :Single;
26
constructor Create( const _11_,_12_,_13_,
28
_31_,_32_,_33_:Single );
29
property M[ const Y_,X_:Integer ] :Single read GetM write SetM ; default;
30
property AxisX :TSingle3D read GetAxisX write SetAxisX;
31
property AxisY :TSingle3D read GetAxisY write SetAxisY;
32
property AxisZ :TSingle3D read GetAxisZ write SetAxisZ;
33
property Sum :Single read GetSum;
34
class operator Negative( const V_:TSingleM3 ) :TSingleM3;
35
class operator Positive( const V_:TSingleM3 ) :TSingleM3;
36
class operator Add( const A_,B_:TSingleM3 ) :TSingleM3;
37
class operator Subtract( const A_,B_:TSingleM3 ) :TSingleM3;
38
class operator Multiply( const A_,B_:TSingleM3 ) :TSingleM3;
39
class operator Multiply( const A_:TSingleM3; const B_:Single ) :TSingleM3;
40
class operator Multiply( const A_:Single; const B_:TSingleM3 ) :TSingleM3;
41
class operator Multiply( const A_:TSingle3D; const B_:TSingleM3 ) :TSingle3D;
42
class operator Multiply( const A_:TSingleM3; const B_:TSingle3D ) :TSingle3D;
43
class operator Divide( const A_:TSingleM3; const B_:Single ) :TSingleM3;
44
function Transpose :TSingleM3;
46
function Adjugate :TSingleM3;
47
function Inverse :TSingleM3;
50
0:( _ :array [ 1..3, 1..3 ] of Single; );
53
_31, _32, _33 :Single; );
58
function GetM( const Y_,X_:Integer ) :Double;
59
procedure SetM( const Y_,X_:Integer; const M_:Double );
60
function GetAxisX :TDouble3D;
61
procedure SetAxisX( const AxisX_:TDouble3D );
62
function GetAxisY :TDouble3D;
63
procedure SetAxisY( const AxisY_:TDouble3D );
64
function GetAxisZ :TDouble3D;
65
procedure SetAxisZ( const AxisZ_:TDouble3D );
67
constructor Create( const _11_,_12_,_13_,
69
_31_,_32_,_33_:Double );
70
property M[ const Y_,X_:Integer ] :Double read GetM write SetM ; default;
71
property AxisX :TDouble3D read GetAxisX write SetAxisX;
72
property AxisY :TDouble3D read GetAxisY write SetAxisY;
73
property AxisZ :TDouble3D read GetAxisZ write SetAxisZ;
74
class operator Negative( const V_:TDoubleM3 ) :TDoubleM3;
75
class operator Positive( const V_:TDoubleM3 ) :TDoubleM3;
76
class operator Add( const A_,B_:TDoubleM3 ) :TDoubleM3;
77
class operator Subtract( const A_,B_:TDoubleM3 ) :TDoubleM3;
78
class operator Multiply( const A_,B_:TDoubleM3 ) :TDoubleM3;
79
class operator Multiply( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
80
class operator Multiply( const A_:Double; const B_:TDoubleM3 ) :TDoubleM3;
81
class operator Multiply( const A_:TDouble3D; const B_:TDoubleM3 ) :TDouble3D;
82
class operator Multiply( const A_:TDoubleM3; const B_:TDouble3D ) :TDouble3D;
83
class operator Divide( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
84
function Transpose :TDoubleM3;
86
function Adjugate :TDoubleM3;
87
function Inverse :TDoubleM3;
90
0:( _ :array [ 1..3, 1..3 ] of Double; );
93
_31, _32, _33 :Double; );
98
function GetM( const Y_,X_:Integer ) :TdSingle;
99
procedure SetM( const Y_,X_:Integer; const M_:TdSingle );
100
function GetAxisX :TdSingle3D;
101
procedure SetAxisX( const AxisX_:TdSingle3D );
102
function GetAxisY :TdSingle3D;
103
procedure SetAxisY( const AxisY_:TdSingle3D );
104
function GetAxisZ :TdSingle3D;
105
procedure SetAxisZ( const AxisZ_:TdSingle3D );
106
function GetSum :TdSingle;
108
constructor Create( const _11_,_12_,_13_,
110
_31_,_32_,_33_:TdSingle );
111
property M[ const Y_,X_:Integer ] :TdSingle read GetM write SetM ; default;
112
property AxisX :TdSingle3D read GetAxisX write SetAxisX;
113
property AxisY :TdSingle3D read GetAxisY write SetAxisY;
114
property AxisZ :TdSingle3D read GetAxisZ write SetAxisZ;
115
property Sum :TdSingle read GetSum;
116
class operator Negative( const V_:TdSingleM3 ) :TdSingleM3;
117
class operator Positive( const V_:TdSingleM3 ) :TdSingleM3;
118
class operator Add( const A_,B_:TdSingleM3 ) :TdSingleM3;
119
class operator Subtract( const A_,B_:TdSingleM3 ) :TdSingleM3;
120
class operator Multiply( const A_,B_:TdSingleM3 ) :TdSingleM3;
121
class operator Multiply( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
122
class operator Multiply( const A_:TdSingle; const B_:TdSingleM3 ) :TdSingleM3;
123
class operator Multiply( const A_:TdSingle3D; const B_:TdSingleM3 ) :TdSingle3D;
124
class operator Multiply( const A_:TdSingleM3; const B_:TdSingle3D ) :TdSingle3D;
125
class operator Divide( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
126
function Transpose :TdSingleM3;
127
function Det :TdSingle;
128
function Adjugate :TdSingleM3;
129
function Inverse :TdSingleM3;
132
0:( _ :array [ 1..3, 1..3 ] of TdSingle; );
135
_31, _32, _33 :TdSingle; );
140
function GetM( const Y_,X_:Integer ) :TdDouble;
141
procedure SetM( const Y_,X_:Integer; const M_:TdDouble );
142
function GetAxisX :TdDouble3D;
143
procedure SetAxisX( const AxisX_:TdDouble3D );
144
function GetAxisY :TdDouble3D;
145
procedure SetAxisY( const AxisY_:TdDouble3D );
146
function GetAxisZ :TdDouble3D;
147
procedure SetAxisZ( const AxisZ_:TdDouble3D );
149
constructor Create( const _11_,_12_,_13_,
151
_31_,_32_,_33_:TdDouble );
152
property M[ const Y_,X_:Integer ] :TdDouble read GetM write SetM ; default;
153
property AxisX :TdDouble3D read GetAxisX write SetAxisX;
154
property AxisY :TdDouble3D read GetAxisY write SetAxisY;
155
property AxisZ :TdDouble3D read GetAxisZ write SetAxisZ;
156
class operator Negative( const V_:TdDoubleM3 ) :TdDoubleM3;
157
class operator Positive( const V_:TdDoubleM3 ) :TdDoubleM3;
158
class operator Add( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
159
class operator Subtract( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
160
class operator Multiply( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
161
class operator Multiply( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
162
class operator Multiply( const A_:TdDouble; const B_:TdDoubleM3 ) :TdDoubleM3;
163
class operator Multiply( const A_:TdDouble3D; const B_:TdDoubleM3 ) :TdDouble3D;
164
class operator Multiply( const A_:TdDoubleM3; const B_:TdDouble3D ) :TdDouble3D;
165
class operator Divide( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
166
function Transpose :TdDoubleM3;
167
function Det :TdDouble;
168
function Adjugate :TdDoubleM3;
169
function Inverse :TdDoubleM3;
172
0:( _ :array [ 1..3, 1..3 ] of TdDouble; );
175
_31, _32, _33 :TdDouble; );
178
function ArrowRot( const P0_,P1_:TSingle3D ) :TSingleM3; overload;
179
function ArrowRot( const P0_,P1_:TDouble3D ) :TDoubleM3; overload;
181
implementation //-------------------------------------------------------------
183
function TSingleM3.GetM( const Y_,X_:Integer ) :Single;
185
Result := _[ Y_, X_ ];
188
procedure TSingleM3.SetM( const Y_,X_:Integer; const M_:Single );
193
//------------------------------------------------------------------------------
195
function TSingleM3.GetAxisX :TSingle3D;
205
procedure TSingleM3.SetAxisX( const AxisX_:TSingle3D );
215
function TSingleM3.GetAxisY :TSingle3D;
225
procedure TSingleM3.SetAxisY( const AxisY_:TSingle3D );
235
function TSingleM3.GetAxisZ :TSingle3D;
245
procedure TSingleM3.SetAxisZ( const AxisZ_:TSingle3D );
255
function TSingleM3.GetSum :Single;
257
Result := _11 + _12 + _13
262
constructor TSingleM3.Create( const _11_,_12_,_13_,
264
_31_,_32_,_33_:Single );
266
_11 := _11_; _12 := _12_; _13 := _13_;
267
_21 := _21_; _22 := _22_; _23 := _23_;
268
_31 := _31_; _32 := _32_; _33 := _33_;
271
class operator TSingleM3.Positive( const V_:TSingleM3 ) :TSingleM3;
275
_11 := +V_._11; _12 := +V_._12; _13 := +V_._13;
276
_21 := +V_._21; _22 := +V_._22; _23 := +V_._23;
277
_31 := +V_._31; _32 := +V_._32; _33 := +V_._33;
281
class operator TSingleM3.Negative( const V_:TSingleM3 ) :TSingleM3;
285
_11 := -V_._11; _12 := -V_._12; _13 := -V_._13;
286
_21 := -V_._21; _22 := -V_._22; _23 := -V_._23;
287
_31 := -V_._31; _32 := -V_._32; _33 := -V_._33;
291
class operator TSingleM3.Add( const A_,B_:TSingleM3 ) :TSingleM3;
295
_11 := A_._11 + B_._11; _12 := A_._12 + B_._12; _13 := A_._13 + B_._13;
296
_21 := A_._21 + B_._21; _22 := A_._22 + B_._22; _23 := A_._23 + B_._23;
297
_31 := A_._31 + B_._31; _32 := A_._32 + B_._32; _33 := A_._33 + B_._33;
301
class operator TSingleM3.Subtract( const A_,B_:TSingleM3 ) :TSingleM3;
305
_11 := A_._11 - B_._11; _12 := A_._12 - B_._12; _13 := A_._13 - B_._13;
306
_21 := A_._21 - B_._21; _22 := A_._22 - B_._22; _23 := A_._23 - B_._23;
307
_31 := A_._31 - B_._31; _32 := A_._32 - B_._32; _33 := A_._33 - B_._33;
311
class operator TSingleM3.Multiply( const A_,B_:TSingleM3 ) :TSingleM3;
321
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
322
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
323
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
325
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
326
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
327
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
329
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
330
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
331
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
335
class operator TSingleM3.Multiply( const A_:TSingleM3; const B_:Single ) :TSingleM3;
339
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_;
340
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_;
341
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_;
345
class operator TSingleM3.Multiply( const A_:Single; const B_:TSingleM3 ) :TSingleM3;
349
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13;
350
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23;
351
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33;
355
class operator TSingleM3.Multiply( const A_:TSingle3D; const B_:TSingleM3 ) :TSingle3D;
365
X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
366
Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
367
Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
371
class operator TSingleM3.Multiply( const A_:TSingleM3; const B_:TSingle3D ) :TSingle3D;
381
X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
382
Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
383
Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
387
class operator TSingleM3.Divide( const A_:TSingleM3; const B_:Single ) :TSingleM3;
391
_11 := A_._11 / B_; _12 := A_._12 / B_; _13 := A_._13 / B_;
392
_21 := A_._21 / B_; _22 := A_._22 / B_; _23 := A_._23 / B_;
393
_31 := A_._31 / B_; _32 := A_._32 / B_; _33 := A_._33 / B_;
397
function TSingleM3.Transpose :TSingleM3;
399
Result._11 := _11; Result._12 := _21; Result._13 := _31;
400
Result._21 := _12; Result._22 := _22; Result._23 := _32;
401
Result._31 := _13; Result._32 := _23; Result._33 := _33;
404
function TSingleM3.Det :Single;
406
Result:= _11 * ( _22 * _33 - _23 * _32 )
407
+ _12 * ( _23 * _31 - _21 * _33 )
408
+ _13 * ( _21 * _32 - _22 * _31 );
411
function TSingleM3.Adjugate :TSingleM3;
413
Result._11 := +TSingleM2.Create( {11} {12} {13}
417
Result._21 := -TSingleM2.Create( {11} {12} {13}
421
Result._31 := +TSingleM2.Create( {11} {12} {13}
425
Result._12 := -TSingleM2.Create( {11} _12, _13,
429
Result._22 := +TSingleM2.Create( _11, {12} _13,
433
Result._32 := -TSingleM2.Create( _11, _12, {13}
437
Result._13 := +TSingleM2.Create( {11} _12, _13,
439
{31} {32} {33} ).Det;
441
Result._23 := -TSingleM2.Create( _11, {12} _13,
443
{31} {32} {33} ).Det;
445
Result._33 := +TSingleM2.Create( _11, _12, {13}
447
{31} {32} {33} ).Det;
450
function TSingleM3.Inverse :TSingleM3;
456
Result := A / ( _11 * A._11
461
function TDoubleM3.GetM( const Y_,X_:Integer ) :Double;
463
Result := _[ Y_, X_ ];
466
procedure TDoubleM3.SetM( const Y_,X_:Integer; const M_:Double );
471
//------------------------------------------------------------------------------
473
function TDoubleM3.GetAxisX :TDouble3D;
483
procedure TDoubleM3.SetAxisX( const AxisX_:TDouble3D );
493
function TDoubleM3.GetAxisY :TDouble3D;
503
procedure TDoubleM3.SetAxisY( const AxisY_:TDouble3D );
513
function TDoubleM3.GetAxisZ :TDouble3D;
523
procedure TDoubleM3.SetAxisZ( const AxisZ_:TDouble3D );
533
constructor TDoubleM3.Create( const _11_,_12_,_13_,
535
_31_,_32_,_33_:Double );
537
_11 := _11_; _12 := _12_; _13 := _13_;
538
_21 := _21_; _22 := _22_; _23 := _23_;
539
_31 := _31_; _32 := _32_; _33 := _33_;
542
class operator TDoubleM3.Positive( const V_:TDoubleM3 ) :TDoubleM3;
546
_11 := +V_._11; _12 := +V_._12; _13 := +V_._13;
547
_21 := +V_._21; _22 := +V_._22; _23 := +V_._23;
548
_31 := +V_._31; _32 := +V_._32; _33 := +V_._33;
552
class operator TDoubleM3.Negative( const V_:TDoubleM3 ) :TDoubleM3;
556
_11 := -V_._11; _12 := -V_._12; _13 := -V_._13;
557
_21 := -V_._21; _22 := -V_._22; _23 := -V_._23;
558
_31 := -V_._31; _32 := -V_._32; _33 := -V_._33;
562
class operator TDoubleM3.Add( const A_,B_:TDoubleM3 ) :TDoubleM3;
566
_11 := A_._11 + B_._11; _12 := A_._12 + B_._12; _13 := A_._13 + B_._13;
567
_21 := A_._21 + B_._21; _22 := A_._22 + B_._22; _23 := A_._23 + B_._23;
568
_31 := A_._31 + B_._31; _32 := A_._32 + B_._32; _33 := A_._33 + B_._33;
572
class operator TDoubleM3.Subtract( const A_,B_:TDoubleM3 ) :TDoubleM3;
576
_11 := A_._11 - B_._11; _12 := A_._12 - B_._12; _13 := A_._13 - B_._13;
577
_21 := A_._21 - B_._21; _22 := A_._22 - B_._22; _23 := A_._23 - B_._23;
578
_31 := A_._31 - B_._31; _32 := A_._32 - B_._32; _33 := A_._33 - B_._33;
582
class operator TDoubleM3.Multiply( const A_,B_:TDoubleM3 ) :TDoubleM3;
592
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
593
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
594
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
596
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
597
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
598
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
600
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
601
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
602
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
606
class operator TDoubleM3.Multiply( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
610
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_;
611
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_;
612
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_;
616
class operator TDoubleM3.Multiply( const A_:Double; const B_:TDoubleM3 ) :TDoubleM3;
620
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13;
621
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23;
622
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33;
626
class operator TDoubleM3.Multiply( const A_:TDouble3D; const B_:TDoubleM3 ) :TDouble3D;
636
X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
637
Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
638
Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
642
class operator TDoubleM3.Multiply( const A_:TDoubleM3; const B_:TDouble3D ) :TDouble3D;
652
X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
653
Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
654
Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
658
class operator TDoubleM3.Divide( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
662
_11 := A_._11 / B_; _12 := A_._12 / B_; _13 := A_._13 / B_;
663
_21 := A_._21 / B_; _22 := A_._22 / B_; _23 := A_._23 / B_;
664
_31 := A_._31 / B_; _32 := A_._32 / B_; _33 := A_._33 / B_;
668
/////////////////////////////////////////////////////////////////////// メソッド
670
function TDoubleM3.Transpose :TDoubleM3;
672
Result._11 := _11; Result._12 := _21; Result._13 := _31;
673
Result._21 := _12; Result._22 := _22; Result._23 := _32;
674
Result._31 := _13; Result._32 := _23; Result._33 := _33;
677
function TDoubleM3.Det :Double;
679
Result:= _11 * ( _22 * _33 - _23 * _32 )
680
+ _12 * ( _23 * _31 - _21 * _33 )
681
+ _13 * ( _21 * _32 - _22 * _31 );
684
function TDoubleM3.Adjugate :TDoubleM3;
686
Result._11 := +TDoubleM2.Create( {11} {12} {13}
690
Result._21 := -TDoubleM2.Create( {11} {12} {13}
694
Result._31 := +TDoubleM2.Create( {11} {12} {13}
698
Result._12 := -TDoubleM2.Create( {11} _12, _13,
702
Result._22 := +TDoubleM2.Create( _11, {12} _13,
706
Result._32 := -TDoubleM2.Create( _11, _12, {13}
710
Result._13 := +TDoubleM2.Create( {11} _12, _13,
712
{31} {32} {33} ).Det;
714
Result._23 := -TDoubleM2.Create( _11, {12} _13,
716
{31} {32} {33} ).Det;
718
Result._33 := +TDoubleM2.Create( _11, _12, {13}
720
{31} {32} {33} ).Det;
723
function TDoubleM3.Inverse :TDoubleM3;
729
Result := A / ( _11 * A._11
735
function TdSingleM3.GetM( const Y_,X_:Integer ) :TdSingle;
737
Result := _[ Y_, X_ ];
740
procedure TdSingleM3.SetM( const Y_,X_:Integer; const M_:TdSingle );
745
//------------------------------------------------------------------------------
747
function TdSingleM3.GetAxisX :TdSingle3D;
757
procedure TdSingleM3.SetAxisX( const AxisX_:TdSingle3D );
767
function TdSingleM3.GetAxisY :TdSingle3D;
777
procedure TdSingleM3.SetAxisY( const AxisY_:TdSingle3D );
787
function TdSingleM3.GetAxisZ :TdSingle3D;
797
procedure TdSingleM3.SetAxisZ( const AxisZ_:TdSingle3D );
807
function TdSingleM3.GetSum :TdSingle;
809
Result := _11 + _12 + _13
814
constructor TdSingleM3.Create( const _11_,_12_,_13_,
816
_31_,_32_,_33_:TdSingle );
818
_11 := _11_; _12 := _12_; _13 := _13_;
819
_21 := _21_; _22 := _22_; _23 := _23_;
820
_31 := _31_; _32 := _32_; _33 := _33_;
823
class operator TdSingleM3.Positive( const V_:TdSingleM3 ) :TdSingleM3;
827
_11 := +V_._11; _12 := +V_._12; _13 := +V_._13;
828
_21 := +V_._21; _22 := +V_._22; _23 := +V_._23;
829
_31 := +V_._31; _32 := +V_._32; _33 := +V_._33;
833
class operator TdSingleM3.Negative( const V_:TdSingleM3 ) :TdSingleM3;
837
_11 := -V_._11; _12 := -V_._12; _13 := -V_._13;
838
_21 := -V_._21; _22 := -V_._22; _23 := -V_._23;
839
_31 := -V_._31; _32 := -V_._32; _33 := -V_._33;
843
class operator TdSingleM3.Add( const A_,B_:TdSingleM3 ) :TdSingleM3;
847
_11 := A_._11 + B_._11; _12 := A_._12 + B_._12; _13 := A_._13 + B_._13;
848
_21 := A_._21 + B_._21; _22 := A_._22 + B_._22; _23 := A_._23 + B_._23;
849
_31 := A_._31 + B_._31; _32 := A_._32 + B_._32; _33 := A_._33 + B_._33;
853
class operator TdSingleM3.Subtract( const A_,B_:TdSingleM3 ) :TdSingleM3;
857
_11 := A_._11 - B_._11; _12 := A_._12 - B_._12; _13 := A_._13 - B_._13;
858
_21 := A_._21 - B_._21; _22 := A_._22 - B_._22; _23 := A_._23 - B_._23;
859
_31 := A_._31 - B_._31; _32 := A_._32 - B_._32; _33 := A_._33 - B_._33;
863
class operator TdSingleM3.Multiply( const A_,B_:TdSingleM3 ) :TdSingleM3;
873
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
874
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
875
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
877
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
878
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
879
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
881
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
882
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
883
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
887
class operator TdSingleM3.Multiply( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
891
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_;
892
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_;
893
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_;
897
class operator TdSingleM3.Multiply( const A_:TdSingle; const B_:TdSingleM3 ) :TdSingleM3;
901
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13;
902
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23;
903
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33;
907
class operator TdSingleM3.Multiply( const A_:TdSingle3D; const B_:TdSingleM3 ) :TdSingle3D;
917
X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
918
Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
919
Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
923
class operator TdSingleM3.Multiply( const A_:TdSingleM3; const B_:TdSingle3D ) :TdSingle3D;
933
X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
934
Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
935
Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
939
class operator TdSingleM3.Divide( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
943
_11 := A_._11 / B_; _12 := A_._12 / B_; _13 := A_._13 / B_;
944
_21 := A_._21 / B_; _22 := A_._22 / B_; _23 := A_._23 / B_;
945
_31 := A_._31 / B_; _32 := A_._32 / B_; _33 := A_._33 / B_;
949
function TdSingleM3.Transpose :TdSingleM3;
951
Result._11 := _11; Result._12 := _21; Result._13 := _31;
952
Result._21 := _12; Result._22 := _22; Result._23 := _32;
953
Result._31 := _13; Result._32 := _23; Result._33 := _33;
956
function TdSingleM3.Det :TdSingle;
958
Result:= _11 * ( _22 * _33 - _23 * _32 )
959
+ _12 * ( _23 * _31 - _21 * _33 )
960
+ _13 * ( _21 * _32 - _22 * _31 );
963
function TdSingleM3.Adjugate :TdSingleM3;
965
Result._11 := +TdSingleM2.Create( {11} {12} {13}
969
Result._21 := -TdSingleM2.Create( {11} {12} {13}
973
Result._31 := +TdSingleM2.Create( {11} {12} {13}
977
Result._12 := -TdSingleM2.Create( {11} _12, _13,
981
Result._22 := +TdSingleM2.Create( _11, {12} _13,
985
Result._32 := -TdSingleM2.Create( _11, _12, {13}
989
Result._13 := +TdSingleM2.Create( {11} _12, _13,
991
{31} {32} {33} ).Det;
993
Result._23 := -TdSingleM2.Create( _11, {12} _13,
995
{31} {32} {33} ).Det;
997
Result._33 := +TdSingleM2.Create( _11, _12, {13}
999
{31} {32} {33} ).Det;
1002
function TdSingleM3.Inverse :TdSingleM3;
1008
Result := A / ( _11 * A._11
1013
function TdDoubleM3.GetM( const Y_,X_:Integer ) :TdDouble;
1015
Result := _[ Y_, X_ ];
1018
procedure TdDoubleM3.SetM( const Y_,X_:Integer; const M_:TdDouble );
1023
//------------------------------------------------------------------------------
1025
function TdDoubleM3.GetAxisX :TdDouble3D;
1035
procedure TdDoubleM3.SetAxisX( const AxisX_:TdDouble3D );
1045
function TdDoubleM3.GetAxisY :TdDouble3D;
1055
procedure TdDoubleM3.SetAxisY( const AxisY_:TdDouble3D );
1065
function TdDoubleM3.GetAxisZ :TdDouble3D;
1075
procedure TdDoubleM3.SetAxisZ( const AxisZ_:TdDouble3D );
1085
constructor TdDoubleM3.Create( const _11_,_12_,_13_,
1087
_31_,_32_,_33_:TdDouble );
1089
_11 := _11_; _12 := _12_; _13 := _13_;
1090
_21 := _21_; _22 := _22_; _23 := _23_;
1091
_31 := _31_; _32 := _32_; _33 := _33_;
1094
class operator TdDoubleM3.Positive( const V_:TdDoubleM3 ) :TdDoubleM3;
1098
_11 := +V_._11; _12 := +V_._12; _13 := +V_._13;
1099
_21 := +V_._21; _22 := +V_._22; _23 := +V_._23;
1100
_31 := +V_._31; _32 := +V_._32; _33 := +V_._33;
1104
class operator TdDoubleM3.Negative( const V_:TdDoubleM3 ) :TdDoubleM3;
1108
_11 := -V_._11; _12 := -V_._12; _13 := -V_._13;
1109
_21 := -V_._21; _22 := -V_._22; _23 := -V_._23;
1110
_31 := -V_._31; _32 := -V_._32; _33 := -V_._33;
1114
class operator TdDoubleM3.Add( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1118
_11 := A_._11 + B_._11; _12 := A_._12 + B_._12; _13 := A_._13 + B_._13;
1119
_21 := A_._21 + B_._21; _22 := A_._22 + B_._22; _23 := A_._23 + B_._23;
1120
_31 := A_._31 + B_._31; _32 := A_._32 + B_._32; _33 := A_._33 + B_._33;
1124
class operator TdDoubleM3.Subtract( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1128
_11 := A_._11 - B_._11; _12 := A_._12 - B_._12; _13 := A_._13 - B_._13;
1129
_21 := A_._21 - B_._21; _22 := A_._22 - B_._22; _23 := A_._23 - B_._23;
1130
_31 := A_._31 - B_._31; _32 := A_._32 - B_._32; _33 := A_._33 - B_._33;
1134
class operator TdDoubleM3.Multiply( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1144
_11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
1145
_12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
1146
_13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
1148
_21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
1149
_22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
1150
_23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
1152
_31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
1153
_32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
1154
_33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
1158
class operator TdDoubleM3.Multiply( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
1162
_11 := A_._11 * B_; _12 := A_._12 * B_; _13 := A_._13 * B_;
1163
_21 := A_._21 * B_; _22 := A_._22 * B_; _23 := A_._23 * B_;
1164
_31 := A_._31 * B_; _32 := A_._32 * B_; _33 := A_._33 * B_;
1168
class operator TdDoubleM3.Multiply( const A_:TdDouble; const B_:TdDoubleM3 ) :TdDoubleM3;
1172
_11 := A_ * B_._11; _12 := A_ * B_._12; _13 := A_ * B_._13;
1173
_21 := A_ * B_._21; _22 := A_ * B_._22; _23 := A_ * B_._23;
1174
_31 := A_ * B_._31; _32 := A_ * B_._32; _33 := A_ * B_._33;
1178
class operator TdDoubleM3.Multiply( const A_:TdDouble3D; const B_:TdDoubleM3 ) :TdDouble3D;
1188
X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
1189
Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
1190
Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
1194
class operator TdDoubleM3.Multiply( const A_:TdDoubleM3; const B_:TdDouble3D ) :TdDouble3D;
1204
X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
1205
Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
1206
Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
1210
class operator TdDoubleM3.Divide( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
1214
_11 := A_._11 / B_; _12 := A_._12 / B_; _13 := A_._13 / B_;
1215
_21 := A_._21 / B_; _22 := A_._22 / B_; _23 := A_._23 / B_;
1216
_31 := A_._31 / B_; _32 := A_._32 / B_; _33 := A_._33 / B_;
1220
function TdDoubleM3.Transpose :TdDoubleM3;
1222
Result._11 := _11; Result._12 := _21; Result._13 := _31;
1223
Result._21 := _12; Result._22 := _22; Result._23 := _32;
1224
Result._31 := _13; Result._32 := _23; Result._33 := _33;
1227
function TdDoubleM3.Det :TdDouble;
1229
Result:= _11 * ( _22 * _33 - _23 * _32 )
1230
+ _12 * ( _23 * _31 - _21 * _33 )
1231
+ _13 * ( _21 * _32 - _22 * _31 );
1234
function TdDoubleM3.Adjugate :TdDoubleM3;
1236
Result._11 := +TdDoubleM2.Create( {11} {12} {13}
1238
{31} _32, _33 ).Det;
1240
Result._21 := -TdDoubleM2.Create( {11} {12} {13}
1242
_31, {32} _33 ).Det;
1244
Result._31 := +TdDoubleM2.Create( {11} {12} {13}
1246
_31, _32 {33} ).Det;
1248
Result._12 := -TdDoubleM2.Create( {11} _12, _13,
1250
{31} _32, _33 ).Det;
1252
Result._22 := +TdDoubleM2.Create( _11, {12} _13,
1254
_31, {32} _33 ).Det;
1256
Result._32 := -TdDoubleM2.Create( _11, _12, {13}
1258
_31, _32 {33} ).Det;
1260
Result._13 := +TdDoubleM2.Create( {11} _12, _13,
1262
{31} {32} {33} ).Det;
1264
Result._23 := -TdDoubleM2.Create( _11, {12} _13,
1266
{31} {32} {33} ).Det;
1268
Result._33 := +TdDoubleM2.Create( _11, _12, {13}
1270
{31} {32} {33} ).Det;
1273
function TdDoubleM3.Inverse :TdDoubleM3;
1279
Result := A / ( _11 * A._11
1284
function ArrowRot( const P0_,P1_:TSingle3D ) :TSingleM3;
1286
AX, AY ,AZ, E :TSingle3D;
1288
AZ := P0_.UnitorTo( P1_ );
1292
case MinI( Abs( X ), Abs( Y ) ,Abs( Z ) ) of
1293
1: E := TSingle3D.Create( 1, 0, 0 );
1294
2: E := TSingle3D.Create( 0, 1, 0 );
1295
3: E := TSingle3D.Create( 0, 0, 1 );
1299
AY := CrossProduct( AZ, E ).Unitor;
1301
AX := CrossProduct( AY, AZ );
1305
_11 := AX.X; _12 := AY.X; _13 := AZ.X;
1306
_21 := AX.Y; _22 := AY.Y; _23 := AZ.Y;
1307
_31 := AX.Z; _32 := AY.Z; _33 := AZ.Z;
1311
function ArrowRot( const P0_,P1_:TDouble3D ) :TDoubleM3;
1313
AX, AY ,AZ, E :TDouble3D;
1315
AZ := P0_.UnitorTo( P1_ );
1319
case MinI( Abs( X ), Abs( Y ) ,Abs( Z ) ) of
1320
1: E := TDouble3D.Create( 1, 0, 0 );
1321
2: E := TDouble3D.Create( 0, 1, 0 );
1322
3: E := TDouble3D.Create( 0, 0, 1 );
1326
AY := CrossProduct( AZ, E ).Unitor;
1328
AX := CrossProduct( AY, AZ );
1332
_11 := AX.X; _12 := AY.X; _13 := AZ.X;
1333
_21 := AX.Y; _22 := AY.Y; _23 := AZ.Y;
1334
_31 := AX.Z; _32 := AY.Z; _33 := AZ.Z;
1338
initialization //-------------------------------------------------------------