1
unit LUX.Data.Lattice.T1;
3
interface //#################################################################### ■
8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
10
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
12
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPosval1D<_TItem_>
14
TPosval1D<_TItem_> = record
20
constructor Create( const Pos_:Single; const Val_:_TItem_ );
23
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
25
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray1D<_TItem_>
28
['{7BF64031-75DC-4CD8-9220-78D0F556C4CB}']
30
function GetItemByte :Integer;
31
function GetElemsP0 :Pointer;
32
function GetElemsX :Integer;
33
function GetElemsN :Integer;
34
function GetElemsByte :Integer;
35
function GetItemsX :Integer;
36
procedure SetItemsX( const ItemsX_:Integer );
37
function GetMargsX :Integer;
38
procedure SetMargsX( const MargsX_:Integer );
40
property ItemByte :Integer read GetItemByte ;
41
property ElemsP0 :Pointer read GetElemsP0 ;
42
property ElemsX :Integer read GetElemsX ;
43
property ElemsN :Integer read GetElemsN ;
44
property ElemsByte :Integer read GetElemsByte ;
45
property ItemsX :Integer read GetItemsX write SetItemsX;
46
property MargsX :Integer read GetMargsX write SetMargsX;
49
//-------------------------------------------------------------------------
51
TArray1D<_TItem_> = class( TInterfacedBase, IArray1D )
57
function XtoI( const X_:Integer ) :Integer; inline;
59
_Elems :TArray<_TItem_>;
64
function GetItemByte :Integer;
65
function GetElemsP0 :Pointer;
66
function GetElemsX :Integer;
67
function GetElemsN :Integer;
68
function GetElemsByte :Integer;
69
function GetItems( const X_:Integer ) :_TItem_; virtual;
70
procedure SetItems( const X_:Integer; const Item_:_TItem_ ); virtual;
71
function GetItemP( const X_:Integer ) :_PItem_;
72
function GetItemsX :Integer;
73
procedure SetItemsX( const ItemsX_:Integer );
74
function GetMargsX :Integer;
75
procedure SetMargsX( const MargsX_:Integer );
80
constructor Create; overload;
81
constructor Create( const ItemsX_:Integer ); overload;
82
constructor Create( const ItemsX_,MargsX_:Integer ); overload; virtual;
83
procedure AfterConstruction; override;
84
destructor Destroy; override;
86
property ItemByte :Integer read GetItemByte ;
87
property ElemsP0 :Pointer read GetElemsP0 ;
88
property ElemsX :Integer read GetElemsX ;
89
property ElemsN :Integer read GetElemsN ;
90
property ElemsByte :Integer read GetElemsByte ;
91
property Items[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
92
property ItemP[ const X_:Integer ] :_PItem_ read GetItemP ;
93
property ItemsN :Integer read GetItemsX write SetItemsX;
94
property ItemsX :Integer read GetItemsX write SetItemsX;
95
property MargsN :Integer read GetMargsX write SetMargsX;
96
property MargsX :Integer read GetMargsX write SetMargsX;
98
class procedure Swap( var Array0_,Array1_:TArray1D<_TItem_> ); static;
99
procedure MakeEdgeExten; virtual;
100
procedure MakeEdgePerio; virtual; abstract;
101
procedure MakeEdgeMirro; virtual; abstract;
102
function AddTail( const Item_:_TItem_ ) :Integer;
105
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray1D<_TItem_>
107
IBricArray1D = interface( IArray1D )
108
['{970CB18E-E1DC-4393-A124-528256753896}']
110
function GetGridsX :Integer;
111
procedure SetGridsX( const GridX_:Integer );
113
property BricsX :Integer read GetItemsX write SetItemsX;
114
property GridsX :Integer read GetGridsX write SetGridsX;
117
//-------------------------------------------------------------------------
119
TBricArray1D<_TItem_> = class( TArray1D<_TItem_>, IBricArray1D )
123
function GetGridsX :Integer;
124
procedure SetGridsX( const GridsX_:Integer );
127
property Brics[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
128
property BricsN :Integer read GetItemsX write SetItemsX;
129
property BricsX :Integer read GetItemsX write SetItemsX;
130
property GridsN :Integer read GetGridsX write SetGridsX;
131
property GridsX :Integer read GetGridsX write SetGridsX;
133
procedure MakeEdgePerio; override;
134
procedure MakeEdgeMirro; override;
137
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray1D<_TItem_>
139
IGridArray1D = interface( IArray1D )
140
['{9FF11CDA-0879-41D1-8025-C4323E1D4389}']
142
function GetBricsX :Integer;
143
procedure SetBricsX( const BricsX_:Integer );
145
property GridsX :Integer read GetItemsX write SetItemsX;
146
property BricsX :Integer read GetBricsX write SetBricsX;
149
//-------------------------------------------------------------------------
151
TGridArray1D<_TItem_> = class( TArray1D<_TItem_>, IGridArray1D )
155
function GetBricsX :Integer;
156
procedure SetBricsX( const BricsX_:Integer );
158
constructor Create( const BricsX_,MargsX_:Integer ); override;
159
destructor Destroy; override;
161
property Grids[ const X_:Integer ] :_TItem_ read GetItems write SetItems ; default;
162
property GridsN :Integer read GetItemsX write SetItemsX;
163
property GridsX :Integer read GetItemsX write SetItemsX;
164
property BricsN :Integer read GetBricsX write SetBricsX;
165
property BricsX :Integer read GetBricsX write SetBricsX;
167
procedure MakeEdgePerio; override;
168
procedure MakeEdgeMirro; override;
171
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridMap1D<_TItem_>
173
TGridMap1D<_TItem_> = class( TGridArray1D<_TItem_> )
179
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIrreMap1D<_TItem_>
181
TIrreMap1D<_TItem_> = class( TGridMap1D<TPosval1D<_TItem_>> )
185
function GetMinPosX :Single;
186
function GetMaxPosX :Single;
188
function Interp( const G0_,G1_,G2_,G3_:_TItem_; const Id_:Single ) :_TItem_; overload; virtual; abstract;
189
function InterpPos( const G0_,G1_,G2_,G3_:TPosval1D<_TItem_>; const Pos_:Single ) :_TItem_; overload; virtual; abstract;
192
property MinPos :Single read GetMinPosX;
193
property MinPosX :Single read GetMinPosX;
194
property MaxPos :Single read GetMaxPosX;
195
property MaxPosX :Single read GetMaxPosX;
197
function Interp( const I_:Single ) :_TItem_; overload; virtual;
198
function InterpPos( const Pos_:Single ) :_TItem_; overload; virtual;
199
function AddTail( const Pos_:Single; const Val_:_TItem_ ) :Integer; overload;
200
function Insert( const PV_:TPosval1D<_TItem_> ) :Integer; overload; virtual;
201
function Insert( const Pos_:Single; const Val_:_TItem_ ) :Integer; overload; virtual;
204
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
206
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
208
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
210
implementation //############################################################### ■
214
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
216
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPosval1D<_TItem_>
218
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
220
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
222
constructor TPosval1D<_TItem_>.Create( const Pos_:Single; const Val_:_TItem_ );
228
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
230
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray1D<_TItem_>
232
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
234
/////////////////////////////////////////////////////////////////////// メソッド
236
procedure TArray1D<_TItem_>.MakeArray;
238
_ElemsX := _MargsX + _ItemsX + _MargsX;
240
SetLength( _Elems, ElemsN );
245
function TArray1D<_TItem_>.XtoI( const X_:Integer ) :Integer;
247
Result := _MargsX + X_;
250
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
252
/////////////////////////////////////////////////////////////////////// アクセス
254
function TArray1D<_TItem_>.GetItemByte :Integer;
256
Result := SizeOf( _TItem_ );
259
//------------------------------------------------------------------------------
261
function TArray1D<_TItem_>.GetElemsP0 :Pointer;
263
Result := @_Elems[ 0 ];
266
//------------------------------------------------------------------------------
268
function TArray1D<_TItem_>.GetElemsX :Integer;
273
function TArray1D<_TItem_>.GetElemsN :Integer;
278
function TArray1D<_TItem_>.GetElemsByte :Integer;
280
Result := ItemByte * ElemsN;
283
//------------------------------------------------------------------------------
285
function TArray1D<_TItem_>.GetItems( const X_:Integer ) :_TItem_;
287
Result := _Elems[ XtoI( X_ ) ];
290
procedure TArray1D<_TItem_>.SetItems( const X_:Integer; const Item_:_TItem_ );
292
_Elems[ XtoI( X_ ) ] := Item_;
295
function TArray1D<_TItem_>.GetItemP( const X_:Integer ) :_PItem_;
297
Result := @_Elems[ XtoI( X_ ) ];
300
//------------------------------------------------------------------------------
302
function TArray1D<_TItem_>.GetItemsX :Integer;
307
procedure TArray1D<_TItem_>.SetItemsX( const ItemsX_:Integer );
309
_ItemsX := ItemsX_; MakeArray;
312
function TArray1D<_TItem_>.GetMargsX :Integer;
317
procedure TArray1D<_TItem_>.SetMargsX( const MargsX_:Integer );
319
_MargsX := MargsX_; MakeArray;
322
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
324
constructor TArray1D<_TItem_>.Create;
329
constructor TArray1D<_TItem_>.Create( const ItemsX_:Integer );
331
Create( ItemsX_, 0 );
334
constructor TArray1D<_TItem_>.Create( const ItemsX_,MargsX_:Integer );
338
_OnChange := procedure begin end;
344
procedure TArray1D<_TItem_>.AfterConstruction;
349
destructor TArray1D<_TItem_>.Destroy;
355
/////////////////////////////////////////////////////////////////////// メソッド
357
class procedure TArray1D<_TItem_>.Swap( var Array0_,Array1_:TArray1D<_TItem_> );
359
A :TArray1D<_TItem_>;
361
A := Array0_; Array0_ := Array1_; Array1_ := A;
364
//------------------------------------------------------------------------------
366
procedure TArray1D<_TItem_>.MakeEdgeExten;
372
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
373
○─○─○─●─●─●─●─●─●─○─○─○
374
00 00 00 ・ ・ ・ ・ ・ ・ +5 +5 +5 }
379
for X := 0-M to 0-1 do Items[ X ] := Items[ 0 ];
380
for X := H+1 to H+M do Items[ X ] := Items[ H ];
383
//------------------------------------------------------------------------------
385
function TArray1D<_TItem_>.AddTail( const Item_:_TItem_ ) :Integer;
389
Inc( _ItemsX ); MakeArray;
391
Items[ Result ] := Item_;
394
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray1D<_TItem_>
396
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
398
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
400
/////////////////////////////////////////////////////////////////////// アクセス
402
function TBricArray1D<_TItem_>.GetGridsX :Integer;
404
Result := BricsX + 1;
407
procedure TBricArray1D<_TItem_>.SetGridsX( const GridsX_:Integer );
409
BricsX := GridsX_ - 1;
412
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
414
/////////////////////////////////////////////////////////////////////// メソッド
416
procedure TBricArray1D<_TItem_>.MakeEdgePerio;
422
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
423
┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
424
+3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 }
430
for X := 0-M to 0-1 do Items[ X ] := Items[ X + N ];
431
for X := H+1 to H+M do Items[ X ] := Items[ X - N ];
434
procedure TBricArray1D<_TItem_>.MakeEdgeMirro;
440
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
441
┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
442
+2 +1 00 ・ ・ ・ ・ ・ ・ +5 +4 +3 }
448
for X := 0-M to 0-1 do Items[ X ] := Items[ 0 - X - 1 ];
449
for X := H+1 to H+M do Items[ X ] := Items[ H - X + N ];
452
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray1D<_TItem_>
454
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
456
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
458
/////////////////////////////////////////////////////////////////////// アクセス
460
function TGridArray1D<_TItem_>.GetBricsX :Integer;
462
Result := _ItemsX - 1;
465
procedure TGridArray1D<_TItem_>.SetBricsX( const BricsX_:Integer );
467
_ItemsX := BricsX_ + 1; MakeArray;
470
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
472
constructor TGridArray1D<_TItem_>.Create( const BricsX_,MargsX_:Integer );
474
inherited Create( BricsX_+1,
479
destructor TGridArray1D<_TItem_>.Destroy;
485
/////////////////////////////////////////////////////////////////////// メソッド
487
procedure TGridArray1D<_TItem_>.MakeEdgePerio;
493
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
494
┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
495
+3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 +3 }
500
for X := 0-M to 0-1 do Items[ X ] := Items[ X + H ];
501
for X := H+0 to H+M do Items[ X ] := Items[ X - H ];
504
procedure TGridArray1D<_TItem_>.MakeEdgeMirro;
510
-3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
511
┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
512
+3 +2 +1 ・ ・ ・ ・ ・ ・ ・ +5 +4 +3 }
517
for X := 0-M to 0-1 do Items[ X ] := Items[ -X ];
518
for X := H+1 to H+M do Items[ X ] := Items[ -X + 2*H ];
521
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridMap1D<_TItem_>
523
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
525
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
527
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
529
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TIrreMap1D<_TItem_>
531
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
533
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
535
/////////////////////////////////////////////////////////////////////// アクセス
537
function TIrreMap1D<_TItem_>.GetMinPosX :Single;
539
Result := Grids[ 0 ].Pos;
542
function TIrreMap1D<_TItem_>.GetMaxPosX :Single;
544
Result := Grids[ BricsN ].Pos;
547
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
549
/////////////////////////////////////////////////////////////////////// メソッド
551
function TIrreMap1D<_TItem_>.AddTail( const Pos_:Single; const Val_:_TItem_ ) :Integer;
553
Result := AddTail( TPosval1D<_TItem_>.Create( Pos_, Val_ ) );
556
//------------------------------------------------------------------------------
558
function TIrreMap1D<_TItem_>.Insert( const PV_:TPosval1D<_TItem_> ) :Integer;
561
G0, G1 :TPosval1D<_TItem_>;
563
H0 := BricsN; BricsN := BricsN + 1;
566
for I0 := H0 downto 0 do
570
if G0.Pos <= PV_.Pos then Break;
582
function TIrreMap1D<_TItem_>.Insert( const Pos_:Single; const Val_:_TItem_ ) :Integer;
584
Result := Insert( TPosval1D<_TItem_>.Create( Pos_, Val_ ) );
587
//------------------------------------------------------------------------------
589
function TIrreMap1D<_TItem_>.Interp( const I_:Single ) :_TItem_;
593
G0, G1, G2, G3 :_TItem_;
595
I1 := Floor( I_ ); Id := I_ - I1;
597
G0 := Grids[ I1-1 ].Val;
598
G1 := Grids[ I1 ].Val;
599
G2 := Grids[ I1+1 ].Val;
600
G3 := Grids[ I1+2 ].Val;
602
Result := Interp( G0, G1, G2, G3, Id );
605
function TIrreMap1D<_TItem_>.InterpPos( const Pos_:Single ) :_TItem_;
607
G0, G1, G2, G3 :TPosval1D<_TItem_>;
613
for I3 := 2 to BricsN+1 do
615
G0 := G1; G1 := G2; G2 := G3; G3 := Grids[ I3 ];
617
if Pos_ <= G2.Pos then Break;
620
Result := InterpPos( G0, G1, G2, G3, Pos_ );
623
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
625
//############################################################################## □
627
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
629
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
631
end. //######################################################################### ■