Luxophia

Форк
0
/
LUX.M3.pas 
1342 строки · 40.8 Кб
1
unit LUX.M3;
2

3
interface
4

5
uses
6
  LUX,
7
  LUX.D1,
8
  LUX.D2,
9
  LUX.D3,
10
  LUX.M2;
11

12
type
13

14
     TSingleM3 = record
15
     private
16
       function GetM( const Y_,X_:Integer ) :Single;
17
       procedure SetM( const Y_,X_:Integer; const M_:Single );
18
       function GetAxisX :TSingle3D;
19
       procedure SetAxisX( const AxisX_:TSingle3D );
20
       function GetAxisY :TSingle3D;
21
       procedure SetAxisY( const AxisY_:TSingle3D );
22
       function GetAxisZ :TSingle3D;
23
       procedure SetAxisZ( const AxisZ_:TSingle3D );
24
       function GetSum :Single;
25
     public
26
       constructor Create( const _11_,_12_,_13_,
27
                                 _21_,_22_,_23_,
28
                                 _31_,_32_,_33_:Single );
29
       property M[ const Y_,X_:Integer ] :Single    read GetM     write SetM    ; default;
30
       property AxisX                    :TSingle3D read GetAxisX write SetAxisX;
31
       property AxisY                    :TSingle3D read GetAxisY write SetAxisY;
32
       property AxisZ                    :TSingle3D read GetAxisZ write SetAxisZ;
33
       property Sum                      :Single    read GetSum;
34
       class operator Negative( const V_:TSingleM3 ) :TSingleM3;
35
       class operator Positive( const V_:TSingleM3 ) :TSingleM3;
36
       class operator Add( const A_,B_:TSingleM3 ) :TSingleM3;
37
       class operator Subtract( const A_,B_:TSingleM3 ) :TSingleM3;
38
       class operator Multiply( const A_,B_:TSingleM3 ) :TSingleM3;
39
       class operator Multiply( const A_:TSingleM3; const B_:Single ) :TSingleM3;
40
       class operator Multiply( const A_:Single; const B_:TSingleM3 ) :TSingleM3;
41
       class operator Multiply( const A_:TSingle3D; const B_:TSingleM3 ) :TSingle3D;
42
       class operator Multiply( const A_:TSingleM3; const B_:TSingle3D ) :TSingle3D;
43
       class operator Divide( const A_:TSingleM3; const B_:Single ) :TSingleM3;
44
       function Transpose :TSingleM3;
45
       function Det :Single;
46
       function Adjugate :TSingleM3;
47
       function Inverse :TSingleM3;
48

49
     case Integer of
50
      0:( _ :array [ 1..3, 1..3 ] of Single; );
51
      1:( _11, _12, _13,
52
          _21, _22, _23,
53
          _31, _32, _33 :Single;             );
54
     end;
55

56
     TDoubleM3 = record
57
     private
58
       function GetM( const Y_,X_:Integer ) :Double;
59
       procedure SetM( const Y_,X_:Integer; const M_:Double );
60
       function GetAxisX :TDouble3D;
61
       procedure SetAxisX( const AxisX_:TDouble3D );
62
       function GetAxisY :TDouble3D;
63
       procedure SetAxisY( const AxisY_:TDouble3D );
64
       function GetAxisZ :TDouble3D;
65
       procedure SetAxisZ( const AxisZ_:TDouble3D );
66
     public
67
       constructor Create( const _11_,_12_,_13_,
68
                                 _21_,_22_,_23_,
69
                                 _31_,_32_,_33_:Double );
70
       property M[ const Y_,X_:Integer ] :Double    read GetM     write SetM    ; default;
71
       property AxisX                    :TDouble3D read GetAxisX write SetAxisX;
72
       property AxisY                    :TDouble3D read GetAxisY write SetAxisY;
73
       property AxisZ                    :TDouble3D read GetAxisZ write SetAxisZ;
74
       class operator Negative( const V_:TDoubleM3 ) :TDoubleM3;
75
       class operator Positive( const V_:TDoubleM3 ) :TDoubleM3;
76
       class operator Add( const A_,B_:TDoubleM3 ) :TDoubleM3;
77
       class operator Subtract( const A_,B_:TDoubleM3 ) :TDoubleM3;
78
       class operator Multiply( const A_,B_:TDoubleM3 ) :TDoubleM3;
79
       class operator Multiply( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
80
       class operator Multiply( const A_:Double; const B_:TDoubleM3 ) :TDoubleM3;
81
       class operator Multiply( const A_:TDouble3D; const B_:TDoubleM3 ) :TDouble3D;
82
       class operator Multiply( const A_:TDoubleM3; const B_:TDouble3D ) :TDouble3D;
83
       class operator Divide( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
84
       function Transpose :TDoubleM3;
85
       function Det :Double;
86
       function Adjugate :TDoubleM3;
87
       function Inverse :TDoubleM3;
88

89
     case Integer of
90
      0:( _ :array [ 1..3, 1..3 ] of Double; );
91
      1:( _11, _12, _13,
92
          _21, _22, _23,
93
          _31, _32, _33 :Double;             );
94
     end;
95

96
     TdSingleM3 = record
97
     private
98
       function GetM( const Y_,X_:Integer ) :TdSingle;
99
       procedure SetM( const Y_,X_:Integer; const M_:TdSingle );
100
       function GetAxisX :TdSingle3D;
101
       procedure SetAxisX( const AxisX_:TdSingle3D );
102
       function GetAxisY :TdSingle3D;
103
       procedure SetAxisY( const AxisY_:TdSingle3D );
104
       function GetAxisZ :TdSingle3D;
105
       procedure SetAxisZ( const AxisZ_:TdSingle3D );
106
       function GetSum :TdSingle;
107
     public
108
       constructor Create( const _11_,_12_,_13_,
109
                                 _21_,_22_,_23_,
110
                                 _31_,_32_,_33_:TdSingle );
111
       property M[ const Y_,X_:Integer ] :TdSingle   read GetM     write SetM    ; default;
112
       property AxisX                    :TdSingle3D read GetAxisX write SetAxisX;
113
       property AxisY                    :TdSingle3D read GetAxisY write SetAxisY;
114
       property AxisZ                    :TdSingle3D read GetAxisZ write SetAxisZ;
115
       property Sum   :TdSingle    read GetSum;
116
       class operator Negative( const V_:TdSingleM3 ) :TdSingleM3;
117
       class operator Positive( const V_:TdSingleM3 ) :TdSingleM3;
118
       class operator Add( const A_,B_:TdSingleM3 ) :TdSingleM3;
119
       class operator Subtract( const A_,B_:TdSingleM3 ) :TdSingleM3;
120
       class operator Multiply( const A_,B_:TdSingleM3 ) :TdSingleM3;
121
       class operator Multiply( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
122
       class operator Multiply( const A_:TdSingle; const B_:TdSingleM3 ) :TdSingleM3;
123
       class operator Multiply( const A_:TdSingle3D; const B_:TdSingleM3 ) :TdSingle3D;
124
       class operator Multiply( const A_:TdSingleM3; const B_:TdSingle3D ) :TdSingle3D;
125
       class operator Divide( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
126
       function Transpose :TdSingleM3;
127
       function Det :TdSingle;
128
       function Adjugate :TdSingleM3;
129
       function Inverse :TdSingleM3;
130

131
     case Integer of
132
      0:( _ :array [ 1..3, 1..3 ] of TdSingle; );
133
      1:( _11, _12, _13,
134
          _21, _22, _23,
135
          _31, _32, _33 :TdSingle;             );
136
     end;
137

138
     TdDoubleM3 = record
139
     private
140
       function GetM( const Y_,X_:Integer ) :TdDouble;
141
       procedure SetM( const Y_,X_:Integer; const M_:TdDouble );
142
       function GetAxisX :TdDouble3D;
143
       procedure SetAxisX( const AxisX_:TdDouble3D );
144
       function GetAxisY :TdDouble3D;
145
       procedure SetAxisY( const AxisY_:TdDouble3D );
146
       function GetAxisZ :TdDouble3D;
147
       procedure SetAxisZ( const AxisZ_:TdDouble3D );
148
     public
149
       constructor Create( const _11_,_12_,_13_,
150
                                 _21_,_22_,_23_,
151
                                 _31_,_32_,_33_:TdDouble );
152
       property M[ const Y_,X_:Integer ] :TdDouble   read GetM     write SetM    ; default;
153
       property AxisX                    :TdDouble3D read GetAxisX write SetAxisX;
154
       property AxisY                    :TdDouble3D read GetAxisY write SetAxisY;
155
       property AxisZ                    :TdDouble3D read GetAxisZ write SetAxisZ;
156
       class operator Negative( const V_:TdDoubleM3 ) :TdDoubleM3;
157
       class operator Positive( const V_:TdDoubleM3 ) :TdDoubleM3;
158
       class operator Add( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
159
       class operator Subtract( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
160
       class operator Multiply( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
161
       class operator Multiply( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
162
       class operator Multiply( const A_:TdDouble; const B_:TdDoubleM3 ) :TdDoubleM3;
163
       class operator Multiply( const A_:TdDouble3D; const B_:TdDoubleM3 ) :TdDouble3D;
164
       class operator Multiply( const A_:TdDoubleM3; const B_:TdDouble3D ) :TdDouble3D;
165
       class operator Divide( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
166
       function Transpose :TdDoubleM3;
167
       function Det :TdDouble;
168
       function Adjugate :TdDoubleM3;
169
       function Inverse :TdDoubleM3;
170

171
     case Integer of
172
      0:( _ :array [ 1..3, 1..3 ] of TdDouble; );
173
      1:( _11, _12, _13,
174
          _21, _22, _23,
175
          _31, _32, _33 :TdDouble;             );
176
     end;
177

178
function ArrowRot( const P0_,P1_:TSingle3D ) :TSingleM3; overload;
179
function ArrowRot( const P0_,P1_:TDouble3D ) :TDoubleM3; overload;
180

181
implementation //-------------------------------------------------------------
182

183
function TSingleM3.GetM( const Y_,X_:Integer ) :Single;
184
begin
185
     Result := _[ Y_, X_ ];
186
end;
187

188
procedure TSingleM3.SetM( const Y_,X_:Integer; const M_:Single );
189
begin
190
     _[ Y_, X_ ] := M_;
191
end;
192

193
//------------------------------------------------------------------------------
194

195
function TSingleM3.GetAxisX :TSingle3D;
196
begin
197
     with Result do
198
     begin
199
          X := _11;
200
          Y := _21;
201
          Z := _31;
202
     end;
203
end;
204

205
procedure TSingleM3.SetAxisX( const AxisX_:TSingle3D );
206
begin
207
     with AxisX_ do
208
     begin
209
          _11 := X;
210
          _21 := Y;
211
          _31 := Z;
212
     end;
213
end;
214

215
function TSingleM3.GetAxisY :TSingle3D;
216
begin
217
     with Result do
218
     begin
219
          X := _12;
220
          Y := _22;
221
          Z := _32;
222
     end;
223
end;
224

225
procedure TSingleM3.SetAxisY( const AxisY_:TSingle3D );
226
begin
227
     with AxisY_ do
228
     begin
229
          _12 := X;
230
          _22 := Y;
231
          _32 := Z;
232
     end;
233
end;
234

235
function TSingleM3.GetAxisZ :TSingle3D;
236
begin
237
     with Result do
238
     begin
239
          X := _13;
240
          Y := _23;
241
          Z := _33;
242
     end;
243
end;
244

245
procedure TSingleM3.SetAxisZ( const AxisZ_:TSingle3D );
246
begin
247
     with AxisZ_ do
248
     begin
249
          _13 := X;
250
          _23 := Y;
251
          _33 := Z;
252
     end;
253
end;
254

255
function TSingleM3.GetSum :Single;
256
begin
257
     Result := _11 + _12 + _13
258
             + _21 + _22 + _23
259
             + _31 + _32 + _33;
260
end;
261

262
constructor TSingleM3.Create( const _11_,_12_,_13_,
263
                                    _21_,_22_,_23_,
264
                                    _31_,_32_,_33_:Single );
265
begin
266
     _11 := _11_;  _12 := _12_;  _13 := _13_;
267
     _21 := _21_;  _22 := _22_;  _23 := _23_;
268
     _31 := _31_;  _32 := _32_;  _33 := _33_;
269
end;
270

271
class operator TSingleM3.Positive( const V_:TSingleM3 ) :TSingleM3;
272
begin
273
     with Result do
274
     begin
275
          _11 := +V_._11;  _12 := +V_._12;  _13 := +V_._13;
276
          _21 := +V_._21;  _22 := +V_._22;  _23 := +V_._23;
277
          _31 := +V_._31;  _32 := +V_._32;  _33 := +V_._33;
278
     end;
279
end;
280

281
class operator TSingleM3.Negative( const V_:TSingleM3 ) :TSingleM3;
282
begin
283
     with Result do
284
     begin
285
          _11 := -V_._11;  _12 := -V_._12;  _13 := -V_._13;
286
          _21 := -V_._21;  _22 := -V_._22;  _23 := -V_._23;
287
          _31 := -V_._31;  _32 := -V_._32;  _33 := -V_._33;
288
     end;
289
end;
290

291
class operator TSingleM3.Add( const A_,B_:TSingleM3 ) :TSingleM3;
292
begin
293
     with Result do
294
     begin
295
          _11 := A_._11 + B_._11;  _12 := A_._12 + B_._12;  _13 := A_._13 + B_._13;
296
          _21 := A_._21 + B_._21;  _22 := A_._22 + B_._22;  _23 := A_._23 + B_._23;
297
          _31 := A_._31 + B_._31;  _32 := A_._32 + B_._32;  _33 := A_._33 + B_._33;
298
     end;
299
end;
300

301
class operator TSingleM3.Subtract( const A_,B_:TSingleM3 ) :TSingleM3;
302
begin
303
     with Result do
304
     begin
305
          _11 := A_._11 - B_._11;  _12 := A_._12 - B_._12;  _13 := A_._13 - B_._13;
306
          _21 := A_._21 - B_._21;  _22 := A_._22 - B_._22;  _23 := A_._23 - B_._23;
307
          _31 := A_._31 - B_._31;  _32 := A_._32 - B_._32;  _33 := A_._33 - B_._33;
308
     end;
309
end;
310

311
class operator TSingleM3.Multiply( const A_,B_:TSingleM3 ) :TSingleM3;
312
begin
313
     {
314
       11 12 13    11 12 13
315
       21 22 23 × 21 22 23
316
       31 32 33    31 32 33
317
     }
318

319
     with Result do
320
     begin
321
          _11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
322
          _12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
323
          _13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
324

325
          _21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
326
          _22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
327
          _23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
328

329
          _31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
330
          _32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
331
          _33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
332
     end;
333
end;
334

335
class operator TSingleM3.Multiply( const A_:TSingleM3; const B_:Single ) :TSingleM3;
336
begin
337
     with Result do
338
     begin
339
          _11 := A_._11 * B_;  _12 := A_._12 * B_;  _13 := A_._13 * B_;
340
          _21 := A_._21 * B_;  _22 := A_._22 * B_;  _23 := A_._23 * B_;
341
          _31 := A_._31 * B_;  _32 := A_._32 * B_;  _33 := A_._33 * B_;
342
     end;
343
end;
344

345
class operator TSingleM3.Multiply( const A_:Single; const B_:TSingleM3 ) :TSingleM3;
346
begin
347
     with Result do
348
     begin
349
          _11 := A_ * B_._11;  _12 := A_ * B_._12;  _13 := A_ * B_._13;
350
          _21 := A_ * B_._21;  _22 := A_ * B_._22;  _23 := A_ * B_._23;
351
          _31 := A_ * B_._31;  _32 := A_ * B_._32;  _33 := A_ * B_._33;
352
     end;
353
end;
354

355
class operator TSingleM3.Multiply( const A_:TSingle3D; const B_:TSingleM3 ) :TSingle3D;
356
begin
357
     {
358
                11 12 13
359
       X Y Z × 21 22 23
360
                31 32 33
361
     }
362

363
     with Result do
364
     begin
365
          X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
366
          Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
367
          Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
368
     end;
369
end;
370

371
class operator TSingleM3.Multiply( const A_:TSingleM3; const B_:TSingle3D ) :TSingle3D;
372
begin
373
     {
374
       11 12 13    X
375
       21 22 23 × Y
376
       31 32 33    Z
377
     }
378

379
     with Result do
380
     begin
381
          X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
382
          Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
383
          Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
384
     end;
385
end;
386

387
class operator TSingleM3.Divide( const A_:TSingleM3; const B_:Single ) :TSingleM3;
388
begin
389
     with Result do
390
     begin
391
          _11 := A_._11 / B_;  _12 := A_._12 / B_;  _13 := A_._13 / B_;
392
          _21 := A_._21 / B_;  _22 := A_._22 / B_;  _23 := A_._23 / B_;
393
          _31 := A_._31 / B_;  _32 := A_._32 / B_;  _33 := A_._33 / B_;
394
     end;
395
end;
396

397
function TSingleM3.Transpose :TSingleM3;
398
begin
399
     Result._11 := _11;  Result._12 := _21;  Result._13 := _31;
400
     Result._21 := _12;  Result._22 := _22;  Result._23 := _32;
401
     Result._31 := _13;  Result._32 := _23;  Result._33 := _33;
402
end;
403

404
function TSingleM3.Det :Single;
405
begin
406
     Result:= _11 * ( _22 * _33 - _23 * _32 )
407
            + _12 * ( _23 * _31 - _21 * _33 )
408
            + _13 * ( _21 * _32 - _22 * _31 );
409
end;
410

411
function TSingleM3.Adjugate :TSingleM3;
412
begin
413
     Result._11 := +TSingleM2.Create( {11} {12} {13}
414
                                      {21} _22, _23,
415
                                      {31} _32, _33  ).Det;
416

417
     Result._21 := -TSingleM2.Create( {11} {12} {13}
418
                                      _21, {22} _23,
419
                                      _31, {32} _33  ).Det;
420

421
     Result._31 := +TSingleM2.Create( {11} {12} {13}
422
                                      _21, _22, {23}
423
                                      _31, _32  {33} ).Det;
424

425
     Result._12 := -TSingleM2.Create( {11} _12, _13,
426
                                      {21} {22} {23}
427
                                      {31} _32, _33  ).Det;
428

429
     Result._22 := +TSingleM2.Create( _11, {12} _13,
430
                                      {21} {22} {23}
431
                                      _31, {32} _33  ).Det;
432

433
     Result._32 := -TSingleM2.Create( _11, _12, {13}
434
                                      {21} {22} {23}
435
                                      _31, _32  {33} ).Det;
436

437
     Result._13 := +TSingleM2.Create( {11} _12, _13,
438
                                      {21} _22, _23
439
                                      {31} {32} {33} ).Det;
440

441
     Result._23 := -TSingleM2.Create( _11, {12} _13,
442
                                      _21, {22} _23
443
                                      {31} {32} {33} ).Det;
444

445
     Result._33 := +TSingleM2.Create( _11, _12, {13}
446
                                      _21, _22  {23}
447
                                      {31} {32} {33} ).Det;
448
end;
449

450
function TSingleM3.Inverse :TSingleM3;
451
var
452
   A :TSingleM3;
453
begin
454
     A := Adjugate;
455

456
     Result := A / ( _11 * A._11
457
                   + _12 * A._21
458
                   + _13 * A._31 );
459
end;
460

461
function TDoubleM3.GetM( const Y_,X_:Integer ) :Double;
462
begin
463
     Result := _[ Y_, X_ ];
464
end;
465

466
procedure TDoubleM3.SetM( const Y_,X_:Integer; const M_:Double );
467
begin
468
     _[ Y_, X_ ] := M_;
469
end;
470

471
//------------------------------------------------------------------------------
472

473
function TDoubleM3.GetAxisX :TDouble3D;
474
begin
475
     with Result do
476
     begin
477
          X := _11;
478
          Y := _21;
479
          Z := _31;
480
     end;
481
end;
482

483
procedure TDoubleM3.SetAxisX( const AxisX_:TDouble3D );
484
begin
485
     with AxisX_ do
486
     begin
487
          _11 := X;
488
          _21 := Y;
489
          _31 := Z;
490
     end;
491
end;
492

493
function TDoubleM3.GetAxisY :TDouble3D;
494
begin
495
     with Result do
496
     begin
497
          X := _12;
498
          Y := _22;
499
          Z := _32;
500
     end;
501
end;
502

503
procedure TDoubleM3.SetAxisY( const AxisY_:TDouble3D );
504
begin
505
     with AxisY_ do
506
     begin
507
          _12 := X;
508
          _22 := Y;
509
          _32 := Z;
510
     end;
511
end;
512

513
function TDoubleM3.GetAxisZ :TDouble3D;
514
begin
515
     with Result do
516
     begin
517
          X := _13;
518
          Y := _23;
519
          Z := _33;
520
     end;
521
end;
522

523
procedure TDoubleM3.SetAxisZ( const AxisZ_:TDouble3D );
524
begin
525
     with AxisZ_ do
526
     begin
527
          _13 := X;
528
          _23 := Y;
529
          _33 := Z;
530
     end;
531
end;
532

533
constructor TDoubleM3.Create( const _11_,_12_,_13_,
534
                                    _21_,_22_,_23_,
535
                                    _31_,_32_,_33_:Double );
536
begin
537
     _11 := _11_;  _12 := _12_;  _13 := _13_;
538
     _21 := _21_;  _22 := _22_;  _23 := _23_;
539
     _31 := _31_;  _32 := _32_;  _33 := _33_;
540
end;
541

542
class operator TDoubleM3.Positive( const V_:TDoubleM3 ) :TDoubleM3;
543
begin
544
     with Result do
545
     begin
546
          _11 := +V_._11;  _12 := +V_._12;  _13 := +V_._13;
547
          _21 := +V_._21;  _22 := +V_._22;  _23 := +V_._23;
548
          _31 := +V_._31;  _32 := +V_._32;  _33 := +V_._33;
549
     end;
550
end;
551

552
class operator TDoubleM3.Negative( const V_:TDoubleM3 ) :TDoubleM3;
553
begin
554
     with Result do
555
     begin
556
          _11 := -V_._11;  _12 := -V_._12;  _13 := -V_._13;
557
          _21 := -V_._21;  _22 := -V_._22;  _23 := -V_._23;
558
          _31 := -V_._31;  _32 := -V_._32;  _33 := -V_._33;
559
     end;
560
end;
561

562
class operator TDoubleM3.Add( const A_,B_:TDoubleM3 ) :TDoubleM3;
563
begin
564
     with Result do
565
     begin
566
          _11 := A_._11 + B_._11;  _12 := A_._12 + B_._12;  _13 := A_._13 + B_._13;
567
          _21 := A_._21 + B_._21;  _22 := A_._22 + B_._22;  _23 := A_._23 + B_._23;
568
          _31 := A_._31 + B_._31;  _32 := A_._32 + B_._32;  _33 := A_._33 + B_._33;
569
     end;
570
end;
571

572
class operator TDoubleM3.Subtract( const A_,B_:TDoubleM3 ) :TDoubleM3;
573
begin
574
     with Result do
575
     begin
576
          _11 := A_._11 - B_._11;  _12 := A_._12 - B_._12;  _13 := A_._13 - B_._13;
577
          _21 := A_._21 - B_._21;  _22 := A_._22 - B_._22;  _23 := A_._23 - B_._23;
578
          _31 := A_._31 - B_._31;  _32 := A_._32 - B_._32;  _33 := A_._33 - B_._33;
579
     end;
580
end;
581

582
class operator TDoubleM3.Multiply( const A_,B_:TDoubleM3 ) :TDoubleM3;
583
begin
584
     {
585
       11 12 13    11 12 13
586
       21 22 23 × 21 22 23
587
       31 32 33    31 32 33
588
     }
589

590
     with Result do
591
     begin
592
          _11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
593
          _12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
594
          _13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
595

596
          _21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
597
          _22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
598
          _23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
599

600
          _31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
601
          _32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
602
          _33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
603
     end;
604
end;
605

606
class operator TDoubleM3.Multiply( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
607
begin
608
     with Result do
609
     begin
610
          _11 := A_._11 * B_;  _12 := A_._12 * B_;  _13 := A_._13 * B_;
611
          _21 := A_._21 * B_;  _22 := A_._22 * B_;  _23 := A_._23 * B_;
612
          _31 := A_._31 * B_;  _32 := A_._32 * B_;  _33 := A_._33 * B_;
613
     end;
614
end;
615

616
class operator TDoubleM3.Multiply( const A_:Double; const B_:TDoubleM3 ) :TDoubleM3;
617
begin
618
     with Result do
619
     begin
620
          _11 := A_ * B_._11;  _12 := A_ * B_._12;  _13 := A_ * B_._13;
621
          _21 := A_ * B_._21;  _22 := A_ * B_._22;  _23 := A_ * B_._23;
622
          _31 := A_ * B_._31;  _32 := A_ * B_._32;  _33 := A_ * B_._33;
623
     end;
624
end;
625

626
class operator TDoubleM3.Multiply( const A_:TDouble3D; const B_:TDoubleM3 ) :TDouble3D;
627
begin
628
     {
629
                11 12 13
630
       X Y Z × 21 22 23
631
                31 32 33
632
     }
633

634
     with Result do
635
     begin
636
          X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
637
          Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
638
          Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
639
     end;
640
end;
641

642
class operator TDoubleM3.Multiply( const A_:TDoubleM3; const B_:TDouble3D ) :TDouble3D;
643
begin
644
     {
645
       11 12 13    X
646
       21 22 23 × Y
647
       31 32 33    Z
648
     }
649

650
     with Result do
651
     begin
652
          X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
653
          Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
654
          Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
655
     end;
656
end;
657

658
class operator TDoubleM3.Divide( const A_:TDoubleM3; const B_:Double ) :TDoubleM3;
659
begin
660
     with Result do
661
     begin
662
          _11 := A_._11 / B_;  _12 := A_._12 / B_;  _13 := A_._13 / B_;
663
          _21 := A_._21 / B_;  _22 := A_._22 / B_;  _23 := A_._23 / B_;
664
          _31 := A_._31 / B_;  _32 := A_._32 / B_;  _33 := A_._33 / B_;
665
     end;
666
end;
667

668
/////////////////////////////////////////////////////////////////////// メソッド
669

670
function TDoubleM3.Transpose :TDoubleM3;
671
begin
672
     Result._11 := _11;  Result._12 := _21;  Result._13 := _31;
673
     Result._21 := _12;  Result._22 := _22;  Result._23 := _32;
674
     Result._31 := _13;  Result._32 := _23;  Result._33 := _33;
675
end;
676

677
function TDoubleM3.Det :Double;
678
begin
679
     Result:= _11 * ( _22 * _33 - _23 * _32 )
680
            + _12 * ( _23 * _31 - _21 * _33 )
681
            + _13 * ( _21 * _32 - _22 * _31 );
682
end;
683

684
function TDoubleM3.Adjugate :TDoubleM3;
685
begin
686
     Result._11 := +TDoubleM2.Create( {11} {12} {13}
687
                                      {21} _22, _23,
688
                                      {31} _32, _33  ).Det;
689

690
     Result._21 := -TDoubleM2.Create( {11} {12} {13}
691
                                      _21, {22} _23,
692
                                      _31, {32} _33  ).Det;
693

694
     Result._31 := +TDoubleM2.Create( {11} {12} {13}
695
                                      _21, _22, {23}
696
                                      _31, _32  {33} ).Det;
697

698
     Result._12 := -TDoubleM2.Create( {11} _12, _13,
699
                                      {21} {22} {23}
700
                                      {31} _32, _33  ).Det;
701

702
     Result._22 := +TDoubleM2.Create( _11, {12} _13,
703
                                      {21} {22} {23}
704
                                      _31, {32} _33  ).Det;
705

706
     Result._32 := -TDoubleM2.Create( _11, _12, {13}
707
                                      {21} {22} {23}
708
                                      _31, _32  {33} ).Det;
709

710
     Result._13 := +TDoubleM2.Create( {11} _12, _13,
711
                                      {21} _22, _23
712
                                      {31} {32} {33} ).Det;
713

714
     Result._23 := -TDoubleM2.Create( _11, {12} _13,
715
                                      _21, {22} _23
716
                                      {31} {32} {33} ).Det;
717

718
     Result._33 := +TDoubleM2.Create( _11, _12, {13}
719
                                      _21, _22  {23}
720
                                      {31} {32} {33} ).Det;
721
end;
722

723
function TDoubleM3.Inverse :TDoubleM3;
724
var
725
   A :TDoubleM3;
726
begin
727
     A := Adjugate;
728

729
     Result := A / ( _11 * A._11
730
                   + _12 * A._21
731
                   + _13 * A._31 );
732
end;
733

734

735
function TdSingleM3.GetM( const Y_,X_:Integer ) :TdSingle;
736
begin
737
     Result := _[ Y_, X_ ];
738
end;
739

740
procedure TdSingleM3.SetM( const Y_,X_:Integer; const M_:TdSingle );
741
begin
742
     _[ Y_, X_ ] := M_;
743
end;
744

745
//------------------------------------------------------------------------------
746

747
function TdSingleM3.GetAxisX :TdSingle3D;
748
begin
749
     with Result do
750
     begin
751
          X := _11;
752
          Y := _21;
753
          Z := _31;
754
     end;
755
end;
756

757
procedure TdSingleM3.SetAxisX( const AxisX_:TdSingle3D );
758
begin
759
     with AxisX_ do
760
     begin
761
          _11 := X;
762
          _21 := Y;
763
          _31 := Z;
764
     end;
765
end;
766

767
function TdSingleM3.GetAxisY :TdSingle3D;
768
begin
769
     with Result do
770
     begin
771
          X := _12;
772
          Y := _22;
773
          Z := _32;
774
     end;
775
end;
776

777
procedure TdSingleM3.SetAxisY( const AxisY_:TdSingle3D );
778
begin
779
     with AxisY_ do
780
     begin
781
          _12 := X;
782
          _22 := Y;
783
          _32 := Z;
784
     end;
785
end;
786

787
function TdSingleM3.GetAxisZ :TdSingle3D;
788
begin
789
     with Result do
790
     begin
791
          X := _13;
792
          Y := _23;
793
          Z := _33;
794
     end;
795
end;
796

797
procedure TdSingleM3.SetAxisZ( const AxisZ_:TdSingle3D );
798
begin
799
     with AxisZ_ do
800
     begin
801
          _13 := X;
802
          _23 := Y;
803
          _33 := Z;
804
     end;
805
end;
806

807
function TdSingleM3.GetSum :TdSingle;
808
begin
809
     Result := _11 + _12 + _13
810
             + _21 + _22 + _23
811
             + _31 + _32 + _33;
812
end;
813

814
constructor TdSingleM3.Create( const _11_,_12_,_13_,
815
                                     _21_,_22_,_23_,
816
                                     _31_,_32_,_33_:TdSingle );
817
begin
818
     _11 := _11_;  _12 := _12_;  _13 := _13_;
819
     _21 := _21_;  _22 := _22_;  _23 := _23_;
820
     _31 := _31_;  _32 := _32_;  _33 := _33_;
821
end;
822

823
class operator TdSingleM3.Positive( const V_:TdSingleM3 ) :TdSingleM3;
824
begin
825
     with Result do
826
     begin
827
          _11 := +V_._11;  _12 := +V_._12;  _13 := +V_._13;
828
          _21 := +V_._21;  _22 := +V_._22;  _23 := +V_._23;
829
          _31 := +V_._31;  _32 := +V_._32;  _33 := +V_._33;
830
     end;
831
end;
832

833
class operator TdSingleM3.Negative( const V_:TdSingleM3 ) :TdSingleM3;
834
begin
835
     with Result do
836
     begin
837
          _11 := -V_._11;  _12 := -V_._12;  _13 := -V_._13;
838
          _21 := -V_._21;  _22 := -V_._22;  _23 := -V_._23;
839
          _31 := -V_._31;  _32 := -V_._32;  _33 := -V_._33;
840
     end;
841
end;
842

843
class operator TdSingleM3.Add( const A_,B_:TdSingleM3 ) :TdSingleM3;
844
begin
845
     with Result do
846
     begin
847
          _11 := A_._11 + B_._11;  _12 := A_._12 + B_._12;  _13 := A_._13 + B_._13;
848
          _21 := A_._21 + B_._21;  _22 := A_._22 + B_._22;  _23 := A_._23 + B_._23;
849
          _31 := A_._31 + B_._31;  _32 := A_._32 + B_._32;  _33 := A_._33 + B_._33;
850
     end;
851
end;
852

853
class operator TdSingleM3.Subtract( const A_,B_:TdSingleM3 ) :TdSingleM3;
854
begin
855
     with Result do
856
     begin
857
          _11 := A_._11 - B_._11;  _12 := A_._12 - B_._12;  _13 := A_._13 - B_._13;
858
          _21 := A_._21 - B_._21;  _22 := A_._22 - B_._22;  _23 := A_._23 - B_._23;
859
          _31 := A_._31 - B_._31;  _32 := A_._32 - B_._32;  _33 := A_._33 - B_._33;
860
     end;
861
end;
862

863
class operator TdSingleM3.Multiply( const A_,B_:TdSingleM3 ) :TdSingleM3;
864
begin
865
     {
866
       11 12 13    11 12 13
867
       21 22 23 × 21 22 23
868
       31 32 33    31 32 33
869
     }
870

871
     with Result do
872
     begin
873
          _11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
874
          _12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
875
          _13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
876

877
          _21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
878
          _22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
879
          _23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
880

881
          _31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
882
          _32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
883
          _33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
884
     end;
885
end;
886

887
class operator TdSingleM3.Multiply( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
888
begin
889
     with Result do
890
     begin
891
          _11 := A_._11 * B_;  _12 := A_._12 * B_;  _13 := A_._13 * B_;
892
          _21 := A_._21 * B_;  _22 := A_._22 * B_;  _23 := A_._23 * B_;
893
          _31 := A_._31 * B_;  _32 := A_._32 * B_;  _33 := A_._33 * B_;
894
     end;
895
end;
896

897
class operator TdSingleM3.Multiply( const A_:TdSingle; const B_:TdSingleM3 ) :TdSingleM3;
898
begin
899
     with Result do
900
     begin
901
          _11 := A_ * B_._11;  _12 := A_ * B_._12;  _13 := A_ * B_._13;
902
          _21 := A_ * B_._21;  _22 := A_ * B_._22;  _23 := A_ * B_._23;
903
          _31 := A_ * B_._31;  _32 := A_ * B_._32;  _33 := A_ * B_._33;
904
     end;
905
end;
906

907
class operator TdSingleM3.Multiply( const A_:TdSingle3D; const B_:TdSingleM3 ) :TdSingle3D;
908
begin
909
     {
910
                11 12 13
911
       X Y Z × 21 22 23
912
                31 32 33
913
     }
914

915
     with Result do
916
     begin
917
          X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
918
          Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
919
          Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
920
     end;
921
end;
922

923
class operator TdSingleM3.Multiply( const A_:TdSingleM3; const B_:TdSingle3D ) :TdSingle3D;
924
begin
925
     {
926
       11 12 13    X
927
       21 22 23 × Y
928
       31 32 33    Z
929
     }
930

931
     with Result do
932
     begin
933
          X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
934
          Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
935
          Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
936
     end;
937
end;
938

939
class operator TdSingleM3.Divide( const A_:TdSingleM3; const B_:TdSingle ) :TdSingleM3;
940
begin
941
     with Result do
942
     begin
943
          _11 := A_._11 / B_;  _12 := A_._12 / B_;  _13 := A_._13 / B_;
944
          _21 := A_._21 / B_;  _22 := A_._22 / B_;  _23 := A_._23 / B_;
945
          _31 := A_._31 / B_;  _32 := A_._32 / B_;  _33 := A_._33 / B_;
946
     end;
947
end;
948

949
function TdSingleM3.Transpose :TdSingleM3;
950
begin
951
     Result._11 := _11;  Result._12 := _21;  Result._13 := _31;
952
     Result._21 := _12;  Result._22 := _22;  Result._23 := _32;
953
     Result._31 := _13;  Result._32 := _23;  Result._33 := _33;
954
end;
955

956
function TdSingleM3.Det :TdSingle;
957
begin
958
     Result:= _11 * ( _22 * _33 - _23 * _32 )
959
            + _12 * ( _23 * _31 - _21 * _33 )
960
            + _13 * ( _21 * _32 - _22 * _31 );
961
end;
962

963
function TdSingleM3.Adjugate :TdSingleM3;
964
begin
965
     Result._11 := +TdSingleM2.Create( {11} {12} {13}
966
                                       {21} _22, _23,
967
                                       {31} _32, _33  ).Det;
968

969
     Result._21 := -TdSingleM2.Create( {11} {12} {13}
970
                                       _21, {22} _23,
971
                                       _31, {32} _33  ).Det;
972

973
     Result._31 := +TdSingleM2.Create( {11} {12} {13}
974
                                       _21, _22, {23}
975
                                       _31, _32  {33} ).Det;
976

977
     Result._12 := -TdSingleM2.Create( {11} _12, _13,
978
                                       {21} {22} {23}
979
                                       {31} _32, _33  ).Det;
980

981
     Result._22 := +TdSingleM2.Create( _11, {12} _13,
982
                                       {21} {22} {23}
983
                                       _31, {32} _33  ).Det;
984

985
     Result._32 := -TdSingleM2.Create( _11, _12, {13}
986
                                       {21} {22} {23}
987
                                       _31, _32  {33} ).Det;
988

989
     Result._13 := +TdSingleM2.Create( {11} _12, _13,
990
                                       {21} _22, _23
991
                                       {31} {32} {33} ).Det;
992

993
     Result._23 := -TdSingleM2.Create( _11, {12} _13,
994
                                       _21, {22} _23
995
                                       {31} {32} {33} ).Det;
996

997
     Result._33 := +TdSingleM2.Create( _11, _12, {13}
998
                                       _21, _22  {23}
999
                                       {31} {32} {33} ).Det;
1000
end;
1001

1002
function TdSingleM3.Inverse :TdSingleM3;
1003
var
1004
   A :TdSingleM3;
1005
begin
1006
     A := Adjugate;
1007

1008
     Result := A / ( _11 * A._11
1009
                   + _12 * A._21
1010
                   + _13 * A._31 );
1011
end;
1012

1013
function TdDoubleM3.GetM( const Y_,X_:Integer ) :TdDouble;
1014
begin
1015
     Result := _[ Y_, X_ ];
1016
end;
1017

1018
procedure TdDoubleM3.SetM( const Y_,X_:Integer; const M_:TdDouble );
1019
begin
1020
     _[ Y_, X_ ] := M_;
1021
end;
1022

1023
//------------------------------------------------------------------------------
1024

1025
function TdDoubleM3.GetAxisX :TdDouble3D;
1026
begin
1027
     with Result do
1028
     begin
1029
          X := _11;
1030
          Y := _21;
1031
          Z := _31;
1032
     end;
1033
end;
1034

1035
procedure TdDoubleM3.SetAxisX( const AxisX_:TdDouble3D );
1036
begin
1037
     with AxisX_ do
1038
     begin
1039
          _11 := X;
1040
          _21 := Y;
1041
          _31 := Z;
1042
     end;
1043
end;
1044

1045
function TdDoubleM3.GetAxisY :TdDouble3D;
1046
begin
1047
     with Result do
1048
     begin
1049
          X := _12;
1050
          Y := _22;
1051
          Z := _32;
1052
     end;
1053
end;
1054

1055
procedure TdDoubleM3.SetAxisY( const AxisY_:TdDouble3D );
1056
begin
1057
     with AxisY_ do
1058
     begin
1059
          _12 := X;
1060
          _22 := Y;
1061
          _32 := Z;
1062
     end;
1063
end;
1064

1065
function TdDoubleM3.GetAxisZ :TdDouble3D;
1066
begin
1067
     with Result do
1068
     begin
1069
          X := _13;
1070
          Y := _23;
1071
          Z := _33;
1072
     end;
1073
end;
1074

1075
procedure TdDoubleM3.SetAxisZ( const AxisZ_:TdDouble3D );
1076
begin
1077
     with AxisZ_ do
1078
     begin
1079
          _13 := X;
1080
          _23 := Y;
1081
          _33 := Z;
1082
     end;
1083
end;
1084

1085
constructor TdDoubleM3.Create( const _11_,_12_,_13_,
1086
                                     _21_,_22_,_23_,
1087
                                     _31_,_32_,_33_:TdDouble );
1088
begin
1089
     _11 := _11_;  _12 := _12_;  _13 := _13_;
1090
     _21 := _21_;  _22 := _22_;  _23 := _23_;
1091
     _31 := _31_;  _32 := _32_;  _33 := _33_;
1092
end;
1093

1094
class operator TdDoubleM3.Positive( const V_:TdDoubleM3 ) :TdDoubleM3;
1095
begin
1096
     with Result do
1097
     begin
1098
          _11 := +V_._11;  _12 := +V_._12;  _13 := +V_._13;
1099
          _21 := +V_._21;  _22 := +V_._22;  _23 := +V_._23;
1100
          _31 := +V_._31;  _32 := +V_._32;  _33 := +V_._33;
1101
     end;
1102
end;
1103

1104
class operator TdDoubleM3.Negative( const V_:TdDoubleM3 ) :TdDoubleM3;
1105
begin
1106
     with Result do
1107
     begin
1108
          _11 := -V_._11;  _12 := -V_._12;  _13 := -V_._13;
1109
          _21 := -V_._21;  _22 := -V_._22;  _23 := -V_._23;
1110
          _31 := -V_._31;  _32 := -V_._32;  _33 := -V_._33;
1111
     end;
1112
end;
1113

1114
class operator TdDoubleM3.Add( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1115
begin
1116
     with Result do
1117
     begin
1118
          _11 := A_._11 + B_._11;  _12 := A_._12 + B_._12;  _13 := A_._13 + B_._13;
1119
          _21 := A_._21 + B_._21;  _22 := A_._22 + B_._22;  _23 := A_._23 + B_._23;
1120
          _31 := A_._31 + B_._31;  _32 := A_._32 + B_._32;  _33 := A_._33 + B_._33;
1121
     end;
1122
end;
1123

1124
class operator TdDoubleM3.Subtract( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1125
begin
1126
     with Result do
1127
     begin
1128
          _11 := A_._11 - B_._11;  _12 := A_._12 - B_._12;  _13 := A_._13 - B_._13;
1129
          _21 := A_._21 - B_._21;  _22 := A_._22 - B_._22;  _23 := A_._23 - B_._23;
1130
          _31 := A_._31 - B_._31;  _32 := A_._32 - B_._32;  _33 := A_._33 - B_._33;
1131
     end;
1132
end;
1133

1134
class operator TdDoubleM3.Multiply( const A_,B_:TdDoubleM3 ) :TdDoubleM3;
1135
begin
1136
     {
1137
       11 12 13    11 12 13
1138
       21 22 23 × 21 22 23
1139
       31 32 33    31 32 33
1140
     }
1141

1142
     with Result do
1143
     begin
1144
          _11 := A_._11 * B_._11 + A_._12 * B_._21 + A_._13 * B_._31;
1145
          _12 := A_._11 * B_._12 + A_._12 * B_._22 + A_._13 * B_._32;
1146
          _13 := A_._11 * B_._13 + A_._12 * B_._23 + A_._13 * B_._33;
1147

1148
          _21 := A_._21 * B_._11 + A_._22 * B_._21 + A_._23 * B_._31;
1149
          _22 := A_._21 * B_._12 + A_._22 * B_._22 + A_._23 * B_._32;
1150
          _23 := A_._21 * B_._13 + A_._22 * B_._23 + A_._23 * B_._33;
1151

1152
          _31 := A_._31 * B_._11 + A_._32 * B_._21 + A_._33 * B_._31;
1153
          _32 := A_._31 * B_._12 + A_._32 * B_._22 + A_._33 * B_._32;
1154
          _33 := A_._31 * B_._13 + A_._32 * B_._23 + A_._33 * B_._33;
1155
     end;
1156
end;
1157

1158
class operator TdDoubleM3.Multiply( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
1159
begin
1160
     with Result do
1161
     begin
1162
          _11 := A_._11 * B_;  _12 := A_._12 * B_;  _13 := A_._13 * B_;
1163
          _21 := A_._21 * B_;  _22 := A_._22 * B_;  _23 := A_._23 * B_;
1164
          _31 := A_._31 * B_;  _32 := A_._32 * B_;  _33 := A_._33 * B_;
1165
     end;
1166
end;
1167

1168
class operator TdDoubleM3.Multiply( const A_:TdDouble; const B_:TdDoubleM3 ) :TdDoubleM3;
1169
begin
1170
     with Result do
1171
     begin
1172
          _11 := A_ * B_._11;  _12 := A_ * B_._12;  _13 := A_ * B_._13;
1173
          _21 := A_ * B_._21;  _22 := A_ * B_._22;  _23 := A_ * B_._23;
1174
          _31 := A_ * B_._31;  _32 := A_ * B_._32;  _33 := A_ * B_._33;
1175
     end;
1176
end;
1177

1178
class operator TdDoubleM3.Multiply( const A_:TdDouble3D; const B_:TdDoubleM3 ) :TdDouble3D;
1179
begin
1180
     {
1181
                11 12 13
1182
       X Y Z × 21 22 23
1183
                31 32 33
1184
     }
1185

1186
     with Result do
1187
     begin
1188
          X := A_.X * B_._11 + A_.Y * B_._21 + A_.Z * B_._31;
1189
          Y := A_.X * B_._12 + A_.Y * B_._22 + A_.Z * B_._32;
1190
          Z := A_.X * B_._13 + A_.Y * B_._23 + A_.Z * B_._33;
1191
     end;
1192
end;
1193

1194
class operator TdDoubleM3.Multiply( const A_:TdDoubleM3; const B_:TdDouble3D ) :TdDouble3D;
1195
begin
1196
     {
1197
       11 12 13    X
1198
       21 22 23 × Y
1199
       31 32 33    Z
1200
     }
1201

1202
     with Result do
1203
     begin
1204
          X := A_._11 * B_.X + A_._12 * B_.Y + A_._13 * B_.Z;
1205
          Y := A_._21 * B_.X + A_._22 * B_.Y + A_._23 * B_.Z;
1206
          Z := A_._31 * B_.X + A_._32 * B_.Y + A_._33 * B_.Z;
1207
     end;
1208
end;
1209

1210
class operator TdDoubleM3.Divide( const A_:TdDoubleM3; const B_:TdDouble ) :TdDoubleM3;
1211
begin
1212
     with Result do
1213
     begin
1214
          _11 := A_._11 / B_;  _12 := A_._12 / B_;  _13 := A_._13 / B_;
1215
          _21 := A_._21 / B_;  _22 := A_._22 / B_;  _23 := A_._23 / B_;
1216
          _31 := A_._31 / B_;  _32 := A_._32 / B_;  _33 := A_._33 / B_;
1217
     end;
1218
end;
1219

1220
function TdDoubleM3.Transpose :TdDoubleM3;
1221
begin
1222
     Result._11 := _11;  Result._12 := _21;  Result._13 := _31;
1223
     Result._21 := _12;  Result._22 := _22;  Result._23 := _32;
1224
     Result._31 := _13;  Result._32 := _23;  Result._33 := _33;
1225
end;
1226

1227
function TdDoubleM3.Det :TdDouble;
1228
begin
1229
     Result:= _11 * ( _22 * _33 - _23 * _32 )
1230
            + _12 * ( _23 * _31 - _21 * _33 )
1231
            + _13 * ( _21 * _32 - _22 * _31 );
1232
end;
1233

1234
function TdDoubleM3.Adjugate :TdDoubleM3;
1235
begin
1236
     Result._11 := +TdDoubleM2.Create( {11} {12} {13}
1237
                                       {21} _22, _23,
1238
                                       {31} _32, _33  ).Det;
1239

1240
     Result._21 := -TdDoubleM2.Create( {11} {12} {13}
1241
                                       _21, {22} _23,
1242
                                       _31, {32} _33  ).Det;
1243

1244
     Result._31 := +TdDoubleM2.Create( {11} {12} {13}
1245
                                       _21, _22, {23}
1246
                                       _31, _32  {33} ).Det;
1247

1248
     Result._12 := -TdDoubleM2.Create( {11} _12, _13,
1249
                                       {21} {22} {23}
1250
                                       {31} _32, _33  ).Det;
1251

1252
     Result._22 := +TdDoubleM2.Create( _11, {12} _13,
1253
                                       {21} {22} {23}
1254
                                       _31, {32} _33  ).Det;
1255

1256
     Result._32 := -TdDoubleM2.Create( _11, _12, {13}
1257
                                       {21} {22} {23}
1258
                                       _31, _32  {33} ).Det;
1259

1260
     Result._13 := +TdDoubleM2.Create( {11} _12, _13,
1261
                                       {21} _22, _23
1262
                                       {31} {32} {33} ).Det;
1263

1264
     Result._23 := -TdDoubleM2.Create( _11, {12} _13,
1265
                                       _21, {22} _23
1266
                                       {31} {32} {33} ).Det;
1267

1268
     Result._33 := +TdDoubleM2.Create( _11, _12, {13}
1269
                                       _21, _22  {23}
1270
                                       {31} {32} {33} ).Det;
1271
end;
1272

1273
function TdDoubleM3.Inverse :TdDoubleM3;
1274
var
1275
   A :TdDoubleM3;
1276
begin
1277
     A := Adjugate;
1278

1279
     Result := A / ( _11 * A._11
1280
                   + _12 * A._21
1281
                   + _13 * A._31 );
1282
end;
1283

1284
function ArrowRot( const P0_,P1_:TSingle3D ) :TSingleM3;
1285
var
1286
   AX, AY ,AZ, E :TSingle3D;
1287
begin
1288
     AZ := P0_.UnitorTo( P1_ );
1289

1290
     with AZ do
1291
     begin
1292
          case MinI( Abs( X ), Abs( Y ) ,Abs( Z ) ) of
1293
            1: E := TSingle3D.Create( 1, 0, 0 );
1294
            2: E := TSingle3D.Create( 0, 1, 0 );
1295
            3: E := TSingle3D.Create( 0, 0, 1 );
1296
          end;
1297
     end;
1298

1299
     AY := CrossProduct( AZ, E ).Unitor;
1300

1301
     AX := CrossProduct( AY, AZ );
1302

1303
     with Result do
1304
     begin
1305
          _11 := AX.X;  _12 := AY.X;  _13 := AZ.X;
1306
          _21 := AX.Y;  _22 := AY.Y;  _23 := AZ.Y;
1307
          _31 := AX.Z;  _32 := AY.Z;  _33 := AZ.Z;
1308
     end;
1309
end;
1310

1311
function ArrowRot( const P0_,P1_:TDouble3D ) :TDoubleM3;
1312
var
1313
   AX, AY ,AZ, E :TDouble3D;
1314
begin
1315
     AZ := P0_.UnitorTo( P1_ );
1316

1317
     with AZ do
1318
     begin
1319
          case MinI( Abs( X ), Abs( Y ) ,Abs( Z ) ) of
1320
            1: E := TDouble3D.Create( 1, 0, 0 );
1321
            2: E := TDouble3D.Create( 0, 1, 0 );
1322
            3: E := TDouble3D.Create( 0, 0, 1 );
1323
          end;
1324
     end;
1325

1326
     AY := CrossProduct( AZ, E ).Unitor;
1327

1328
     AX := CrossProduct( AY, AZ );
1329

1330
     with Result do
1331
     begin
1332
          _11 := AX.X;  _12 := AY.X;  _13 := AZ.X;
1333
          _21 := AX.Y;  _22 := AY.Y;  _23 := AZ.Y;
1334
          _31 := AX.Z;  _32 := AY.Z;  _33 := AZ.Z;
1335
     end;
1336
end;
1337

1338
initialization //-------------------------------------------------------------
1339

1340
finalization
1341

1342
end.
1343

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

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

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

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