3
interface //#################################################################### ■
7
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
9
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
11
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleC
16
function GetSiz2 :Single;
17
function GetSize :Single;
18
procedure SetSize( const Size_:Single );
19
function GetUnitor :TSingleC;
20
procedure SetUnitor( const Unitor_:TSingleC );
21
function GetConj :TSingleC;
22
procedure SetConj( const Conj_:TSingleC );
23
function GetAngle :Single;
28
constructor Create( const R_,I_:Single );
30
property Siz2 :Single read GetSiz2 ;
31
property Size :Single read GetSize write SetSize ;
32
property Unitor :TSingleC read GetUnitor write SetUnitor;
33
property Conj :TSingleC read GetConj write SetConj ;
34
property Angle :Single read GetAngle ;
36
class operator Negative( const V_:TSingleC ) :TSingleC;
37
class operator Positive( const V_:TSingleC ) :TSingleC;
38
class operator Add( const A_,B_:TSingleC ) :TSingleC;
39
class operator Subtract( const A_,B_:TSingleC ) :TSingleC;
40
class operator Multiply( const A_,B_:TSingleC ) :TSingleC;
41
class operator Multiply( const A_:TSingleC; const B_:Single ) :TSingleC;
42
class operator Multiply( const A_:Single; const B_:TSingleC ) :TSingleC;
43
class operator Divide( const A_,B_:TSingleC ) :TSingleC;
44
class operator Divide( const A_:TSingleC; const B_:Single ) :TSingleC;
46
class operator Implicit( const V_:Single ) :TSingleC;
49
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleC
54
function GetSiz2 :Double;
55
function GetSize :Double;
56
procedure SetSize( const Size_:Double );
57
function GetUnitor :TDoubleC;
58
procedure SetUnitor( const Unitor_:TDoubleC );
59
function GetConj :TDoubleC;
60
procedure SetConj( const Conj_:TDoubleC );
61
function GetAngle :Double;
66
constructor Create( const R_,I_:Double );
68
property Siz2 :Double read GetSiz2 ;
69
property Size :Double read GetSize write SetSize ;
70
property Unitor :TDoubleC read GetUnitor write SetUnitor;
71
property Conj :TDoubleC read GetConj write SetConj ;
72
property Angle :Double read GetAngle ;
74
class operator Negative( const V_:TDoubleC ) :TDoubleC;
75
class operator Positive( const V_:TDoubleC ) :TDoubleC;
76
class operator Add( const A_,B_:TDoubleC ) :TDoubleC;
77
class operator Subtract( const A_,B_:TDoubleC ) :TDoubleC;
78
class operator Multiply( const A_,B_:TDoubleC ) :TDoubleC;
79
class operator Multiply( const A_:TDoubleC; const B_:Double ) :TDoubleC;
80
class operator Multiply( const A_:Double; const B_:TDoubleC ) :TDoubleC;
81
class operator Divide( const A_,B_:TDoubleC ) :TDoubleC;
82
class operator Divide( const A_:TDoubleC; const B_:Double ) :TDoubleC;
84
class operator Implicit( const V_:Double ) :TDoubleC;
85
class operator Implicit( const V_:TSingleC ) :TDoubleC;
86
class operator Implicit( const V_:TDoubleC ) :TSingleC;
89
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleAreaC
91
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleAreaC
98
function GetCenter :TDoubleC;
99
procedure SetCenter( const Center_:TDoubleC );
100
function GetCenterR :Double;
101
procedure SetCenterR( const CenterR_:Double );
102
function GetCenterI :Double;
103
procedure SetCenterI( const CenterI_:Double );
104
function GetSizeR :Double;
105
procedure SetSizeR( const SizeR_:Double );
106
function GetSizeI :Double;
107
procedure SetSizeI( const SizeI_:Double );
110
constructor Create( const Min_,Max_:TDoubleC ); overload;
111
constructor Create( const MinR_,MinI_,MaxR_,MaxI_:Double ); overload;
113
property Min :TDoubleC read _Min write _Min ;
114
property Max :TDoubleC read _Max write _Max ;
115
property Center :TDoubleC read GetCenter write SetCenter ;
116
property CenterR :Double read GetCenterR write SetCenterR;
117
property CenterI :Double read GetCenterI write SetCenterI;
118
property SizeR :Double read GetSizeR write SetSizeR ;
119
property SizeI :Double read GetSizeI write SetSizeI ;
121
class operator Negative( const V_:TDoubleAreaC ) :TDoubleAreaC;
122
class operator Positive( const V_:TDoubleAreaC ) :TDoubleAreaC;
123
class operator Add( const A_,B_:TDoubleAreaC ) :TDoubleAreaC;
124
class operator Subtract( const A_,B_:TDoubleAreaC ) :TDoubleAreaC;
125
class operator Multiply( const A_:TDoubleAreaC; const B_:Double ) :TDoubleAreaC;
126
class operator Multiply( const A_:Double; const B_:TDoubleAreaC ) :TDoubleAreaC;
127
class operator Divide( const A_:TDoubleAreaC; const B_:Double ) :TDoubleAreaC;
131
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
133
const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
135
Imaginary :TDoubleC = ( R:0; I:1 );
137
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
139
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
141
function Pow( const X_:TSingleC; const N_:Single ) :TSingleC; overload;
142
function Pow( const X_:TDoubleC; const N_:Double ) :TDoubleC; overload;
144
function Roo2( const X_:TSingleC ) :TSingleC; overload;
145
function Roo2( const X_:TDoubleC ) :TDoubleC; overload;
147
function Cos( const A_:TSingleC ) :TSingleC; overload;
148
function Cos( const A_:TDoubleC ) :TDoubleC; overload;
150
function Sin( const A_:TSingleC ) :TSingleC; overload;
151
function Sin( const A_:TDoubleC ) :TDoubleC; overload;
153
function Tan( const A_:TSingleC ) :TSingleC; overload;
154
function Tan( const A_:TDoubleC ) :TDoubleC; overload;
156
function Exp( const A_:TSingleC ) :TSingleC; overload;
157
function Exp( const A_:TDoubleC ) :TDoubleC; overload;
159
function Ln( const A_:TSingleC ) :TSingleC; overload;
160
function Ln( const A_:TDoubleC ) :TDoubleC; overload;
162
function ArcCos( const X_:TDoubleC ) :TDoubleC; overload;
164
function ArcSin( const X_:TDoubleC ) :TDoubleC; overload;
166
implementation //############################################################### ■
170
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
172
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleC
174
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
176
function TSingleC.GetSiz2 :Single;
178
Result := Pow2( R ) + Pow2( I )
181
function TSingleC.GetSize :Single;
183
Result := Roo2( GetSiz2 )
186
procedure TSingleC.SetSize( const Size_:Single );
188
Self := Size_ * Unitor
191
function TSingleC.GetUnitor :TSingleC;
193
Result := Self / Size
196
procedure TSingleC.SetUnitor( const Unitor_:TSingleC );
198
Self := Size * Unitor_
201
function TSingleC.GetConj :TSingleC;
207
procedure TSingleC.SetConj( const Conj_:TSingleC );
213
function TSingleC.GetAngle :Single;
215
Result := ArcTan2( I, R )
218
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
220
constructor TSingleC.Create( const R_,I_:Single );
226
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 演算子
228
class operator TSingleC.Negative( const V_:TSingleC ) :TSingleC;
237
class operator TSingleC.Positive( const V_:TSingleC ) :TSingleC;
246
class operator TSingleC.Add( const A_,B_:TSingleC ) :TSingleC;
255
class operator TSingleC.Subtract( const A_,B_:TSingleC ) :TSingleC;
264
class operator TSingleC.Multiply( const A_,B_:TSingleC ) :TSingleC;
268
R := A_.R * B_.R - A_.I * B_.I;
269
I := A_.R * B_.I + A_.I * B_.R;
273
class operator TSingleC.Multiply( const A_:TSingleC; const B_:Single ) :TSingleC;
282
class operator TSingleC.Multiply( const A_:Single; const B_:TSingleC ) :TSingleC;
291
class operator TSingleC.Divide( const A_,B_:TSingleC ) :TSingleC;
299
R := ( A_.R * B_.R + A_.I * B_.I ) / C;
300
I := ( A_.I * B_.R - A_.R * B_.I ) / C;
304
class operator TSingleC.Divide( const A_:TSingleC; const B_:Single ) :TSingleC;
313
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 型変換
315
class operator TSingleC.Implicit( const V_:Single ) :TSingleC;
324
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleC
326
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
328
function TDoubleC.GetSiz2 :Double;
330
Result := Pow2( R ) + Pow2( I )
333
function TDoubleC.GetSize :Double;
335
Result := Roo2( GetSiz2 )
338
procedure TDoubleC.SetSize( const Size_:Double );
340
Self := Size_ * Unitor
343
function TDoubleC.GetUnitor :TDoubleC;
345
Result := Self / Size
348
procedure TDoubleC.SetUnitor( const Unitor_:TDoubleC );
350
Self := Size * Unitor_
353
function TDoubleC.GetConj :TDoubleC;
359
procedure TDoubleC.SetConj( const Conj_:TDoubleC );
365
function TDoubleC.GetAngle :Double;
367
Result := ArcTan2( I, R )
370
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
372
constructor TDoubleC.Create( const R_,I_:Double );
378
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 演算子
380
class operator TDoubleC.Negative( const V_:TDoubleC ) :TDoubleC;
389
class operator TDoubleC.Positive( const V_:TDoubleC ) :TDoubleC;
398
class operator TDoubleC.Add( const A_,B_:TDoubleC ) :TDoubleC;
407
class operator TDoubleC.Subtract( const A_,B_:TDoubleC ) :TDoubleC;
416
class operator TDoubleC.Multiply( const A_,B_:TDoubleC ) :TDoubleC;
420
R := A_.R * B_.R - A_.I * B_.I;
421
I := A_.R * B_.I + A_.I * B_.R;
425
class operator TDoubleC.Multiply( const A_:TDoubleC; const B_:Double ) :TDoubleC;
434
class operator TDoubleC.Multiply( const A_:Double; const B_:TDoubleC ) :TDoubleC;
443
class operator TDoubleC.Divide( const A_,B_:TDoubleC ) :TDoubleC;
451
R := ( A_.R * B_.R + A_.I * B_.I ) / C;
452
I := ( A_.I * B_.R - A_.R * B_.I ) / C;
456
class operator TDoubleC.Divide( const A_:TDoubleC; const B_:Double ) :TDoubleC;
465
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 型変換
467
class operator TDoubleC.Implicit( const V_:Double ) :TDoubleC;
476
class operator TDoubleC.Implicit( const V_:TSingleC ) :TDoubleC;
485
class operator TDoubleC.Implicit( const V_:TDoubleC ) :TSingleC;
494
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDoubleAreaC
496
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
498
function TDoubleAreaC.GetCenter :TDoubleC;
500
Result := ( _Max + _Min ) / 2
503
procedure TDoubleAreaC.SetCenter( const Center_:TDoubleC );
512
function TDoubleAreaC.GetCenterR :Double;
514
Result := ( _Max.R + _Min.R ) / 2
517
procedure TDoubleAreaC.SetCenterR( const CenterR_:Double );
523
_Min.R := CenterR_ - S;
524
_Max.R := CenterR_ + S;
527
function TDoubleAreaC.GetCenterI :Double;
529
Result := ( _Max.I + _Min.I ) / 2
532
procedure TDoubleAreaC.SetCenterI( const CenterI_:Double );
538
_Min.I := CenterI_ - S;
539
_Max.I := CenterI_ + S;
542
function TDoubleAreaC.GetSizeR :Double;
544
Result := _Max.R - _Min.R
547
procedure TDoubleAreaC.SetSizeR( const SizeR_:Double );
558
function TDoubleAreaC.GetSizeI :Double;
560
Result := _Max.I - _Min.I
563
procedure TDoubleAreaC.SetSizeI( const SizeI_:Double );
574
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
576
constructor TDoubleAreaC.Create( const Min_,Max_:TDoubleC );
582
constructor TDoubleAreaC.Create( const MinR_,MinI_,MaxR_,MaxI_:Double );
596
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 演算子
598
class operator TDoubleAreaC.Negative( const V_:TDoubleAreaC ) :TDoubleAreaC;
607
class operator TDoubleAreaC.Positive( const V_:TDoubleAreaC ) :TDoubleAreaC;
616
class operator TDoubleAreaC.Add( const A_,B_:TDoubleAreaC ) :TDoubleAreaC;
620
_Min := A_._Min + B_._Min;
621
_Max := A_._Max + B_._Max;
625
class operator TDoubleAreaC.Subtract( const A_,B_:TDoubleAreaC ) :TDoubleAreaC;
629
_Min := A_._Min - B_._Min;
630
_Max := A_._Max - B_._Max;
634
class operator TDoubleAreaC.Multiply( const A_:TDoubleAreaC; const B_:Double ) :TDoubleAreaC;
638
_Min := A_._Min * B_;
639
_Max := A_._Max * B_;
643
class operator TDoubleAreaC.Multiply( const A_:Double; const B_:TDoubleAreaC ) :TDoubleAreaC;
647
_Min := A_ * B_._Min;
648
_Max := A_ * B_._Max;
652
class operator TDoubleAreaC.Divide( const A_:TDoubleAreaC; const B_:Double ) :TDoubleAreaC;
656
_Min := A_._Min / B_;
657
_Max := A_._Max / B_;
661
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 型変換
664
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
666
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
668
function Pow( const X_:TSingleC; const N_:Single ) :TSingleC;
672
S := Power( X_.Size, N_ );
675
Result.R := S * Cos( A );
676
Result.I := S * Sin( A );
679
function Pow( const X_:TDoubleC; const N_:Double ) :TDoubleC;
683
S := Power( X_.Size, N_ );
686
Result.R := S * Cos( A );
687
Result.I := S * Sin( A );
690
////////////////////////////////////////////////////////////////////////////////
692
function Roo2( const X_:TSingleC ) :TSingleC;
696
S := Roo2( X_.Size );
699
Result.R := S * Cos( A );
700
Result.I := S * Sin( A );
703
function Roo2( const X_:TDoubleC ) :TDoubleC;
707
S := Roo2( X_.Size );
710
Result.R := S * Cos( A );
711
Result.I := S * Sin( A );
714
////////////////////////////////////////////////////////////////////////////////
716
function Cos( const A_:TSingleC ) :TSingleC;
720
Result.R := +Cos( R ) * Cosh( I );
721
Result.I := -Sin( R ) * Sinh( I );
725
function Cos( const A_:TDoubleC ) :TDoubleC;
729
Result.R := +Cos( R ) * Cosh( I );
730
Result.I := -Sin( R ) * Sinh( I );
734
////////////////////////////////////////////////////////////////////////////////
736
function Sin( const A_:TSingleC ) :TSingleC;
740
Result.R := +Sin( R ) * Cosh( I );
741
Result.I := +Cos( R ) * Sinh( I );
745
function Sin( const A_:TDoubleC ) :TDoubleC;
749
Result.R := +Sin( R ) * Cosh( I );
750
Result.I := +Cos( R ) * Sinh( I );
754
////////////////////////////////////////////////////////////////////////////////
756
function Tan( const A_:TSingleC ) :TSingleC;
758
Result := Sin( A_ ) / Cos( A_ );
761
function Tan( const A_:TDoubleC ) :TDoubleC;
763
Result := Sin( A_ ) / Cos( A_ );
766
////////////////////////////////////////////////////////////////////////////////
768
function Exp( const A_:TSingleC ) :TSingleC;
776
Result.R := E * Cos( I );
777
Result.I := E * Sin( I );
781
function Exp( const A_:TDoubleC ) :TDoubleC;
789
Result.R := E * Cos( I );
790
Result.I := E * Sin( I );
794
////////////////////////////////////////////////////////////////////////////////
796
function Ln( const A_:TSingleC ) :TSingleC;
800
Result.R := Ln( Size );
805
function Ln( const A_:TDoubleC ) :TDoubleC;
809
Result.R := Ln( Size );
814
////////////////////////////////////////////////////////////////////////////////
816
function ArcCos( const X_:TDoubleC ) :TDoubleC;
818
Result := +Imaginary * Ln( X_ + Imaginary * Roo2( 1 - X_ * X_ ) );
821
function ArcSin( const X_:TDoubleC ) :TDoubleC;
823
Result := -Imaginary * Ln( Imaginary * X_ + Roo2( 1 - X_ * X_ ) );
826
//############################################################################## □
828
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
830
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
832
end. //######################################################################### ■