3
interface //#################################################################### ■
9
//type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
11
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
13
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
15
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
17
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
19
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
21
function Lerp( const P0_,P1_,T0_,T1_,T_:Single ) :Single; overload;
22
function Lerp( const P0_,P1_,T0_,T1_,T_:Double ) :Double; overload;
23
function Lerp( const P0_,P1_,T0_,T1_,T_:TdSingle ) :TdSingle; overload;
24
function Lerp( const P0_,P1_,T0_,T1_,T_:TdDouble ) :TdDouble; overload;
26
function Lerp( const P0_,P1_,T_:Single ) :Single; overload;
27
function Lerp( const P0_,P1_,T_:Double ) :Double; overload;
28
function Lerp( const P0_,P1_,T_:TdSingle ) :TdSingle; overload;
29
function Lerp( const P0_,P1_,T_:TdDouble ) :TdDouble; overload;
31
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:Single ) :Single; overload;
32
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:Double ) :Double; overload;
33
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:TdSingle ) :TdSingle; overload;
34
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:TdDouble ) :TdDouble; overload;
36
function CatmullRom( const P0_,P1_,P2_,P3_,T_:Single ) :Single; overload;
37
function CatmullRom( const P0_,P1_,P2_,P3_,T_:Double ) :Double; overload;
38
function CatmullRom( const P0_,P1_,P2_,P3_,T_:TdSingle ) :TdSingle; overload;
39
function CatmullRom( const P0_,P1_,P2_,P3_,T_:TdDouble ) :TdDouble; overload;
40
function CatmullRom( const P0_,P1_,P2_,P3_:Single; const T_:TdSingle ) :TdSingle; overload;
41
function CatmullRom( const P0_,P1_,P2_,P3_:Double; const T_:TdDouble ) :TdDouble; overload;
43
function BSpline( const T_:Single; const I0,N1:Integer; const Ts_:array of Single ) :Single; overload;
44
function BSpline( const T_:Double; const I0,N1:Integer; const Ts_:array of Double ) :Double; overload;
45
function BSpline( const T_:TdSingle; const I0,N1:Integer; const Ts_:array of TdSingle ) :TdSingle; overload;
46
function BSpline( const T_:TdDouble; const I0,N1:Integer; const Ts_:array of TdDouble ) :TdDouble; overload;
48
function BSplin4( const X_:Single ) :Single; overload;
49
function BSplin4( const X_:Double ) :Double; overload;
50
function BSplin4( const X_:TdSingle ) :TdSingle; overload;
51
function BSplin4( const X_:TdDouble ) :TdDouble; overload;
53
procedure BSplin4( const T_:Single; out Ws_:TSingle4D ); overload;
54
procedure BSplin4( const T_:Double; out Ws_:TDouble4D ); overload;
55
procedure BSplin4( const T_:TdSingle; out Ws_:TdSingle4D ); overload;
56
procedure BSplin4( const T_:TdDouble; out Ws_:TdDouble4D ); overload;
58
function BSplin4( const Ps_:TSingle4D; const T_:Single ) :Single; overload;
59
function BSplin4( const Ps_:TDouble4D; const T_:Double ) :Double; overload;
60
function BSplin4( const Ps_:TdSingle4D; const T_:TdSingle ) :TdSingle; overload;
61
function BSplin4( const Ps_:TdDouble4D; const T_:TdDouble ) :TdDouble; overload;
63
procedure Bezie4( const T_:Single; out Ws_:TSingle4D ); overload;
64
procedure Bezie4( const T_:Double; out Ws_:TDouble4D ); overload;
65
procedure Bezie4( const T_:TdSingle; out Ws_:TdSingle4D ); overload;
66
procedure Bezie4( const T_:TdDouble; out Ws_:TdDouble4D ); overload;
68
function Bezie4( const Ps_:TSingle4D; const T_:Single ) :Single; overload;
69
function Bezie4( const Ps_:TDouble4D; const T_:Double ) :Double; overload;
70
function Bezie4( const Ps_:TdSingle4D; const T_:TdSingle ) :TdSingle; overload;
71
function Bezie4( const Ps_:TdDouble4D; const T_:TdDouble ) :TdDouble; overload;
73
implementation //############################################################### ■
75
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
77
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
79
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
81
function Lerp( const P0_,P1_,T0_,T1_,T_:Single ) :Single;
83
Result := ( ( T1_ - T_ ) * P0_ + ( T_ - T0_ ) * P1_ ) / ( T1_ - T0_ );
86
function Lerp( const P0_,P1_,T0_,T1_,T_:Double ) :Double;
88
Result := ( ( T1_ - T_ ) * P0_ + ( T_ - T0_ ) * P1_ ) / ( T1_ - T0_ );
91
function Lerp( const P0_,P1_,T0_,T1_,T_:TdSingle ) :TdSingle;
93
Result := ( ( T1_ - T_ ) * P0_ + ( T_ - T0_ ) * P1_ ) / ( T1_ - T0_ );
96
function Lerp( const P0_,P1_,T0_,T1_,T_:TdDouble ) :TdDouble;
98
Result := ( ( T1_ - T_ ) * P0_ + ( T_ - T0_ ) * P1_ ) / ( T1_ - T0_ );
101
//------------------------------------------------------------------------------
103
function Lerp( const P0_,P1_,T_:Single ) :Single;
105
Result := ( P1_ - P0_ ) * T_ + P0_;
108
function Lerp( const P0_,P1_,T_:Double ) :Double;
110
Result := ( P1_ - P0_ ) * T_ + P0_;
113
function Lerp( const P0_,P1_,T_:TdSingle ) :TdSingle;
115
Result := ( P1_ - P0_ ) * T_ + P0_;
118
function Lerp( const P0_,P1_,T_:TdDouble ) :TdDouble;
120
Result := ( P1_ - P0_ ) * T_ + P0_;
123
//------------------------------------------------------------------------------
125
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:Single ) :Single;
127
A01, A12, A23, B02, B13 :Single;
129
A01 := Lerp( P0_, P1_, T0_, T1_, T_ );
130
A12 := Lerp( P1_, P2_, T1_, T2_, T_ );
131
A23 := Lerp( P2_, P3_, T2_, T3_, T_ );
133
B02 := Lerp( A01, A12, T0_, T2_, T_ );
134
B13 := Lerp( A12, A23, T1_, T3_, T_ );
136
Result := Lerp( B02, B13, T1_, T2_, T_ );
139
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:Double ) :Double;
141
A01, A12, A23, B02, B13 :Double;
143
A01 := Lerp( P0_, P1_, T0_, T1_, T_ );
144
A12 := Lerp( P1_, P2_, T1_, T2_, T_ );
145
A23 := Lerp( P2_, P3_, T2_, T3_, T_ );
147
B02 := Lerp( A01, A12, T0_, T2_, T_ );
148
B13 := Lerp( A12, A23, T1_, T3_, T_ );
150
Result := Lerp( B02, B13, T1_, T2_, T_ );
153
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:TdSingle ) :TdSingle;
155
A01, A12, A23, B02, B13 :TdSingle;
157
A01 := Lerp( P0_, P1_, T0_, T1_, T_ );
158
A12 := Lerp( P1_, P2_, T1_, T2_, T_ );
159
A23 := Lerp( P2_, P3_, T2_, T3_, T_ );
161
B02 := Lerp( A01, A12, T0_, T2_, T_ );
162
B13 := Lerp( A12, A23, T1_, T3_, T_ );
164
Result := Lerp( B02, B13, T1_, T2_, T_ );
167
function CatmullRom( const P0_,P1_,P2_,P3_,T0_,T1_,T2_,T3_,T_:TdDouble ) :TdDouble;
169
A01, A12, A23, B02, B13 :TdDouble;
171
A01 := Lerp( P0_, P1_, T0_, T1_, T_ );
172
A12 := Lerp( P1_, P2_, T1_, T2_, T_ );
173
A23 := Lerp( P2_, P3_, T2_, T3_, T_ );
175
B02 := Lerp( A01, A12, T0_, T2_, T_ );
176
B13 := Lerp( A12, A23, T1_, T3_, T_ );
178
Result := Lerp( B02, B13, T1_, T2_, T_ );
181
//------------------------------------------------------------------------------
183
function CatmullRom( const P0_,P1_,P2_,P3_,T_:Single ) :Single;
185
Result := ( ( ( -0.5 * P0_ + 1.5 * P1_ - 1.5 * P2_ + 0.5 * P3_ ) * T_
186
+ P0_ - 2.5 * P1_ + 2.0 * P2_ - 0.5 * P3_ ) * T_
187
- 0.5 * P0_ + 0.5 * P2_ ) * T_
191
function CatmullRom( const P0_,P1_,P2_,P3_,T_:Double ) :Double;
193
Result := ( ( ( -0.5 * P0_ + 1.5 * P1_ - 1.5 * P2_ + 0.5 * P3_ ) * T_
194
+ P0_ - 2.5 * P1_ + 2.0 * P2_ - 0.5 * P3_ ) * T_
195
- 0.5 * P0_ + 0.5 * P2_ ) * T_
199
function CatmullRom( const P0_,P1_,P2_,P3_,T_:TdSingle ) :TdSingle;
201
Result := ( ( ( -0.5 * P0_ + 1.5 * P1_ - 1.5 * P2_ + 0.5 * P3_ ) * T_
202
+ P0_ - 2.5 * P1_ + 2.0 * P2_ - 0.5 * P3_ ) * T_
203
- 0.5 * P0_ + 0.5 * P2_ ) * T_
207
function CatmullRom( const P0_,P1_,P2_,P3_,T_:TdDouble ) :TdDouble;
209
Result := ( ( ( -0.5 * P0_ + 1.5 * P1_ - 1.5 * P2_ + 0.5 * P3_ ) * T_
210
+ P0_ - 2.5 * P1_ + 2.0 * P2_ - 0.5 * P3_ ) * T_
211
- 0.5 * P0_ + 0.5 * P2_ ) * T_
215
function CatmullRom( const P0_,P1_,P2_,P3_:Single; const T_:TdSingle ) :TdSingle;
217
Result.o := CatmullRom( P0_, P1_, P2_, P3_, T_.o );
219
Result.d := ( ( ( -1.5 * P0_ + 4.5 * P1_ - 4.5 * P2_ + 1.5 * P3_ ) * T_.o
220
+ 2.0 * P0_ - 5.0 * P1_ + 4.0 * P2_ - P3_ ) * T_.o
221
- 0.5 * P0_ + 0.5 * P2_ ) * T_.d;
224
function CatmullRom( const P0_,P1_,P2_,P3_:Double; const T_:TdDouble ) :TdDouble;
226
Result.o := CatmullRom( P0_, P1_, P2_, P3_, T_.o );
228
Result.d := ( ( ( -1.5 * P0_ + 4.5 * P1_ - 4.5 * P2_ + 1.5 * P3_ ) * T_.o
229
+ 2.0 * P0_ - 5.0 * P1_ + 4.0 * P2_ - P3_ ) * T_.o
230
- 0.5 * P0_ + 0.5 * P2_ ) * T_.d;
233
//------------------------------------------------------------------------------
235
function BSpline( const T_:Single; const I0,N1:Integer; const Ts_:array of Single ) :Single;
238
T0, T1, T2, T3 :Single;
243
T2 := Ts_[ I0 + N1 ];
245
T3 := Ts_[ I1 + N1 ];
256
if ( T_ < T0 ) or ( T3 < T_ ) then Result := 0
259
if T_ < T2 then Result := ( T_ - T0 ) / ( T2 - T0 )
261
if T_ > T1 then Result := ( T3 - T_ ) / ( T3 - T1 )
278
if T2 > T0 then Result := Result + ( T_ - T0 ) / ( T2 - T0 ) * BSpline( T_, I0, N0, Ts_ );
279
if T3 > T1 then Result := Result + ( T3 - T_ ) / ( T3 - T1 ) * BSpline( T_, I1, N0, Ts_ );
283
function BSpline( const T_:Double; const I0,N1:Integer; const Ts_:array of Double ) :Double;
286
T0, T1, T2, T3 :Double;
291
T2 := Ts_[ I0 + N1 ];
293
T3 := Ts_[ I1 + N1 ];
304
if ( T_ < T0 ) or ( T3 < T_ ) then Result := 0
307
if T_ < T2 then Result := ( T_ - T0 ) / ( T2 - T0 )
309
if T_ > T1 then Result := ( T3 - T_ ) / ( T3 - T1 )
326
if T2 > T0 then Result := Result + ( T_ - T0 ) / ( T2 - T0 ) * BSpline( T_, I0, N0, Ts_ );
327
if T3 > T1 then Result := Result + ( T3 - T_ ) / ( T3 - T1 ) * BSpline( T_, I1, N0, Ts_ );
331
function BSpline( const T_:TdSingle; const I0,N1:Integer; const Ts_:array of TdSingle ) :TdSingle;
334
T0, T1, T2, T3 :TdSingle;
339
T2 := Ts_[ I0 + N1 ];
341
T3 := Ts_[ I1 + N1 ];
352
if ( T_ < T0 ) or ( T3 < T_ ) then Result := 0
355
if T_ < T2 then Result := ( T_ - T0 ) / ( T2 - T0 )
357
if T_ > T1 then Result := ( T3 - T_ ) / ( T3 - T1 )
374
if T2 > T0 then Result := Result + ( T_ - T0 ) / ( T2 - T0 ) * BSpline( T_, I0, N0, Ts_ );
375
if T3 > T1 then Result := Result + ( T3 - T_ ) / ( T3 - T1 ) * BSpline( T_, I1, N0, Ts_ );
379
function BSpline( const T_:TdDouble; const I0,N1:Integer; const Ts_:array of TdDouble ) :TdDouble;
382
T0, T1, T2, T3 :TdDouble;
387
T2 := Ts_[ I0 + N1 ];
389
T3 := Ts_[ I1 + N1 ];
400
if ( T_ < T0 ) or ( T3 < T_ ) then Result := 0
403
if T_ < T2 then Result := ( T_ - T0 ) / ( T2 - T0 )
405
if T_ > T1 then Result := ( T3 - T_ ) / ( T3 - T1 )
422
if T2 > T0 then Result := Result + ( T_ - T0 ) / ( T2 - T0 ) * BSpline( T_, I0, N0, Ts_ );
423
if T3 > T1 then Result := Result + ( T3 - T_ ) / ( T3 - T1 ) * BSpline( T_, I1, N0, Ts_ );
427
//------------------------------------------------------------------------------
429
function BSplin4( const X_:Single ) :Single;
439
if X < 1 then Result := ( 0.5 * X - 1 ) * X * X + C
441
if X < 2 then Result := ( ( 1 - A * X ) * X - 2 ) * X + B
445
function BSplin4( const X_:Double ) :Double;
455
if X < 1 then Result := ( 0.5 * X - 1 ) * X * X + C
457
if X < 2 then Result := ( ( 1 - A * X ) * X - 2 ) * X + B
461
function BSplin4( const X_:TdSingle ) :TdSingle;
463
A :TdSingle = ( o:1/6; d:0 );
464
B :TdSingle = ( o:4/3; d:0 );
465
C :TdSingle = ( o:2/3; d:0 );
471
if X < 1 then Result := ( X / 2 - 1 ) * X * X + C
473
if X < 2 then Result := ( ( 1 - A * X ) * X - 2 ) * X + B
477
function BSplin4( const X_:TdDouble ) :TdDouble;
479
A :TdDouble = ( o:1/6; d:0 );
480
B :TdDouble = ( o:4/3; d:0 );
481
C :TdDouble = ( o:2/3; d:0 );
487
if X < 1 then Result := ( X / 2 - 1 ) * X * X + C
489
if X < 2 then Result := ( ( 1 - A * X ) * X - 2 ) * X + B
493
//------------------------------------------------------------------------------
495
procedure BSplin4( const T_:Single; out Ws_:TSingle4D );
499
_1 := BSplin4( T_ + 1 );
501
_3 := BSplin4( T_ - 1 );
502
_4 := BSplin4( T_ - 2 );
506
procedure BSplin4( const T_:Double; out Ws_:TDouble4D );
510
_1 := BSplin4( T_ + 1 );
512
_3 := BSplin4( T_ - 1 );
513
_4 := BSplin4( T_ - 2 );
517
procedure BSplin4( const T_:TdSingle; out Ws_:TdSingle4D );
521
_1 := BSplin4( T_ + 1 );
523
_3 := BSplin4( T_ - 1 );
524
_4 := BSplin4( T_ - 2 );
528
procedure BSplin4( const T_:TdDouble; out Ws_:TdDouble4D );
532
_1 := BSplin4( T_ + 1 );
534
_3 := BSplin4( T_ - 1 );
535
_4 := BSplin4( T_ - 2 );
539
//------------------------------------------------------------------------------
541
function BSplin4( const Ps_:TSingle4D; const T_:Single ) :Single;
547
Result := Ws._1 * Ps_._1
553
function BSplin4( const Ps_:TDouble4D; const T_:Double ) :Double;
559
Result := Ws._1 * Ps_._1
565
function BSplin4( const Ps_:TdSingle4D; const T_:TdSingle ) :TdSingle;
571
Result := Ws._1 * Ps_._1
577
function BSplin4( const Ps_:TdDouble4D; const T_:TdDouble ) :TdDouble;
583
Result := Ws._1 * Ps_._1
589
//------------------------------------------------------------------------------
591
procedure Bezie4( const T_:Single; out Ws_:TSingle4D );
596
T1 := T_; S1 := 1 - T_;
597
T2 := T1 * T1; S2 := S1 * S1;
598
T3 := T1 * T2; S3 := S1 * S2;
609
procedure Bezie4( const T_:Double; out Ws_:TDouble4D );
614
T1 := T_; S1 := 1 - T_;
615
T2 := T1 * T1; S2 := S1 * S1;
616
T3 := T1 * T2; S3 := S1 * S2;
627
procedure Bezie4( const T_:TdSingle; out Ws_:TdSingle4D );
630
S1, S2, S3 :TdSingle;
632
T1 := T_; S1 := 1 - T_;
633
T2 := T1 * T1; S2 := S1 * S1;
634
T3 := T1 * T2; S3 := S1 * S2;
645
procedure Bezie4( const T_:TdDouble; out Ws_:TdDouble4D );
648
S1, S2, S3 :TdDouble;
650
T1 := T_; S1 := 1 - T_;
651
T2 := T1 * T1; S2 := S1 * S1;
652
T3 := T1 * T2; S3 := S1 * S2;
663
//------------------------------------------------------------------------------
665
function Bezie4( const Ps_:TSingle4D; const T_:Single ) :Single;
671
with Ws do Result := _1 * Ps_._1
677
function Bezie4( const Ps_:TDouble4D; const T_:Double ) :Double;
683
with Ws do Result := _1 * Ps_._1
689
function Bezie4( const Ps_:TdSingle4D; const T_:TdSingle ) :TdSingle;
695
with Ws do Result := _1 * Ps_._1
701
function Bezie4( const Ps_:TdDouble4D; const T_:TdDouble ) :TdDouble;
707
with Ws do Result := _1 * Ps_._1
713
//############################################################################## □
715
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
717
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
719
end. //######################################################################### ■