3
interface //#################################################################### ■
9
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
11
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
13
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
15
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
17
IArray2D = interface( IArray1D )
18
['{E4ECF85C-317F-4179-BDAE-C4495D2B2CC7}']
21
function GetElemsY :Integer;
22
function GetItemsY :Integer;
23
procedure SetItemsY( const ItemsY_:Integer );
24
function GetMargsY :Integer;
25
procedure SetMargsY( const MargsY_:Integer );
26
function GetItemsN :Integer;
29
property ElemsY :Integer read GetElemsY ;
30
property ItemsY :Integer read GetItemsY write SetItemsY;
31
property MargsY :Integer read GetMargsY write SetMargsY;
32
property ItemsN :Integer read GetItemsN ;
35
//-------------------------------------------------------------------------
37
TArray2D<_TItem_> = class( TArray1D<_TItem_>, IArray2D )
39
_PItem_ = TCoreArray<_TItem_>._PElem_;
42
function ElemsI( const X_,Y_:Integer ) :Integer; inline;
43
function ItemsI( const X_,Y_:Integer ) :Integer; inline;
49
function GetElemsN :Integer; override;
50
function GetElemsY :Integer;
51
function GetElems( const X_,Y_:Integer ) :_TItem_;
52
procedure SetElems( const X_,Y_:Integer; const Elem_:_TItem_ );
53
function GetElemsP( const X_,Y_:Integer ) :_PItem_;
54
function GetItemsY :Integer;
55
procedure SetItemsY( const ItemsY_:Integer );
56
function GetMargsY :Integer;
57
procedure SetMargsY( const MargsY_:Integer );
58
function GetItemsN :Integer; override;
59
function GetItems( const X_,Y_:Integer ) :_TItem_;
60
procedure SetItems( const X_,Y_:Integer; const Item_:_TItem_ );
61
function GetItemsP( const X_,Y_:Integer ) :_PItem_;
62
function GetItem0P :Pointer;
64
procedure MakeArray; override;
66
constructor Create; overload;
67
constructor Create( const ItemsX_,ItemsY_:Integer ); reintroduce; overload;
68
constructor Create( const ItemsX_,ItemsY_,Margs_:Integer ); overload;
69
constructor Create( const ItemsX_,ItemsY_,MargsX_,MargsY_:Integer ); overload; virtual;
70
destructor Destroy; override;
72
property ElemsY :Integer read GetElemsY ;
73
property Elems[ const X_,Y_:Integer ] :_TItem_ read GetElems write SetElems ;
74
property ElemsP[ const X_,Y_:Integer ] :_PItem_ read GetElemsP ;
75
property ItemsY :Integer read GetItemsY write SetItemsY;
76
property MargsY :Integer read GetMargsY write SetMargsY;
77
property ItemsN :Integer read GetItemsN ;
78
property Items[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
79
property ItemsP[ const X_,Y_:Integer ] :_PItem_ read GetItemsP ;
80
property Item0P :Pointer read GetItem0P ;
82
procedure MakeEdgeLoop;
85
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray2D<_TItem_>
87
ICellArray2D = interface( IArray2D )
88
['{F942004C-5B06-4744-9E7C-7E5FCB6258A5}']
90
function GetPoinsX :Integer;
91
procedure SetPoinsX( const PoinX_:Integer );
92
function GetPoinsY :Integer;
93
procedure SetPoinsY( const PoinY_:Integer );
95
property CellsX :Integer read GetItemsX write SetItemsX;
96
property CellsY :Integer read GetItemsY write SetItemsY;
97
property PoinsX :Integer read GetPoinsX write SetPoinsX;
98
property PoinsY :Integer read GetPoinsY write SetPoinsY;
101
//-------------------------------------------------------------------------
103
TCellArray2D<_TItem_> = class( TArray2D<_TItem_>, ICellArray2D )
107
function GetPoinsX :Integer;
108
procedure SetPoinsX( const PoinsX_:Integer );
109
function GetPoinsY :Integer;
110
procedure SetPoinsY( const PoinsY_:Integer );
113
property Cells[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
114
property CellsX :Integer read GetItemsX write SetItemsX;
115
property CellsY :Integer read GetItemsY write SetItemsY;
116
property PoinsX :Integer read GetPoinsX write SetPoinsX;
117
property PoinsY :Integer read GetPoinsY write SetPoinsY;
119
procedure MakeEdgePerio; override;
120
procedure MakeEdgeMirro; override;
123
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray2D<_TItem_>
125
IPoinArray2D = interface( IArray2D )
126
['{7E34AB1F-480A-4CCF-9719-7938AA1015A9}']
128
function GetCellsX :Integer;
129
procedure SetCellsX( const CellsX_:Integer );
130
function GetCellsY :Integer;
131
procedure SetCellsY( const CellsY_:Integer );
133
property PoinsX :Integer read GetItemsX write SetItemsX;
134
property PoinsY :Integer read GetItemsY write SetItemsY;
135
property CellsX :Integer read GetCellsX write SetCellsX;
136
property CellsY :Integer read GetCellsY write SetCellsY;
139
//-------------------------------------------------------------------------
141
TPoinArray2D<_TItem_> = class( TArray2D<_TItem_>, IPoinArray2D )
145
function GetCellsX :Integer;
146
procedure SetCellsX( const CellsX_:Integer );
147
function GetCellsY :Integer;
148
procedure SetCellsY( const CellsY_:Integer );
150
constructor Create( const CellsX_,CellsY_,MargsX_,MargsY_:Integer ); override;
151
destructor Destroy; override;
153
property Poins[ const X_,Y_:Integer ] :_TItem_ read GetItems write SetItems ; default;
154
property PoinsX :Integer read GetItemsX write SetItemsX;
155
property PoinsY :Integer read GetItemsY write SetItemsY;
156
property CellsX :Integer read GetCellsX write SetCellsX;
157
property CellsY :Integer read GetCellsY write SetCellsY;
159
procedure MakeEdgePerio; override;
160
procedure MakeEdgeMirro; override;
163
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
165
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
167
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
169
implementation //############################################################### ■
171
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
173
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
175
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
177
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
179
/////////////////////////////////////////////////////////////////////// メソッド
181
function TArray2D<_TItem_>.ElemsI( const X_,Y_:Integer ) :Integer;
183
Result := Y_ * _ElemsX + X_;
186
function TArray2D<_TItem_>.ItemsI( const X_,Y_:Integer ) :Integer;
188
Result := ( _MargsY + Y_ ) * _ElemsX + ( _MargsX + X_ );
191
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
193
/////////////////////////////////////////////////////////////////////// アクセス
195
function TArray2D<_TItem_>.GetElemsN :Integer;
197
Result := _ElemsY * _ElemsX;
200
//------------------------------------------------------------------------------
202
function TArray2D<_TItem_>.GetElemsY :Integer;
207
//------------------------------------------------------------------------------
209
function TArray2D<_TItem_>.GetElems( const X_,Y_:Integer ) :_TItem_;
211
Result := _Elems[ ElemsI( X_, Y_ ) ];
214
procedure TArray2D<_TItem_>.SetElems( const X_,Y_:Integer; const Elem_:_TItem_ );
216
_Elems[ ElemsI( X_, Y_ ) ] := Elem_;
219
function TArray2D<_TItem_>.GetElemsP( const X_,Y_:Integer ) :_PItem_;
221
Result := @_Elems[ ElemsI( X_, Y_ ) ];
224
//------------------------------------------------------------------------------
226
function TArray2D<_TItem_>.GetItemsY :Integer;
231
procedure TArray2D<_TItem_>.SetItemsY( const ItemsY_:Integer );
233
_ItemsY := ItemsY_; MakeArray;
236
function TArray2D<_TItem_>.GetMargsY :Integer;
241
procedure TArray2D<_TItem_>.SetMargsY( const MargsY_:Integer );
243
_MargsY := MargsY_; MakeArray;
246
function TArray2D<_TItem_>.GetItemsN :Integer;
248
Result := _ItemsY * _ItemsX;
251
//------------------------------------------------------------------------------
253
function TArray2D<_TItem_>.GetItems( const X_,Y_:Integer ) :_TItem_;
255
Result := _Elems[ ItemsI( X_, Y_ ) ];
258
procedure TArray2D<_TItem_>.SetItems( const X_,Y_:Integer; const Item_:_TItem_ );
260
_Elems[ ItemsI( X_, Y_ ) ] := Item_;
263
function TArray2D<_TItem_>.GetItemsP( const X_,Y_:Integer ) :_PItem_;
265
Result := @_Elems[ ItemsI( X_, Y_ ) ];
268
function TArray2D<_TItem_>.GetItem0P :Pointer;
270
Result := GetItemsP( 0, 0 );
273
/////////////////////////////////////////////////////////////////////// メソッド
275
procedure TArray2D<_TItem_>.MakeArray;
277
_ElemsY := _MargsY + _ItemsY + _MargsY;
282
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
284
constructor TArray2D<_TItem_>.Create;
289
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_:Integer );
291
Create( ItemsX_, ItemsY_, 0 );
294
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_,Margs_:Integer );
296
Create( ItemsX_, ItemsY_, Margs_, Margs_ );
299
constructor TArray2D<_TItem_>.Create( const ItemsX_,ItemsY_,MargsX_,MargsY_:Integer );
301
inherited Create( ItemsX_, MargsX_ );
307
destructor TArray2D<_TItem_>.Destroy;
313
/////////////////////////////////////////////////////////////////////// メソッド
315
procedure TArray2D<_TItem_>.MakeEdgeLoop;
317
EX, EY, MX, MY :Integer;
319
for EY := -_MargsY to -1 do
323
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, MY ];
324
for EX := 0 to _ItemsX -1 do Items[ EX, EY ] := Items[ EX , MY ];
325
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, MY ];
328
for EY := 0 to _ItemsY-1 do
330
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, EY ];
332
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, EY ];
335
for EY := _ItemsY to _ItemsY+_MargsY-1 do
339
for EX := -_MargsX to -1 do Items[ EX, EY ] := Items[ EX + _ItemsX, MY ];
340
for EX := 0 to _ItemsX -1 do Items[ EX, EY ] := Items[ EX , MY ];
341
for EX := _ItemsX to _ItemsX+_MargsX-1 do Items[ EX, EY ] := Items[ EX - _ItemsX, MY ];
345
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray2D<_TItem_>
347
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
349
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
351
/////////////////////////////////////////////////////////////////////// アクセス
353
function TCellArray2D<_TItem_>.GetPoinsX :Integer;
355
Result := CellsX + 1;
358
procedure TCellArray2D<_TItem_>.SetPoinsX( const PoinsX_:Integer );
360
CellsX := PoinsX_ - 1;
363
function TCellArray2D<_TItem_>.GetPoinsY :Integer;
365
Result := CellsY + 1;
368
procedure TCellArray2D<_TItem_>.SetPoinsY( const PoinsY_:Integer );
370
CellsY := PoinsY_ - 1;
373
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
375
/////////////////////////////////////////////////////////////////////// メソッド
377
procedure TCellArray2D<_TItem_>.MakeEdgePerio;
379
MX, MY, NX, NY, HX, HY, X, Y :Integer;
383
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
384
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
385
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2
387
MX := _MargsX; NX := _ItemsX; HX := _ItemsX-1;
388
MY := _MargsY; NY := _ItemsY; HY := _ItemsY-1;
392
for X := 00-MX to 00-01 do Items[ X, Y ] := Items[ X + NX, Y ];
393
for X := HX+01 to HX+MX do Items[ X, Y ] := Items[ X - NX, Y ];
396
for X := 00-MX to HX+MX do
398
for Y := 00-MY to 00-01 do Items[ X, Y ] := Items[ X, Y + NY ];
399
for Y := HY+01 to HY+MY do Items[ X, Y ] := Items[ X, Y - NY ];
403
procedure TCellArray2D<_TItem_>.MakeEdgeMirro;
405
MX, MY, NX, NY, HX, HY, X, Y :Integer;
409
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
410
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
411
// +2 +1 00 ・ ・ ・ ・ ・ ・ +5 +4 +3 }
413
MX := _MargsX; NX := _ItemsX; HX := _ItemsX-1;
414
MY := _MargsY; NY := _ItemsY; HY := _ItemsY-1;
418
for X := 00-MX to 00-01 do Items[ X, Y ] := Items[ 00 - X - 01, Y ];
419
for X := HX+01 to HX+MX do Items[ X, Y ] := Items[ HX - X + NX, Y ];
422
for X := 00-MX to HX+MX do
424
for Y := 00-MY to 00-01 do Items[ X, Y ] := Items[ X, 00 - Y - 01 ];
425
for Y := HY+01 to HY+MY do Items[ X, Y ] := Items[ X, HY - Y + NY ];
429
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray2D<_TItem_>
431
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
433
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
435
/////////////////////////////////////////////////////////////////////// アクセス
437
function TPoinArray2D<_TItem_>.GetCellsX :Integer;
439
Result := _ItemsX - 1;
442
procedure TPoinArray2D<_TItem_>.SetCellsX( const CellsX_:Integer );
444
_ItemsX := CellsX_ + 1; MakeArray;
447
function TPoinArray2D<_TItem_>.GetCellsY :Integer;
449
Result := _ItemsY - 1;
452
procedure TPoinArray2D<_TItem_>.SetCellsY( const CellsY_:Integer );
454
_ItemsY := CellsY_ + 1; MakeArray;
457
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
459
constructor TPoinArray2D<_TItem_>.Create( const CellsX_,CellsY_,MargsX_,MargsY_:Integer );
461
inherited Create( CellsX_+1, CellsY_+1,
466
destructor TPoinArray2D<_TItem_>.Destroy;
472
/////////////////////////////////////////////////////////////////////// メソッド
474
procedure TPoinArray2D<_TItem_>.MakeEdgePerio;
476
MX, MY, HX, HY, X, Y :Integer;
480
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
481
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
482
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 +3
484
MX := _MargsX; HX := _ItemsX-1;
485
MY := _MargsX; HY := _ItemsX-1;
489
for X := 00-MX to 00-01 do Items[ X, Y ] := Items[ X + HX, Y ];
490
for X := HX+00 to HX+MX do Items[ X, Y ] := Items[ X - HX, Y ];
493
for X := 00-MX to HX+MX do
495
for Y := 00-MY to 00-01 do Items[ X, Y ] := Items[ X, Y + HY ];
496
for Y := HY+00 to HY+MY do Items[ X, Y ] := Items[ X, Y - HY ];
500
procedure TPoinArray2D<_TItem_>.MakeEdgeMirro;
502
MX, MY, HX, HY, X, Y :Integer;
506
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
507
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
508
// +3 +2 +1 ・ ・ ・ ・ ・ ・ ・ +5 +4 +3
510
MX := _MargsX; HX := _ItemsX-1;
511
MY := _MargsX; HY := _ItemsX-1;
515
for X := 00-MX to 00-01 do Items[ X, Y ] := Items[ -X , Y ];
516
for X := HX+01 to HX+MX do Items[ X, Y ] := Items[ -X + 2*HX, Y ];
519
for X := 00-MX to HX+MX do
521
for Y := 00-MY to 00-01 do Items[ X, Y ] := Items[ X, -Y ];
522
for Y := HY+01 to HY+MY do Items[ X, Y ] := Items[ X, -Y + 2*HY ];
526
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
528
//############################################################################## □
530
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
532
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
534
end. //######################################################################### ■