Luxophia

Форк
0
/
LUX.Matrix.L4.pas 
2269 строк · 80.5 Кб
1
unit LUX.Matrix.L4;
2

3
interface //#################################################################### ■
4

5
uses System.Math.Vectors,
6
     LUX, LUX.D1, LUX.D2, LUX.D3, LUX.Matrix.L2, LUX.Matrix.L3;
7

8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
9

10
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
11

12
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIntegerM4
13

14
     TIntegerM4 = record
15
     private
16
       ///// アクセス
17
       function GetM( const Y_,X_:Integer ) :Integer;
18
       procedure SetM( const Y_,X_:Integer; const M_:Integer );
19
     public
20
       ///// プロパティ
21
       property M[ const Y_,X_:Integer ] :Integer read GetM write SetM; default;
22
     case Integer of
23
      0:( _ :array [ 1..4, 1..4 ] of Integer; );
24
      1:( _11, _12, _13, _14,
25
          _21, _22, _23, _24,
26
          _31, _32, _33, _34,
27
          _41, _42, _43, _44 :Integer; );
28
     end;
29

30
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleM4
31

32
     TSingleM4 = record
33
     public
34
       ///// アクセス
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 );
45
     public
46
       constructor Create( const _11_,_12_,_13_,_14_,
47
                                 _21_,_22_,_23_,_24_,
48
                                 _31_,_32_,_33_,_34_,
49
                                 _41_,_42_,_43_,_44_ :Single ); overload;
50
       constructor Create( const X_,Y_,Z_,P_:TSingle3D ); overload;
51
       ///// プロパティ
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;
57
       ///// 演算子
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;
63
       ///// 型変換
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;
69
       ///// メソッド
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
       ///// 定数
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;
82

83
     case Integer of
84
      0:( _ :array [ 1..4, 1..4 ] of Single; );
85
      1:( _11, _12, _13, _14,
86
          _21, _22, _23, _24,
87
          _31, _32, _33, _34,
88
          _41, _42, _43, _44 :Single;        );
89
     end;
90

91
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleM4
92

93
     TDoubleM4 = record
94
     public
95
       ///// アクセス
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 );
106
     public
107
       constructor Create( const _11_,_12_,_13_,_14_,
108
                                 _21_,_22_,_23_,_24_,
109
                                 _31_,_32_,_33_,_34_,
110
                                 _41_,_42_,_43_,_44_ :Double ); overload;
111
       constructor Create( const X_,Y_,Z_,P_:TDouble3D ); overload;
112
       ///// プロパティ
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;
118
       ///// 演算子
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;
124
       ///// 型変換
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;
132
       ///// メソッド
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;
138
       ///// 定数
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;
145

146
     case Integer of
147
      0:( _ :array [ 1..4, 1..4 ] of Double; );
148
      1:( _11, _12, _13, _14,
149
          _21, _22, _23, _24,
150
          _31, _32, _33, _34,
151
          _41, _42, _43, _44 :Double;        );
152
     end;
153

154
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdSingleM4
155

156
     TdSingleM4 = record
157
     public
158
       ///// アクセス
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 );
169
     public
170
       constructor Create( const _11_,_12_,_13_,_14_,
171
                                 _21_,_22_,_23_,_24_,
172
                                 _31_,_32_,_33_,_34_,
173
                                 _41_,_42_,_43_,_44_ :TdSingle ); overload;
174
       constructor Create( const X_,Y_,Z_,P_:TdSingle3D ); overload;
175
       ///// プロパティ
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;
181
       ///// 演算子
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;
186
       ///// 型変換
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;
192
       ///// メソッド
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;
198
       ///// 定数
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;
205

206
     case Integer of
207
      0:( _ :array [ 1..4, 1..4 ] of TdSingle; );
208
      1:( _11, _12, _13, _14,
209
          _21, _22, _23, _24,
210
          _31, _32, _33, _34,
211
          _41, _42, _43, _44 :TdSingle;        );
212
     end;
213

214
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdDoubleM4
215

216
     TdDoubleM4 = record
217
     public
218
       ///// アクセス
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 );
229
     public
230
       constructor Create( const _11_,_12_,_13_,_14_,
231
                                 _21_,_22_,_23_,_24_,
232
                                 _31_,_32_,_33_,_34_,
233
                                 _41_,_42_,_43_,_44_ :TdDouble ); overload;
234
       constructor Create( const X_,Y_,Z_,P_:TdDouble3D ); overload;
235
       ///// プロパティ
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;
241
       ///// 演算子
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;
246
       ///// 型変換
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;
254
       ///// メソッド
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;
260
       ///// 定数
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;
267

268
     case Integer of
269
      0:( _ :array [ 1..4, 1..4 ] of TdDouble; );
270
      1:( _11, _12, _13, _14,
271
          _21, _22, _23, _24,
272
          _31, _32, _33, _34,
273
          _41, _42, _43, _44 :TdDouble;        );
274
     end;
275

276
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleDualM4
277

278
     TSingleDualM4 = record
279
     private
280
       _o :TSingleM4;
281
       _i :TSingleM4;
282
       ///// アクセス
283
       procedure Seto( const o_:TSingleM4 );
284
       procedure Seti( const i_:TSingleM4 );
285
     public
286
       ///// プロパティ
287
       property o :TSingleM4 read _o write Seto;
288
       property i :TSingleM4 read _i write Seti;
289
       ///// 演算子
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;
294
       ///// 定数
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;
301
     end;
302

303
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
304

305
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
306

307
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
308

309
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
310

311
implementation //############################################################### ■
312

313
uses System.Math;
314

315
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
316

317
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIntegerM4
318

319
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
320

321
/////////////////////////////////////////////////////////////////////// アクセス
322

323
function TIntegerM4.GetM( const Y_,X_:Integer ) :Integer;
324
begin
325
     Result := _[ Y_, X_ ];
326
end;
327

328
procedure TIntegerM4.SetM( const Y_,X_:Integer; const M_:Integer );
329
begin
330
     _[ Y_, X_ ] := M_;
331
end;
332

333
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
334

335
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleM4
336

337
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
338

339
/////////////////////////////////////////////////////////////////////// アクセス
340

341
function TSingleM4.GetM( const Y_,X_:Integer ) :Single;
342
begin
343
     Result := _[ Y_, X_ ];
344
end;
345

346
procedure TSingleM4.SetM( const Y_,X_:Integer; const M_:Single );
347
begin
348
     _[ Y_, X_ ] := M_;
349
end;
350

351
//------------------------------------------------------------------------------
352

353
function TSingleM4.GetAxisX :TSingle3D;
354
begin
355
     with Result do
356
     begin
357
          X := _11;
358
          Y := _21;
359
          Z := _31;
360
     end
361
end;
362

363
procedure TSingleM4.SetAxisX( const AxisX_:TSingle3D );
364
begin
365
     with AxisX_ do
366
     begin
367
          _11 := X;
368
          _21 := Y;
369
          _31 := Z;
370
     end
371
end;
372

373
function TSingleM4.GetAxisY :TSingle3D;
374
begin
375
     with Result do
376
     begin
377
          X := _12;
378
          Y := _22;
379
          Z := _32;
380
     end
381
end;
382

383
procedure TSingleM4.SetAxisY( const AxisY_:TSingle3D );
384
begin
385
     with AxisY_ do
386
     begin
387
          _12 := X;
388
          _22 := Y;
389
          _32 := Z;
390
     end
391
end;
392

393
function TSingleM4.GetAxisZ :TSingle3D;
394
begin
395
     with Result do
396
     begin
397
          X := _13;
398
          Y := _23;
399
          Z := _33;
400
     end
401
end;
402

403
procedure TSingleM4.SetAxisZ( const AxisZ_:TSingle3D );
404
begin
405
     with AxisZ_ do
406
     begin
407
          _13 := X;
408
          _23 := Y;
409
          _33 := Z;
410
     end
411
end;
412

413
function TSingleM4.GetAxisP :TSingle3D;
414
begin
415
     with Result do
416
     begin
417
          X := _14;
418
          Y := _24;
419
          Z := _34;
420
     end
421
end;
422

423
procedure TSingleM4.SetAxisP( const AxisP_:TSingle3D );
424
begin
425
     with AxisP_ do
426
     begin
427
          _14 := X;
428
          _24 := Y;
429
          _34 := Z;
430
     end
431
end;
432

433
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
434

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 );
439
begin
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_;
444
end;
445

446
constructor TSingleM4.Create( const X_,Y_,Z_:TSingle3D; const P_:TSingle3D );
447
begin
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;
452
end;
453

454
///////////////////////////////////////////////////////////////////////// 演算子
455

456
class operator TSingleM4.Multiply( const A_,B_:TSingleM4 ) :TSingleM4;
457
begin
458
     with Result do
459
     begin
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;
464

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;
469

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;
474

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;
479
     end
480
end;
481

482
class operator TSingleM4.Multiply( const A_:Single; const B_:TSingleM4 ) :TSingleM4;
483
begin
484
     with Result do
485
     begin
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;
490
     end
491
end;
492

493
class operator TSingleM4.Multiply( const A_:TSingleM4; const B_:Single ) :TSingleM4;
494
begin
495
     with Result do
496
     begin
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_;
501
     end
502
end;
503

504
class operator TSingleM4.Multiply( const A_:TSingleM4; const B_:TSingleRay3D ) :TSingleRay3D;
505
begin
506
     with Result do
507
     begin
508
          Pos := A_.MultPos( B_.Pos );
509
          Vec := A_.MultVec( B_.Vec );
510
     end
511
end;
512

513
class operator TSingleM4.Divide( const A_:TSingleM4; const B_:Single ) :TSingleM4;
514
begin
515
     with A_ do
516
     begin
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_;
521
     end
522
end;
523

524
///////////////////////////////////////////////////////////////////////// 型変換
525

526
class operator TSingleM4.Implicit( const V_:Single ) :TSingleM4;
527
begin
528
     with Result do
529
     begin
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_;
534
     end
535
end;
536

537
class operator TSingleM4.Implicit( const V_:TMatrix3D ) :TSingleM4;
538
begin
539
     with Result do
540
     begin
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;
545
     end
546
end;
547

548
class operator TSingleM4.Explicit( const V_:TSingleM4 ) :TMatrix3D;
549
begin
550
     with Result do
551
     begin
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;
556
     end
557
end;
558

559
class operator TSingleM4.Implicit( const V_:TSingleM3 ) :TSingleM4;
560
begin
561
     with Result do
562
     begin
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;
567
     end
568
end;
569

570
class operator TSingleM4.Explicit( const V_:TSingleM4 ) :TSingleM3;
571
begin
572
     with Result do
573
     begin
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;
577
     end
578
end;
579

580
////////////////////////////////////////////////////////////////////////////////
581

582
function TSingleM4.MultPos( const B_:TSingle3D ) :TSingle3D;
583
begin
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;
587
end;
588

589
function TSingleM4.MultVec( const B_:TSingle3D ) :TSingle3D;
590
begin
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;
594
end;
595

596
function TSingleM4.Adjugate :TSingleM4;
597
begin
598
     Result._11 := +TSingleM3.Create( {11} {12} {13} {14}
599
                                      {21} _22, _23, _24,
600
                                      {31} _32, _33, _34,
601
                                      {41} _42, _43, _44  ).Det;
602

603
     Result._21 := -TSingleM3.Create( {11} {12} {13} {14}
604
                                      _21, {22} _23, _24,
605
                                      _31, {32} _33, _34,
606
                                      _41, {42} _43, _44  ).Det;
607

608
     Result._31 := +TSingleM3.Create( {11} {12} {13} {14}
609
                                      _21, _22, {23} _24,
610
                                      _31, _32, {33} _34,
611
                                      _41, _42, {43} _44  ).Det;
612

613
     Result._41 := -TSingleM3.Create( {11} {12} {13} {14}
614
                                      _21, _22, _23, {24}
615
                                      _31, _32, _33, {34}
616
                                      _41, _42, _43  {44} ).Det;
617

618

619
     Result._12 := -TSingleM3.Create( {11} _12, _13, _14,
620
                                      {21} {22} {23} {24}
621
                                      {31} _32, _33, _34,
622
                                      {41} _42, _43, _44  ).Det;
623

624
     Result._22 := +TSingleM3.Create( _11, {12} _13, _14,
625
                                      {21} {22} {23} {24}
626
                                      _31, {32} _33, _34,
627
                                      _41, {42} _43, _44  ).Det;
628

629
     Result._32 := -TSingleM3.Create( _11, _12, {13} _14,
630
                                      {21} {22} {23} {24}
631
                                      _31, _32, {33} _34,
632
                                      _41, _42, {43} _44  ).Det;
633

634
     Result._42 := +TSingleM3.Create( _11, _12, _13, {14}
635
                                      {21} {22} {23} {24}
636
                                      _31, _32, _33, {34}
637
                                      _41, _42, _43  {44} ).Det;
638

639

640
     Result._13 := +TSingleM3.Create( {11} _12, _13, _14,
641
                                      {21} _22, _23, _24,
642
                                      {31} {32} {33} {34}
643
                                      {41} _42, _43, _44  ).Det;
644

645
     Result._23 := -TSingleM3.Create( _11, {12} _13, _14,
646
                                      _21, {22} _23, _24,
647
                                      {31} {32} {33} {34}
648
                                      _41, {42} _43, _44  ).Det;
649

650
     Result._33 := +TSingleM3.Create( _11, _12, {13} _14,
651
                                      _21, _22, {23} _24,
652
                                      {31} {32} {33} {34}
653
                                      _41, _42, {43} _44  ).Det;
654

655
     Result._43 := -TSingleM3.Create( _11, _12, _13, {14}
656
                                      _21, _22, _23, {24}
657
                                      {31} {32} {33} {34}
658
                                      _41, _42, _43  {44} ).Det;
659

660

661
     Result._14 := -TSingleM3.Create( {11} _12, _13, _14,
662
                                      {21} _22, _23, _24,
663
                                      {31} _32, _33, _34
664
                                      {41} {42} {43} {44} ).Det;
665

666
     Result._24 := +TSingleM3.Create( _11, {12} _13, _14,
667
                                      _21, {22} _23, _24,
668
                                      _31, {32} _33, _34
669
                                      {41} {42} {43} {44} ).Det;
670

671
     Result._34 := -TSingleM3.Create( _11, _12, {13} _14,
672
                                      _21, _22, {23} _24,
673
                                      _31, _32, {33} _34
674
                                      {41} {42} {43} {44} ).Det;
675

676
     Result._44 := +TSingleM3.Create( _11, _12, _13, {14}
677
                                      _21, _22, _23, {24}
678
                                      _31, _32, _33  {34}
679
                                      {41} {42} {43} {44} ).Det;
680
end;
681

682
function TSingleM4.Transpose :TSingleM4;
683
begin
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;
688
end;
689

690
function TSingleM4.Inverse :TSingleM4;
691
var
692
   A :TSingleM4;
693
begin
694
     A := Adjugate;
695

696
     Result := A / ( _11 * A._11
697
                   + _12 * A._21
698
                   + _13 * A._31
699
                   + _14 * A._41 )
700
end;
701

702
class function TSingleM4.Translate( const X_,Y_,Z_:Single ) :TSingleM4;
703
begin
704
     with Result do
705
     begin
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;
710
     end
711
end;
712

713
class function TSingleM4.Scale( const X_,Y_,Z_:Single ) :TSingleM4;
714
begin
715
     with Result do
716
     begin
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;
721
     end
722
end;
723

724
class function TSingleM4.RotateX( const T_:Single ) :TSingleM4;
725
var
726
   C, S :Single;
727
begin
728
     SinCos( T_, S, C );
729

730
     with Result do
731
     begin
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;
736
     end
737
end;
738

739
class function TSingleM4.RotateY( const T_:Single ) :TSingleM4;
740
var
741
   C, S :Single;
742
begin
743
     SinCos( T_, S, C );
744

745
     with Result do
746
     begin
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;
751
     end
752
end;
753

754
class function TSingleM4.RotateZ( const T_:Single ) :TSingleM4;
755
var
756
   C, S :Single;
757
begin
758
     SinCos( T_, S, C );
759

760
     with Result do
761
     begin
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;
766
     end
767
end;
768

769
class function TSingleM4.Identify :TSingleM4;
770
begin
771
     with Result do
772
     begin
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;
777
     end
778
end;
779

780
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleM4
781

782
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
783

784
/////////////////////////////////////////////////////////////////////// アクセス
785

786
function TDoubleM4.GetM( const Y_,X_:Integer ) :Double;
787
begin
788
     Result := _[ Y_, X_ ];
789
end;
790

791
procedure TDoubleM4.SetM( const Y_,X_:Integer; const M_:Double );
792
begin
793
     _[ Y_, X_ ] := M_;
794
end;
795

796
//------------------------------------------------------------------------------
797

798
function TDoubleM4.GetAxisX :TDouble3D;
799
begin
800
     with Result do
801
     begin
802
          X := _11;
803
          Y := _21;
804
          Z := _31;
805
     end
806
end;
807

808
procedure TDoubleM4.SetAxisX( const AxisX_:TDouble3D );
809
begin
810
     with AxisX_ do
811
     begin
812
          _11 := X;
813
          _21 := Y;
814
          _31 := Z;
815
     end
816
end;
817

818
function TDoubleM4.GetAxisY :TDouble3D;
819
begin
820
     with Result do
821
     begin
822
          X := _12;
823
          Y := _22;
824
          Z := _32;
825
     end
826
end;
827

828
procedure TDoubleM4.SetAxisY( const AxisY_:TDouble3D );
829
begin
830
     with AxisY_ do
831
     begin
832
          _12 := X;
833
          _22 := Y;
834
          _32 := Z;
835
     end
836
end;
837

838
function TDoubleM4.GetAxisZ :TDouble3D;
839
begin
840
     with Result do
841
     begin
842
          X := _13;
843
          Y := _23;
844
          Z := _33;
845
     end
846
end;
847

848
procedure TDoubleM4.SetAxisZ( const AxisZ_:TDouble3D );
849
begin
850
     with AxisZ_ do
851
     begin
852
          _13 := X;
853
          _23 := Y;
854
          _33 := Z;
855
     end
856
end;
857

858
function TDoubleM4.GetAxisP :TDouble3D;
859
begin
860
     with Result do
861
     begin
862
          X := _14;
863
          Y := _24;
864
          Z := _34;
865
     end
866
end;
867

868
procedure TDoubleM4.SetAxisP( const AxisP_:TDouble3D );
869
begin
870
     with AxisP_ do
871
     begin
872
          _14 := X;
873
          _24 := Y;
874
          _34 := Z;
875
     end
876
end;
877

878
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
879

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 );
884
begin
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_;
889
end;
890

891
constructor TDoubleM4.Create( const X_,Y_,Z_,P_:TDouble3D );
892
begin
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;
897
end;
898

899
///////////////////////////////////////////////////////////////////////// 演算子
900

901
class operator TDoubleM4.Multiply( const A_,B_:TDoubleM4 ) :TDoubleM4;
902
begin
903
     with Result do
904
     begin
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;
909

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;
914

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;
919

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;
924
     end
925
end;
926

927
class operator TDoubleM4.Multiply( const A_:Double; const B_:TDoubleM4 ) :TDoubleM4;
928
begin
929
     with Result do
930
     begin
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;
935
     end
936
end;
937

938
class operator TDoubleM4.Multiply( const A_:TDoubleM4; const B_:Double ) :TDoubleM4;
939
begin
940
     with Result do
941
     begin
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_;
946
     end
947
end;
948

949
class operator TDoubleM4.Multiply( const A_:TDoubleM4; const B_:TDoubleRay3D ) :TDoubleRay3D;
950
begin
951
     with Result do
952
     begin
953
          Pos := A_.MultPos( B_.Pos );
954
          Vec := A_.MultVec( B_.Vec );
955
     end
956
end;
957

958
class operator TDoubleM4.Divide( const A_:TDoubleM4; const B_:Double ) :TDoubleM4;
959
begin
960
     with A_ do
961
     begin
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_;
966
     end
967
end;
968

969
///////////////////////////////////////////////////////////////////////// 型変換
970

971
class operator TDoubleM4.Implicit( const V_:Double ) :TDoubleM4;
972
begin
973
     with Result do
974
     begin
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_;
979
     end
980
end;
981

982
class operator TDoubleM4.Implicit( const V_:TMatrix3D ) :TDoubleM4;
983
begin
984
     with Result do
985
     begin
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;
990
     end
991
end;
992

993
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TMatrix3D;
994
begin
995
     with Result do
996
     begin
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;
1001
     end
1002
end;
1003

1004
class operator TDoubleM4.Implicit( const V_:TSingleM4 ) :TDoubleM4;
1005
begin
1006
     with Result do
1007
     begin
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;
1012
     end
1013
end;
1014

1015
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TSingleM4;
1016
begin
1017
     with Result do
1018
     begin
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;
1023
     end
1024
end;
1025

1026
class operator TDoubleM4.Implicit( const V_:TDoubleM3 ) :TDoubleM4;
1027
begin
1028
     with Result do
1029
     begin
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;
1034
     end
1035
end;
1036

1037
class operator TDoubleM4.Explicit( const V_:TDoubleM4 ) :TDoubleM3;
1038
begin
1039
     with Result do
1040
     begin
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;
1044
     end
1045
end;
1046

1047
////////////////////////////////////////////////////////////////////////////////
1048

1049
function TDoubleM4.MultPos( const B_:TDouble3D ) :TDouble3D;
1050
begin
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;
1054
end;
1055

1056
function TDoubleM4.MultVec( const B_:TDouble3D ) :TDouble3D;
1057
begin
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;
1061
end;
1062

1063
function TDoubleM4.Adjugate :TDoubleM4;
1064
begin
1065
     Result._11 := +TDoubleM3.Create( {11} {12} {13} {14}
1066
                                      {21} _22, _23, _24,
1067
                                      {31} _32, _33, _34,
1068
                                      {41} _42, _43, _44  ).Det;
1069

1070
     Result._21 := -TDoubleM3.Create( {11} {12} {13} {14}
1071
                                      _21, {22} _23, _24,
1072
                                      _31, {32} _33, _34,
1073
                                      _41, {42} _43, _44  ).Det;
1074

1075
     Result._31 := +TDoubleM3.Create( {11} {12} {13} {14}
1076
                                      _21, _22, {23} _24,
1077
                                      _31, _32, {33} _34,
1078
                                      _41, _42, {43} _44  ).Det;
1079

1080
     Result._41 := -TDoubleM3.Create( {11} {12} {13} {14}
1081
                                      _21, _22, _23, {24}
1082
                                      _31, _32, _33, {34}
1083
                                      _41, _42, _43  {44} ).Det;
1084

1085

1086
     Result._12 := -TDoubleM3.Create( {11} _12, _13, _14,
1087
                                      {21} {22} {23} {24}
1088
                                      {31} _32, _33, _34,
1089
                                      {41} _42, _43, _44  ).Det;
1090

1091
     Result._22 := +TDoubleM3.Create( _11, {12} _13, _14,
1092
                                      {21} {22} {23} {24}
1093
                                      _31, {32} _33, _34,
1094
                                      _41, {42} _43, _44  ).Det;
1095

1096
     Result._32 := -TDoubleM3.Create( _11, _12, {13} _14,
1097
                                      {21} {22} {23} {24}
1098
                                      _31, _32, {33} _34,
1099
                                      _41, _42, {43} _44  ).Det;
1100

1101
     Result._42 := +TDoubleM3.Create( _11, _12, _13, {14}
1102
                                      {21} {22} {23} {24}
1103
                                      _31, _32, _33, {34}
1104
                                      _41, _42, _43  {44} ).Det;
1105

1106

1107
     Result._13 := +TDoubleM3.Create( {11} _12, _13, _14,
1108
                                      {21} _22, _23, _24,
1109
                                      {31} {32} {33} {34}
1110
                                      {41} _42, _43, _44  ).Det;
1111

1112
     Result._23 := -TDoubleM3.Create( _11, {12} _13, _14,
1113
                                      _21, {22} _23, _24,
1114
                                      {31} {32} {33} {34}
1115
                                      _41, {42} _43, _44  ).Det;
1116

1117
     Result._33 := +TDoubleM3.Create( _11, _12, {13} _14,
1118
                                      _21, _22, {23} _24,
1119
                                      {31} {32} {33} {34}
1120
                                      _41, _42, {43} _44  ).Det;
1121

1122
     Result._43 := -TDoubleM3.Create( _11, _12, _13, {14}
1123
                                      _21, _22, _23, {24}
1124
                                      {31} {32} {33} {34}
1125
                                      _41, _42, _43  {44} ).Det;
1126

1127

1128
     Result._14 := -TDoubleM3.Create( {11} _12, _13, _14,
1129
                                      {21} _22, _23, _24,
1130
                                      {31} _32, _33, _34
1131
                                      {41} {42} {43} {44} ).Det;
1132

1133
     Result._24 := +TDoubleM3.Create( _11, {12} _13, _14,
1134
                                      _21, {22} _23, _24,
1135
                                      _31, {32} _33, _34
1136
                                      {41} {42} {43} {44} ).Det;
1137

1138
     Result._34 := -TDoubleM3.Create( _11, _12, {13} _14,
1139
                                      _21, _22, {23} _24,
1140
                                      _31, _32, {33} _34
1141
                                      {41} {42} {43} {44} ).Det;
1142

1143
     Result._44 := +TDoubleM3.Create( _11, _12, _13, {14}
1144
                                      _21, _22, _23, {24}
1145
                                      _31, _32, _33  {34}
1146
                                      {41} {42} {43} {44} ).Det;
1147
end;
1148

1149
function TDoubleM4.Transpose :TDoubleM4;
1150
begin
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;
1155
end;
1156

1157
function TDoubleM4.Inverse :TDoubleM4;
1158
var
1159
   A :TDoubleM4;
1160
begin
1161
     A := Adjugate;
1162

1163
     Result := A / ( _11 * A._11
1164
                   + _12 * A._21
1165
                   + _13 * A._31
1166
                   + _14 * A._41 )
1167
end;
1168

1169
/////////////////////////////////////////////////////////////////////////// 定数
1170

1171
class function TDoubleM4.Translate( const X_,Y_,Z_:Double ) :TDoubleM4;
1172
begin
1173
     with Result do
1174
     begin
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;
1179
     end
1180
end;
1181

1182
class function TDoubleM4.Scale( const X_,Y_,Z_:Double ) :TDoubleM4;
1183
begin
1184
     with Result do
1185
     begin
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;
1190
     end
1191
end;
1192

1193
class function TDoubleM4.RotateX( const T_:Double ) :TDoubleM4;
1194
var
1195
   C, S :Double;
1196
begin
1197
     SinCos( T_, S, C );
1198

1199
     with Result do
1200
     begin
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;
1205
     end
1206
end;
1207

1208
class function TDoubleM4.RotateY( const T_:Double ) :TDoubleM4;
1209
var
1210
   C, S :Double;
1211
begin
1212
     SinCos( T_, S, C );
1213

1214
     with Result do
1215
     begin
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;
1220
     end
1221
end;
1222

1223
class function TDoubleM4.RotateZ( const T_:Double ) :TDoubleM4;
1224
var
1225
   C, S :Double;
1226
begin
1227
     SinCos( T_, S, C );
1228

1229
     with Result do
1230
     begin
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;
1235
     end
1236
end;
1237

1238
class function TDoubleM4.Identify :TDoubleM4;
1239
begin
1240
     with Result do
1241
     begin
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;
1246
     end
1247
end;
1248

1249
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdSingleM4
1250

1251
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1252

1253
/////////////////////////////////////////////////////////////////////// アクセス
1254

1255
function TdSingleM4.GetM( const Y_,X_:Integer ) :TdSingle;
1256
begin
1257
     Result := _[ Y_, X_ ];
1258
end;
1259

1260
procedure TdSingleM4.SetM( const Y_,X_:Integer; const M_:TdSingle );
1261
begin
1262
     _[ Y_, X_ ] := M_;
1263
end;
1264

1265
//------------------------------------------------------------------------------
1266

1267
function TdSingleM4.GetAxisX :TdSingle3D;
1268
begin
1269
     with Result do
1270
     begin
1271
          X := _11;
1272
          Y := _21;
1273
          Z := _31;
1274
     end
1275
end;
1276

1277
procedure TdSingleM4.SetAxisX( const AxisX_:TdSingle3D );
1278
begin
1279
     with AxisX_ do
1280
     begin
1281
          _11 := X;
1282
          _21 := Y;
1283
          _31 := Z;
1284
     end
1285
end;
1286

1287
function TdSingleM4.GetAxisY :TdSingle3D;
1288
begin
1289
     with Result do
1290
     begin
1291
          X := _12;
1292
          Y := _22;
1293
          Z := _32;
1294
     end
1295
end;
1296

1297
procedure TdSingleM4.SetAxisY( const AxisY_:TdSingle3D );
1298
begin
1299
     with AxisY_ do
1300
     begin
1301
          _12 := X;
1302
          _22 := Y;
1303
          _32 := Z;
1304
     end
1305
end;
1306

1307
function TdSingleM4.GetAxisZ :TdSingle3D;
1308
begin
1309
     with Result do
1310
     begin
1311
          X := _13;
1312
          Y := _23;
1313
          Z := _33;
1314
     end
1315
end;
1316

1317
procedure TdSingleM4.SetAxisZ( const AxisZ_:TdSingle3D );
1318
begin
1319
     with AxisZ_ do
1320
     begin
1321
          _13 := X;
1322
          _23 := Y;
1323
          _33 := Z;
1324
     end
1325
end;
1326

1327
function TdSingleM4.GetAxisP :TdSingle3D;
1328
begin
1329
     with Result do
1330
     begin
1331
          X := _14;
1332
          Y := _24;
1333
          Z := _34;
1334
     end
1335
end;
1336

1337
procedure TdSingleM4.SetAxisP( const AxisP_:TdSingle3D );
1338
begin
1339
     with AxisP_ do
1340
     begin
1341
          _14 := X;
1342
          _24 := Y;
1343
          _34 := Z;
1344
     end
1345
end;
1346

1347
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1348

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 );
1353
begin
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_;
1358
end;
1359

1360
constructor TdSingleM4.Create( const X_,Y_,Z_:TdSingle3D; const P_:TdSingle3D );
1361
begin
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;
1366
end;
1367

1368
///////////////////////////////////////////////////////////////////////// 演算子
1369

1370
class operator TdSingleM4.Multiply( const A_,B_:TdSingleM4 ) :TdSingleM4;
1371
begin
1372
     with Result do
1373
     begin
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;
1378

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;
1383

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;
1388

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;
1393
     end
1394
end;
1395

1396
class operator TdSingleM4.Multiply( const A_:TdSingle; const B_:TdSingleM4 ) :TdSingleM4;
1397
begin
1398
     with Result do
1399
     begin
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;
1404
     end
1405
end;
1406

1407
class operator TdSingleM4.Multiply( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
1408
begin
1409
     with Result do
1410
     begin
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_;
1415
     end
1416
end;
1417

1418
class operator TdSingleM4.Divide( const A_:TdSingleM4; const B_:TdSingle ) :TdSingleM4;
1419
begin
1420
     with A_ do
1421
     begin
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_;
1426
     end
1427
end;
1428

1429
///////////////////////////////////////////////////////////////////////// 型変換
1430

1431
class operator TdSingleM4.Implicit( const V_:TdSingle ) :TdSingleM4;
1432
begin
1433
     with Result do
1434
     begin
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_;
1439
     end
1440
end;
1441

1442
class operator TdSingleM4.Implicit( const V_:TMatrix3D ) :TdSingleM4;
1443
begin
1444
     with Result do
1445
     begin
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;
1450
     end
1451
end;
1452

1453
class operator TdSingleM4.Explicit( const V_:TdSingleM4 ) :TMatrix3D;
1454
begin
1455
     with Result do
1456
     begin
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;
1461
     end
1462
end;
1463

1464
class operator TdSingleM4.Implicit( const V_:TdSingleM3 ) :TdSingleM4;
1465
begin
1466
     with Result do
1467
     begin
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;
1472
     end
1473
end;
1474

1475
class operator TdSingleM4.Explicit( const V_:TdSingleM4 ) :TdSingleM3;
1476
begin
1477
     with Result do
1478
     begin
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;
1482
     end
1483
end;
1484

1485
////////////////////////////////////////////////////////////////////////////////
1486

1487
function TdSingleM4.MultPos( const B_:TdSingle3D ) :TdSingle3D;
1488
begin
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;
1492
end;
1493

1494
function TdSingleM4.MultVec( const B_:TdSingle3D ) :TdSingle3D;
1495
begin
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;
1499
end;
1500

1501
function TdSingleM4.Adjugate :TdSingleM4;
1502
begin
1503
     Result._11 := +TdSingleM3.Create( {11} {12} {13} {14}
1504
                                       {21} _22, _23, _24,
1505
                                       {31} _32, _33, _34,
1506
                                       {41} _42, _43, _44  ).Det;
1507

1508
     Result._21 := -TdSingleM3.Create( {11} {12} {13} {14}
1509
                                       _21, {22} _23, _24,
1510
                                       _31, {32} _33, _34,
1511
                                       _41, {42} _43, _44  ).Det;
1512

1513
     Result._31 := +TdSingleM3.Create( {11} {12} {13} {14}
1514
                                       _21, _22, {23} _24,
1515
                                       _31, _32, {33} _34,
1516
                                       _41, _42, {43} _44  ).Det;
1517

1518
     Result._41 := -TdSingleM3.Create( {11} {12} {13} {14}
1519
                                       _21, _22, _23, {24}
1520
                                       _31, _32, _33, {34}
1521
                                       _41, _42, _43  {44} ).Det;
1522

1523

1524
     Result._12 := -TdSingleM3.Create( {11} _12, _13, _14,
1525
                                       {21} {22} {23} {24}
1526
                                       {31} _32, _33, _34,
1527
                                       {41} _42, _43, _44  ).Det;
1528

1529
     Result._22 := +TdSingleM3.Create( _11, {12} _13, _14,
1530
                                       {21} {22} {23} {24}
1531
                                       _31, {32} _33, _34,
1532
                                       _41, {42} _43, _44  ).Det;
1533

1534
     Result._32 := -TdSingleM3.Create( _11, _12, {13} _14,
1535
                                       {21} {22} {23} {24}
1536
                                       _31, _32, {33} _34,
1537
                                       _41, _42, {43} _44  ).Det;
1538

1539
     Result._42 := +TdSingleM3.Create( _11, _12, _13, {14}
1540
                                       {21} {22} {23} {24}
1541
                                       _31, _32, _33, {34}
1542
                                       _41, _42, _43  {44} ).Det;
1543

1544

1545
     Result._13 := +TdSingleM3.Create( {11} _12, _13, _14,
1546
                                       {21} _22, _23, _24,
1547
                                       {31} {32} {33} {34}
1548
                                       {41} _42, _43, _44  ).Det;
1549

1550
     Result._23 := -TdSingleM3.Create( _11, {12} _13, _14,
1551
                                       _21, {22} _23, _24,
1552
                                       {31} {32} {33} {34}
1553
                                       _41, {42} _43, _44  ).Det;
1554

1555
     Result._33 := +TdSingleM3.Create( _11, _12, {13} _14,
1556
                                       _21, _22, {23} _24,
1557
                                       {31} {32} {33} {34}
1558
                                       _41, _42, {43} _44  ).Det;
1559

1560
     Result._43 := -TdSingleM3.Create( _11, _12, _13, {14}
1561
                                       _21, _22, _23, {24}
1562
                                       {31} {32} {33} {34}
1563
                                       _41, _42, _43  {44} ).Det;
1564

1565

1566
     Result._14 := -TdSingleM3.Create( {11} _12, _13, _14,
1567
                                       {21} _22, _23, _24,
1568
                                       {31} _32, _33, _34
1569
                                       {41} {42} {43} {44} ).Det;
1570

1571
     Result._24 := +TdSingleM3.Create( _11, {12} _13, _14,
1572
                                       _21, {22} _23, _24,
1573
                                       _31, {32} _33, _34
1574
                                       {41} {42} {43} {44} ).Det;
1575

1576
     Result._34 := -TdSingleM3.Create( _11, _12, {13} _14,
1577
                                       _21, _22, {23} _24,
1578
                                       _31, _32, {33} _34
1579
                                       {41} {42} {43} {44} ).Det;
1580

1581
     Result._44 := +TdSingleM3.Create( _11, _12, _13, {14}
1582
                                       _21, _22, _23, {24}
1583
                                       _31, _32, _33  {34}
1584
                                       {41} {42} {43} {44} ).Det;
1585
end;
1586

1587
function TdSingleM4.Transpose :TdSingleM4;
1588
begin
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;
1593
end;
1594

1595
function TdSingleM4.Inverse :TdSingleM4;
1596
var
1597
   A :TdSingleM4;
1598
begin
1599
     A := Adjugate;
1600

1601
     Result := A / ( _11 * A._11
1602
                   + _12 * A._21
1603
                   + _13 * A._31
1604
                   + _14 * A._41 )
1605
end;
1606

1607
class function TdSingleM4.Translate( const X_,Y_,Z_:TdSingle ) :TdSingleM4;
1608
begin
1609
     with Result do
1610
     begin
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;
1615
     end
1616
end;
1617

1618
class function TdSingleM4.Scale( const X_,Y_,Z_:TdSingle ) :TdSingleM4;
1619
begin
1620
     with Result do
1621
     begin
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;
1626
     end
1627
end;
1628

1629
class function TdSingleM4.RotateX( const T_:TdSingle ) :TdSingleM4;
1630
var
1631
   C, S :TdSingle;
1632
begin
1633
     SinCos( T_, S, C );
1634

1635
     with Result do
1636
     begin
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;
1641
     end
1642
end;
1643

1644
class function TdSingleM4.RotateY( const T_:TdSingle ) :TdSingleM4;
1645
var
1646
   C, S :TdSingle;
1647
begin
1648
     SinCos( T_, S, C );
1649

1650
     with Result do
1651
     begin
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;
1656
     end
1657
end;
1658

1659
class function TdSingleM4.RotateZ( const T_:TdSingle ) :TdSingleM4;
1660
var
1661
   C, S :TdSingle;
1662
begin
1663
     SinCos( T_, S, C );
1664

1665
     with Result do
1666
     begin
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;
1671
     end
1672
end;
1673

1674
class function TdSingleM4.Identify :TdSingleM4;
1675
begin
1676
     with Result do
1677
     begin
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;
1682
     end
1683
end;
1684

1685
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TdDoubleM4
1686

1687
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
1688

1689
/////////////////////////////////////////////////////////////////////// アクセス
1690

1691
function TdDoubleM4.GetM( const Y_,X_:Integer ) :TdDouble;
1692
begin
1693
     Result := _[ Y_, X_ ];
1694
end;
1695

1696
procedure TdDoubleM4.SetM( const Y_,X_:Integer; const M_:TdDouble );
1697
begin
1698
     _[ Y_, X_ ] := M_;
1699
end;
1700

1701
//------------------------------------------------------------------------------
1702

1703
function TdDoubleM4.GetAxisX :TdDouble3D;
1704
begin
1705
     with Result do
1706
     begin
1707
          X := _11;
1708
          Y := _21;
1709
          Z := _31;
1710
     end
1711
end;
1712

1713
procedure TdDoubleM4.SetAxisX( const AxisX_:TdDouble3D );
1714
begin
1715
     with AxisX_ do
1716
     begin
1717
          _11 := X;
1718
          _21 := Y;
1719
          _31 := Z;
1720
     end
1721
end;
1722

1723
function TdDoubleM4.GetAxisY :TdDouble3D;
1724
begin
1725
     with Result do
1726
     begin
1727
          X := _12;
1728
          Y := _22;
1729
          Z := _32;
1730
     end
1731
end;
1732

1733
procedure TdDoubleM4.SetAxisY( const AxisY_:TdDouble3D );
1734
begin
1735
     with AxisY_ do
1736
     begin
1737
          _12 := X;
1738
          _22 := Y;
1739
          _32 := Z;
1740
     end
1741
end;
1742

1743
function TdDoubleM4.GetAxisZ :TdDouble3D;
1744
begin
1745
     with Result do
1746
     begin
1747
          X := _13;
1748
          Y := _23;
1749
          Z := _33;
1750
     end
1751
end;
1752

1753
procedure TdDoubleM4.SetAxisZ( const AxisZ_:TdDouble3D );
1754
begin
1755
     with AxisZ_ do
1756
     begin
1757
          _13 := X;
1758
          _23 := Y;
1759
          _33 := Z;
1760
     end
1761
end;
1762

1763
function TdDoubleM4.GetAxisP :TdDouble3D;
1764
begin
1765
     with Result do
1766
     begin
1767
          X := _14;
1768
          Y := _24;
1769
          Z := _34;
1770
     end
1771
end;
1772

1773
procedure TdDoubleM4.SetAxisP( const AxisP_:TdDouble3D );
1774
begin
1775
     with AxisP_ do
1776
     begin
1777
          _14 := X;
1778
          _24 := Y;
1779
          _34 := Z;
1780
     end
1781
end;
1782

1783
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1784

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 );
1789
begin
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_;
1794
end;
1795

1796
constructor TdDoubleM4.Create( const X_,Y_,Z_,P_:TdDouble3D );
1797
begin
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;
1802
end;
1803

1804
///////////////////////////////////////////////////////////////////////// 演算子
1805

1806
class operator TdDoubleM4.Multiply( const A_,B_:TdDoubleM4 ) :TdDoubleM4;
1807
begin
1808
     with Result do
1809
     begin
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;
1814

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;
1819

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;
1824

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;
1829
     end
1830
end;
1831

1832
class operator TdDoubleM4.Multiply( const A_:TdDouble; const B_:TdDoubleM4 ) :TdDoubleM4;
1833
begin
1834
     with Result do
1835
     begin
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;
1840
     end
1841
end;
1842

1843
class operator TdDoubleM4.Multiply( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
1844
begin
1845
     with Result do
1846
     begin
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_;
1851
     end
1852
end;
1853

1854
class operator TdDoubleM4.Divide( const A_:TdDoubleM4; const B_:TdDouble ) :TdDoubleM4;
1855
begin
1856
     with A_ do
1857
     begin
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_;
1862
     end
1863
end;
1864

1865
///////////////////////////////////////////////////////////////////////// 型変換
1866

1867
class operator TdDoubleM4.Implicit( const V_:TdDouble ) :TdDoubleM4;
1868
begin
1869
     with Result do
1870
     begin
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_;
1875
     end
1876
end;
1877

1878
class operator TdDoubleM4.Implicit( const V_:TMatrix3D ) :TdDoubleM4;
1879
begin
1880
     with Result do
1881
     begin
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;
1886
     end
1887
end;
1888

1889
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TMatrix3D;
1890
begin
1891
     with Result do
1892
     begin
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;
1897
     end
1898
end;
1899

1900
class operator TdDoubleM4.Implicit( const V_:TdSingleM4 ) :TdDoubleM4;
1901
begin
1902
     with Result do
1903
     begin
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;
1908
     end
1909
end;
1910

1911
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TdSingleM4;
1912
begin
1913
     with Result do
1914
     begin
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;
1919
     end
1920
end;
1921

1922
class operator TdDoubleM4.Implicit( const V_:TdDoubleM3 ) :TdDoubleM4;
1923
begin
1924
     with Result do
1925
     begin
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;
1930
     end
1931
end;
1932

1933
class operator TdDoubleM4.Explicit( const V_:TdDoubleM4 ) :TdDoubleM3;
1934
begin
1935
     with Result do
1936
     begin
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;
1940
     end
1941
end;
1942

1943
////////////////////////////////////////////////////////////////////////////////
1944

1945
function TdDoubleM4.MultPos( const B_:TdDouble3D ) :TdDouble3D;
1946
begin
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;
1950
end;
1951

1952
function TdDoubleM4.MultVec( const B_:TdDouble3D ) :TdDouble3D;
1953
begin
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;
1957
end;
1958

1959
function TdDoubleM4.Adjugate :TdDoubleM4;
1960
begin
1961
     Result._11 := +TdDoubleM3.Create( {11} {12} {13} {14}
1962
                                       {21} _22, _23, _24,
1963
                                       {31} _32, _33, _34,
1964
                                       {41} _42, _43, _44  ).Det;
1965

1966
     Result._21 := -TdDoubleM3.Create( {11} {12} {13} {14}
1967
                                       _21, {22} _23, _24,
1968
                                       _31, {32} _33, _34,
1969
                                       _41, {42} _43, _44  ).Det;
1970

1971
     Result._31 := +TdDoubleM3.Create( {11} {12} {13} {14}
1972
                                       _21, _22, {23} _24,
1973
                                       _31, _32, {33} _34,
1974
                                       _41, _42, {43} _44  ).Det;
1975

1976
     Result._41 := -TdDoubleM3.Create( {11} {12} {13} {14}
1977
                                       _21, _22, _23, {24}
1978
                                       _31, _32, _33, {34}
1979
                                       _41, _42, _43  {44} ).Det;
1980

1981

1982
     Result._12 := -TdDoubleM3.Create( {11} _12, _13, _14,
1983
                                       {21} {22} {23} {24}
1984
                                       {31} _32, _33, _34,
1985
                                       {41} _42, _43, _44  ).Det;
1986

1987
     Result._22 := +TdDoubleM3.Create( _11, {12} _13, _14,
1988
                                       {21} {22} {23} {24}
1989
                                       _31, {32} _33, _34,
1990
                                       _41, {42} _43, _44  ).Det;
1991

1992
     Result._32 := -TdDoubleM3.Create( _11, _12, {13} _14,
1993
                                       {21} {22} {23} {24}
1994
                                       _31, _32, {33} _34,
1995
                                       _41, _42, {43} _44  ).Det;
1996

1997
     Result._42 := +TdDoubleM3.Create( _11, _12, _13, {14}
1998
                                       {21} {22} {23} {24}
1999
                                       _31, _32, _33, {34}
2000
                                       _41, _42, _43  {44} ).Det;
2001

2002

2003
     Result._13 := +TdDoubleM3.Create( {11} _12, _13, _14,
2004
                                       {21} _22, _23, _24,
2005
                                       {31} {32} {33} {34}
2006
                                       {41} _42, _43, _44  ).Det;
2007

2008
     Result._23 := -TdDoubleM3.Create( _11, {12} _13, _14,
2009
                                       _21, {22} _23, _24,
2010
                                       {31} {32} {33} {34}
2011
                                       _41, {42} _43, _44  ).Det;
2012

2013
     Result._33 := +TdDoubleM3.Create( _11, _12, {13} _14,
2014
                                       _21, _22, {23} _24,
2015
                                       {31} {32} {33} {34}
2016
                                       _41, _42, {43} _44  ).Det;
2017

2018
     Result._43 := -TdDoubleM3.Create( _11, _12, _13, {14}
2019
                                       _21, _22, _23, {24}
2020
                                       {31} {32} {33} {34}
2021
                                       _41, _42, _43  {44} ).Det;
2022

2023

2024
     Result._14 := -TdDoubleM3.Create( {11} _12, _13, _14,
2025
                                       {21} _22, _23, _24,
2026
                                       {31} _32, _33, _34
2027
                                       {41} {42} {43} {44} ).Det;
2028

2029
     Result._24 := +TdDoubleM3.Create( _11, {12} _13, _14,
2030
                                       _21, {22} _23, _24,
2031
                                       _31, {32} _33, _34
2032
                                       {41} {42} {43} {44} ).Det;
2033

2034
     Result._34 := -TdDoubleM3.Create( _11, _12, {13} _14,
2035
                                       _21, _22, {23} _24,
2036
                                       _31, _32, {33} _34
2037
                                       {41} {42} {43} {44} ).Det;
2038

2039
     Result._44 := +TdDoubleM3.Create( _11, _12, _13, {14}
2040
                                       _21, _22, _23, {24}
2041
                                       _31, _32, _33  {34}
2042
                                       {41} {42} {43} {44} ).Det;
2043
end;
2044

2045
function TdDoubleM4.Transpose :TdDoubleM4;
2046
begin
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;
2051
end;
2052

2053
function TdDoubleM4.Inverse :TdDoubleM4;
2054
var
2055
   A :TdDoubleM4;
2056
begin
2057
     A := Adjugate;
2058

2059
     Result := A / ( _11 * A._11
2060
                   + _12 * A._21
2061
                   + _13 * A._31
2062
                   + _14 * A._41 )
2063
end;
2064

2065
/////////////////////////////////////////////////////////////////////////// 定数
2066

2067
class function TdDoubleM4.Translate( const X_,Y_,Z_:TdDouble ) :TdDoubleM4;
2068
begin
2069
     with Result do
2070
     begin
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;
2075
     end
2076
end;
2077

2078
class function TdDoubleM4.Scale( const X_,Y_,Z_:TdDouble ) :TdDoubleM4;
2079
begin
2080
     with Result do
2081
     begin
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;
2086
     end
2087
end;
2088

2089
class function TdDoubleM4.RotateX( const T_:TdDouble ) :TdDoubleM4;
2090
var
2091
   C, S :TdDouble;
2092
begin
2093
     SinCos( T_, S, C );
2094

2095
     with Result do
2096
     begin
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;
2101
     end
2102
end;
2103

2104
class function TdDoubleM4.RotateY( const T_:TdDouble ) :TdDoubleM4;
2105
var
2106
   C, S :TdDouble;
2107
begin
2108
     SinCos( T_, S, C );
2109

2110
     with Result do
2111
     begin
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;
2116
     end
2117
end;
2118

2119
class function TdDoubleM4.RotateZ( const T_:TdDouble ) :TdDoubleM4;
2120
var
2121
   C, S :TdDouble;
2122
begin
2123
     SinCos( T_, S, C );
2124

2125
     with Result do
2126
     begin
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;
2131
     end
2132
end;
2133

2134
class function TdDoubleM4.Identify :TdDoubleM4;
2135
begin
2136
     with Result do
2137
     begin
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;
2142
     end
2143
end;
2144

2145
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleDualM4
2146

2147
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
2148

2149
/////////////////////////////////////////////////////////////////////// アクセス
2150

2151
procedure TSingleDualM4.Seto( const o_:TSingleM4 );
2152
begin
2153
     _o := o_        ;
2154
     _i := o_.Inverse;
2155
end;
2156

2157
procedure TSingleDualM4.Seti( const i_:TSingleM4 );
2158
begin
2159
     _o := i_.Inverse;
2160
     _i := i_        ;
2161
end;
2162

2163
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
2164

2165
///////////////////////////////////////////////////////////////////////// 演算子
2166

2167
class operator TSingleDualM4.Multiply( const A_,B_:TSingleDualM4 ) :TSingleDualM4;
2168
begin
2169
     with Result do
2170
     begin
2171
          _o := A_.o * B_.o;
2172
          _i := B_.i * A_.i;
2173
     end
2174
end;
2175

2176
class operator TSingleDualM4.Multiply( const A_:Single; B_:TSingleDualM4 ) :TSingleDualM4;
2177
begin
2178
     with Result do
2179
     begin
2180
          _o := A_   * B_.o;
2181
          _i := B_.i * A_  ;
2182
     end
2183
end;
2184

2185
class operator TSingleDualM4.Multiply( const A_:TSingleDualM4; B_:Single ) :TSingleDualM4;
2186
begin
2187
     with Result do
2188
     begin
2189
          _o := A_.o * B_  ;
2190
          _i := B_   * A_.i;
2191
     end
2192
end;
2193

2194
class operator TSingleDualM4.Divide( const A_:TSingleDualM4; const B_:Single ) :TSingleDualM4;
2195
begin
2196
     with Result do
2197
     begin
2198
          _o := A_.o / B_;
2199
          _i := A_.i / B_;
2200
     end
2201
end;
2202

2203
/////////////////////////////////////////////////////////////////////////// 定数
2204

2205
class function TSingleDualM4.Translate( const X_,Y_,Z_:Single ) :TSingleDualM4;
2206
begin
2207
     with Result do
2208
     begin
2209
          _o := TSingleM4.Translate( +X_, +Y_, +Z_ );
2210
          _i := TSingleM4.Translate( -X_, -Y_, -Z_ );
2211
     end;
2212
end;
2213

2214
class function TSingleDualM4.Scale( const X_,Y_,Z_:Single ) :TSingleDualM4;
2215
begin
2216
     with Result do
2217
     begin
2218
          _o := TSingleM4.Scale( +X_, +Y_, +Z_ );
2219
          _i := TSingleM4.Scale( -X_, -Y_, -Z_ );
2220
     end;
2221
end;
2222

2223
class function TSingleDualM4.RotateX( const T_:Single ) :TSingleDualM4;
2224
begin
2225
     with Result do
2226
     begin
2227
          _o := TSingleM4.RotateX( +T_ );
2228
          _i := TSingleM4.RotateX( -T_ );
2229
     end;
2230
end;
2231

2232
class function TSingleDualM4.RotateY( const T_:Single ) :TSingleDualM4;
2233
begin
2234
     with Result do
2235
     begin
2236
          _o := TSingleM4.RotateY( +T_ );
2237
          _i := TSingleM4.RotateY( -T_ );
2238
     end;
2239
end;
2240

2241
class function TSingleDualM4.RotateZ( const T_:Single ) :TSingleDualM4;
2242
begin
2243
     with Result do
2244
     begin
2245
          _o := TSingleM4.RotateZ( +T_ );
2246
          _i := TSingleM4.RotateZ( -T_ );
2247
     end;
2248
end;
2249

2250
class function TSingleDualM4.Identify :TSingleDualM4;
2251
begin
2252
     with Result do
2253
     begin
2254
          _o := TSingleM4.Identify;
2255
          _i := TSingleM4.Identify;
2256
     end;
2257
end;
2258

2259
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
2260

2261
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
2262

2263
//############################################################################## □
2264

2265
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
2266

2267
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
2268

2269
end. //######################################################################### ■
2270

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.