3
interface //#################################################################### ■
9
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
11
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
13
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPosval1D<_TItem_>
15
TPosval1D<_TItem_> = record
21
constructor Create( const Pos_:Single; const Val_:_TItem_ );
24
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
26
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray1D<_TItem_>
28
IArray1D = interface( ICoreArray )
29
['{7BF64031-75DC-4CD8-9220-78D0F556C4CB}']
32
function GetElemsX :Integer;
33
function GetItemsX :Integer;
34
procedure SetItemsX( const ItemsX_:Integer );
35
function GetMargsX :Integer;
36
procedure SetMargsX( const MargsX_:Integer );
37
function GetItemsN :Integer;
38
function GetItem0P :Pointer;
41
property ItemByte :Integer read GetElemByte ;
42
property ElemsX :Integer read GetElemsX ;
43
property ItemsX :Integer read GetItemsX write SetItemsX;
44
property MargsX :Integer read GetMargsX write SetMargsX;
45
property ItemsN :Integer read GetItemsN ;
46
property Item0P :Pointer read GetItem0P ;
49
//-------------------------------------------------------------------------
51
TArray1D<_TItem_> = class( TCoreArray<_TItem_>, IArray1D )
53
_PItem_ = TCoreArray<_TItem_>._PElem_;
56
function ElemsI( const X_:Integer ) :Integer; inline;
57
function ItemsI( const X_:Integer ) :Integer; inline;
63
function GetElemsN :Integer; override;
64
function GetElemsX :Integer;
65
function GetElems( const X_:Integer ) :_TItem_;
66
procedure SetElems( const X_:Integer; const Elem_:_TItem_ );
67
function GetElemsP( const X_:Integer ) :_PItem_;
68
function GetItemsX :Integer; virtual;
69
procedure SetItemsX( const ItemsX_:Integer ); virtual;
70
function GetMargsX :Integer;
71
procedure SetMargsX( const MargsX_:Integer );
72
function GetItemsN :Integer; virtual;
73
function GetItems( const X_:Integer ) :_TItem_;
74
procedure SetItems( const X_:Integer; const Item_:_TItem_ );
75
function GetItemsP( const X_:Integer ) :_PItem_;
76
function GetItem0P :Pointer;
78
procedure MakeArray; override;
80
constructor Create; overload;
81
constructor Create( const ItemsX_:Integer ); overload;
82
constructor Create( const ItemsX_,MargsX_:Integer ); overload; virtual;
83
destructor Destroy; override;
85
property ItemByte :Integer read GetElemByte ;
86
property ElemsX :Integer read GetElemsX ;
87
property Elems[ const X_:Integer ] :_TItem_ read GetElems write SetElems ;
88
property ElemsP[ const X_:Integer ] :_PItem_ read GetElemsP ;
89
property ItemsX :Integer read GetItemsX write SetItemsX;
90
property MargsX :Integer read GetMargsX write SetMargsX;
91
property ItemsN :Integer read GetItemsN ;
92
property Items[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
93
property ItemsP[ const X_:Integer ] :_PItem_ read GetItemsP ;
94
property Item0P :Pointer read GetItem0P ;
96
procedure MakeEdgeExten; virtual;
97
procedure MakeEdgePerio; virtual; abstract;
98
procedure MakeEdgeMirro; virtual; abstract;
99
function AddTail( const Item_:_TItem_ ) :Integer;
102
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray1D<_TItem_>
104
ICellArray1D = interface( IArray1D )
105
['{970CB18E-E1DC-4393-A124-528256753896}']
107
function GetPoinsX :Integer;
108
procedure SetPoinsX( const PoinX_:Integer );
110
property CellsX :Integer read GetItemsX write SetItemsX;
111
property PoinsX :Integer read GetPoinsX write SetPoinsX;
114
//-------------------------------------------------------------------------
116
TCellArray1D<_TItem_> = class( TArray1D<_TItem_>, ICellArray1D )
120
function GetPoinsX :Integer;
121
procedure SetPoinsX( const PoinsX_:Integer );
124
property Cells[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
125
property CellsX :Integer read GetItemsX write SetItemsX;
126
property PoinsX :Integer read GetPoinsX write SetPoinsX;
128
procedure MakeEdgePerio; override;
129
procedure MakeEdgeMirro; override;
132
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray1D<_TItem_>
134
IPoinArray1D = interface( IArray1D )
135
['{9FF11CDA-0879-41D1-8025-C4323E1D4389}']
137
function GetCellsX :Integer;
138
procedure SetCellsX( const CellsX_:Integer );
140
property PoinsX :Integer read GetItemsX write SetItemsX;
141
property CellsX :Integer read GetCellsX write SetCellsX;
144
//-------------------------------------------------------------------------
146
TPoinArray1D<_TItem_> = class( TArray1D<_TItem_>, IPoinArray1D )
150
function GetCellsX :Integer;
151
procedure SetCellsX( const CellsX_:Integer );
153
constructor Create( const CellsX_,MargsX_:Integer ); override;
154
destructor Destroy; override;
156
property Poins[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
157
property PoinsX :Integer read GetItemsX write SetItemsX;
158
property CellsX :Integer read GetCellsX write SetCellsX;
160
procedure MakeEdgePerio; override;
161
procedure MakeEdgeMirro; override;
164
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinMap1D<_TItem_>
166
TPoinMap1D<_TItem_> = class( TPoinArray1D<_TItem_> )
172
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIrreMap1D<_TItem_>
174
TIrreMap1D<_TItem_> = class( TPoinMap1D<TPosval1D<_TItem_>> )
178
function GetMinPosX :Single;
179
function GetMaxPosX :Single;
181
function Interp( const G0_,G1_,G2_,G3_:_TItem_; const Id_:Single ) :_TItem_; overload; virtual; abstract;
182
function InterpPos( const G0_,G1_,G2_,G3_:TPosval1D<_TItem_>; const Pos_:Single ) :_TItem_; overload; virtual; abstract;
185
property MinPos :Single read GetMinPosX;
186
property MinPosX :Single read GetMinPosX;
187
property MaxPos :Single read GetMaxPosX;
188
property MaxPosX :Single read GetMaxPosX;
190
function Interp( const I_:Single ) :_TItem_; overload; virtual;
191
function InterpPos( const Pos_:Single ) :_TItem_; overload; virtual;
192
function AddTail( const Pos_:Single; const Val_:_TItem_ ) :Integer; overload;
193
function Insert( const PV_:TPosval1D<_TItem_> ) :Integer; overload; virtual;
194
function Insert( const Pos_:Single; const Val_:_TItem_ ) :Integer; overload; virtual;
197
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
199
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
201
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
203
implementation //############################################################### ■
207
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
209
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPosval1D<_TItem_>
211
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
213
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
215
constructor TPosval1D<_TItem_>.Create( const Pos_:Single; const Val_:_TItem_ );
221
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
223
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray1D<_TItem_>
225
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
227
/////////////////////////////////////////////////////////////////////// メソッド
229
function TArray1D<_TItem_>.ElemsI( const X_:Integer ) :Integer;
234
function TArray1D<_TItem_>.ItemsI( const X_:Integer ) :Integer;
236
Result := _MargsX + X_;
239
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
241
/////////////////////////////////////////////////////////////////////// アクセス
243
function TArray1D<_TItem_>.GetElemsN :Integer;
248
//------------------------------------------------------------------------------
250
function TArray1D<_TItem_>.GetElemsX :Integer;
255
//------------------------------------------------------------------------------
257
function TArray1D<_TItem_>.GetElems( const X_:Integer ) :_TItem_;
259
Result := _Elems[ ElemsI( X_ ) ];
262
procedure TArray1D<_TItem_>.SetElems( const X_:Integer; const Elem_:_TItem_ );
264
_Elems[ ElemsI( X_ ) ] := Elem_;
267
function TArray1D<_TItem_>.GetElemsP( const X_:Integer ) :_PItem_;
269
Result := @_Elems[ ElemsI( X_ ) ];
272
//------------------------------------------------------------------------------
274
function TArray1D<_TItem_>.GetItemsX :Integer;
279
procedure TArray1D<_TItem_>.SetItemsX( const ItemsX_:Integer );
281
_ItemsX := ItemsX_; MakeArray;
284
function TArray1D<_TItem_>.GetMargsX :Integer;
289
procedure TArray1D<_TItem_>.SetMargsX( const MargsX_:Integer );
291
_MargsX := MargsX_; MakeArray;
294
function TArray1D<_TItem_>.GetItemsN :Integer;
299
//------------------------------------------------------------------------------
301
function TArray1D<_TItem_>.GetItems( const X_:Integer ) :_TItem_;
303
Result := _Elems[ ItemsI( X_ ) ];
306
procedure TArray1D<_TItem_>.SetItems( const X_:Integer; const Item_:_TItem_ );
308
_Elems[ ItemsI( X_ ) ] := Item_;
311
function TArray1D<_TItem_>.GetItemsP( const X_:Integer ) :_PItem_;
313
Result := @_Elems[ ItemsI( X_ ) ];
316
function TArray1D<_TItem_>.GetItem0P :Pointer;
318
Result := GetItemsP( 0 );
321
/////////////////////////////////////////////////////////////////////// メソッド
323
procedure TArray1D<_TItem_>.MakeArray;
325
_ElemsX := _MargsX + _ItemsX + _MargsX;
330
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
332
constructor TArray1D<_TItem_>.Create;
337
constructor TArray1D<_TItem_>.Create( const ItemsX_:Integer );
339
Create( ItemsX_, 0 );
342
constructor TArray1D<_TItem_>.Create( const ItemsX_,MargsX_:Integer );
346
_OnChange := procedure begin end;
352
destructor TArray1D<_TItem_>.Destroy;
358
/////////////////////////////////////////////////////////////////////// メソッド
360
procedure TArray1D<_TItem_>.MakeEdgeExten;
366
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
367
○─○─○─●─●─●─●─●─●─○─○─○
368
00 00 00 ・ ・ ・ ・ ・ ・ +5 +5 +5 }
373
for X := 0-M to 0-1 do Items[ X ] := Items[ 0 ];
374
for X := H+1 to H+M do Items[ X ] := Items[ H ];
377
//------------------------------------------------------------------------------
379
function TArray1D<_TItem_>.AddTail( const Item_:_TItem_ ) :Integer;
383
Inc( _ItemsX ); MakeArray;
385
Items[ Result ] := Item_;
388
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray1D<_TItem_>
390
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
392
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
394
/////////////////////////////////////////////////////////////////////// アクセス
396
function TCellArray1D<_TItem_>.GetPoinsX :Integer;
398
Result := CellsX + 1;
401
procedure TCellArray1D<_TItem_>.SetPoinsX( const PoinsX_:Integer );
403
CellsX := PoinsX_ - 1;
406
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
408
/////////////////////////////////////////////////////////////////////// メソッド
410
procedure TCellArray1D<_TItem_>.MakeEdgePerio;
416
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
417
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
418
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 }
420
M := _MargsX; N := _ItemsX; H := _ItemsX-1;
422
for X := 0-M to 0-1 do Items[ X ] := Items[ X + N ];
423
for X := H+1 to H+M do Items[ X ] := Items[ X - N ];
426
procedure TCellArray1D<_TItem_>.MakeEdgeMirro;
432
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
433
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
434
// +2 +1 00 ・ ・ ・ ・ ・ ・ +5 +4 +3
436
M := _MargsX; N := _ItemsX; H := _ItemsX-1;
438
for X := 0-M to 0-1 do Items[ X ] := Items[ 0 - X - 1 ];
439
for X := H+1 to H+M do Items[ X ] := Items[ H - X + N ];
442
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray1D<_TItem_>
444
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
446
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
448
/////////////////////////////////////////////////////////////////////// アクセス
450
function TPoinArray1D<_TItem_>.GetCellsX :Integer;
452
Result := _ItemsX - 1;
455
procedure TPoinArray1D<_TItem_>.SetCellsX( const CellsX_:Integer );
457
_ItemsX := CellsX_ + 1; MakeArray;
460
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
462
constructor TPoinArray1D<_TItem_>.Create( const CellsX_,MargsX_:Integer );
464
inherited Create( CellsX_+1,
469
destructor TPoinArray1D<_TItem_>.Destroy;
475
/////////////////////////////////////////////////////////////////////// メソッド
477
procedure TPoinArray1D<_TItem_>.MakeEdgePerio;
483
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
484
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
485
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 +3
487
M := _MargsX; H := _ItemsX-1;
489
for X := 0-M to 0-1 do Items[ X ] := Items[ X + H ];
490
for X := H+0 to H+M do Items[ X ] := Items[ X - H ];
493
procedure TPoinArray1D<_TItem_>.MakeEdgeMirro;
499
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
500
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
501
// +3 +2 +1 ・ ・ ・ ・ ・ ・ ・ +5 +4 +3
503
M := _MargsX; H := _ItemsX-1;
505
for X := 0-M to 0-1 do Items[ X ] := Items[ -X ];
506
for X := H+1 to H+M do Items[ X ] := Items[ -X + 2*H ];
509
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinMap1D<_TItem_>
511
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
513
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
515
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
517
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIrreMap1D<_TItem_>
519
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
521
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
523
/////////////////////////////////////////////////////////////////////// アクセス
525
function TIrreMap1D<_TItem_>.GetMinPosX :Single;
527
Result := Poins[ 0 ].Pos;
530
function TIrreMap1D<_TItem_>.GetMaxPosX :Single;
532
Result := Poins[ CellsX ].Pos;
535
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
537
/////////////////////////////////////////////////////////////////////// メソッド
539
function TIrreMap1D<_TItem_>.AddTail( const Pos_:Single; const Val_:_TItem_ ) :Integer;
541
Result := AddTail( TPosval1D<_TItem_>.Create( Pos_, Val_ ) );
544
//------------------------------------------------------------------------------
546
function TIrreMap1D<_TItem_>.Insert( const PV_:TPosval1D<_TItem_> ) :Integer;
549
G0, G1 :TPosval1D<_TItem_>;
551
H0 := CellsX; CellsX := CellsX + 1;
554
for I0 := H0 downto 0 do
558
if G0.Pos <= PV_.Pos then Break;
570
function TIrreMap1D<_TItem_>.Insert( const Pos_:Single; const Val_:_TItem_ ) :Integer;
572
Result := Insert( TPosval1D<_TItem_>.Create( Pos_, Val_ ) );
575
//------------------------------------------------------------------------------
577
function TIrreMap1D<_TItem_>.Interp( const I_:Single ) :_TItem_;
581
G0, G1, G2, G3 :_TItem_;
583
I1 := Floor( I_ ); Id := I_ - I1;
585
G0 := Poins[ I1-1 ].Val;
586
G1 := Poins[ I1 ].Val;
587
G2 := Poins[ I1+1 ].Val;
588
G3 := Poins[ I1+2 ].Val;
590
Result := Interp( G0, G1, G2, G3, Id );
593
function TIrreMap1D<_TItem_>.InterpPos( const Pos_:Single ) :_TItem_;
595
G0, G1, G2, G3 :TPosval1D<_TItem_>;
601
for I3 := 2 to CellsX+1 do
603
G0 := G1; G1 := G2; G2 := G3; G3 := Poins[ I3 ];
605
if Pos_ <= G2.Pos then Break;
608
Result := InterpPos( G0, G1, G2, G3, Pos_ );
611
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
613
//############################################################################## □
615
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
617
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
619
end. //######################################################################### ■