Luxophia

Форк
0
/
LUX.Lattice.T2.pas 
327 строк · 10.7 Кб
1
unit LUX.Lattice.T2;
2

3
interface //#################################################################### ■
4

5
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
6

7
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
8

9
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
10

11
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
12

13
     TArray2D<_TItem_> = class
14
     private
15
       _AllX :Integer;
16
       _AllY :Integer;
17
       ///// メソッド
18
       procedure MakeArray;
19
       function XYtoI( const X_,Y_:Integer ) :Integer; inline;
20
     protected
21
       _CountX  :Integer;
22
       _CountY  :Integer;
23
       _MarginX :Integer;
24
       _MarginY :Integer;
25
       _Item    :array of _TItem_;
26
       ///// アクセス
27
       procedure SetCountX( const CountX_:Integer );
28
       procedure SetCountY( const CountY_:Integer );
29
       procedure SetMarginX( const MarginX_:Integer );
30
       procedure SetMarginY( const MarginY_:Integer );
31
       function GetItem( const X_,Y_:Integer ) :_TItem_;
32
       procedure SetItem( const X_,Y_:Integer; const Item_:_TItem_ );
33
     public
34
       constructor Create; overload;
35
       constructor Create( const CountX_,CountY_:Integer ); overload;
36
       constructor Create( const CountX_,CountY_,Margin_:Integer ); overload;
37
       constructor Create( const CountX_,CountY_,MarginX_,MarginY_:Integer ); overload;
38
       procedure AfterConstruction; override;
39
       destructor Destroy; override;
40
       ///// プロパティ
41
       property CountX                      :Integer read   _CountX  write SetCountX ;
42
       property CountY                      :Integer read   _CountY  write SetCountY ;
43
       property MarginX                     :Integer read   _MarginX write SetMarginX;
44
       property MarginY                     :Integer read   _MarginY write SetMarginY;
45
       property Item[ const X_,Y_:Integer ] :_TItem_ read GetItem    write SetItem   ; default;
46
       ///// メソッド
47
       class procedure Swap( var Array0_,Array1_:TArray2D<_TItem_> ); static;
48
       procedure MakeEdgeLoop;
49
     end;
50

51
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray2D<_TItem_>
52

53
     TBricArray2D<_TItem_> = class( TArray2D<_TItem_> )
54
     private
55
     protected
56
       ///// アクセス
57
       function GetGridX :Integer;
58
       procedure SetGridX( const GridX_:Integer );
59
       function GetGridY :Integer;
60
       procedure SetGridY( const GridY_:Integer );
61
     public
62
       ///// プロパティ
63
       property Bric[ const X_,Y_:Integer ] :_TItem_ read GetItem   write SetItem  ; default;
64
       property BricX                       :Integer read   _CountX write SetCountX;
65
       property BricY                       :Integer read   _CountY write SetCountY;
66
       property GridX                       :Integer read GetGridX  write SetGridX ;
67
       property GridY                       :Integer read GetGridY  write SetGridY ;
68
     end;
69

70
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray2D<_TItem_>
71

72
     TGridArray2D<_TItem_> = class( TArray2D<_TItem_> )
73
     private
74
     protected
75
       ///// アクセス
76
       function GetBricX :Integer;
77
       procedure SetBricX( const BricX_:Integer );
78
       function GetBricY :Integer;
79
       procedure SetBricY( const BricY_:Integer );
80
     public
81
       constructor Create; overload;
82
       constructor Create( const BricX_,BricY_:Integer ); overload;
83
       constructor Create( const BricX_,BricY_,MarginX_,MarginY_:Integer ); overload;
84
       destructor Destroy; override;
85
       ///// プロパティ
86
       property Grid[ const X_,Y_:Integer ] :_TItem_ read GetItem   write SetItem  ; default;
87
       property GridX                       :Integer read   _CountX write SetCountX;
88
       property GridY                       :Integer read   _CountY write SetCountY;
89
       property BricX                       :Integer read GetBricX  write SetBricX ;
90
       property BricY                       :Integer read GetBricY  write SetBricY ;
91
     end;
92

93
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
94

95
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
96

97
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
98

99
implementation //############################################################### ■
100

101
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
102

103
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
104

105
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray2D<_TItem_>
106

107
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
108

109
/////////////////////////////////////////////////////////////////////// メソッド
110

111
procedure TArray2D<_TItem_>.MakeArray;
112
begin
113
     _AllX := _MarginX + _CountX + _MarginX;
114
     _AllY := _MarginY + _CountY + _MarginY;
115

116
     SetLength( _Item, _AllX * _AllY );
117
end;
118

119
function TArray2D<_TItem_>.XYtoI( const X_,Y_:Integer ) :Integer;
120
begin
121
     Result := ( _MarginX + X_ ) + _AllX * ( _MarginY + Y_ );
122
end;
123

124
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
125

126
/////////////////////////////////////////////////////////////////////// アクセス
127

128
procedure TArray2D<_TItem_>.SetCountX( const CountX_:Integer );
129
begin
130
     _CountX := CountX_;  MakeArray;
131
end;
132

133
procedure TArray2D<_TItem_>.SetCountY( const CountY_:Integer );
134
begin
135
     _CountY := CountY_;  MakeArray;
136
end;
137

138
procedure TArray2D<_TItem_>.SetMarginX( const MarginX_:Integer );
139
begin
140
     _MarginX := MarginX_;  MakeArray;
141
end;
142

143
procedure TArray2D<_TItem_>.SetMarginY( const MarginY_:Integer );
144
begin
145
     _MarginY := MarginY_;  MakeArray;
146
end;
147

148
function TArray2D<_TItem_>.GetItem( const X_,Y_:Integer ) :_TItem_;
149
begin
150
     Result := _Item[ XYtoI( X_, Y_ ) ];
151
end;
152

153
procedure TArray2D<_TItem_>.SetItem( const X_,Y_:Integer; const Item_:_TItem_ );
154
begin
155
     _Item[ XYtoI( X_, Y_ ) ] := Item_;
156
end;
157

158
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
159

160
constructor TArray2D<_TItem_>.Create;
161
begin
162
     Create( 0, 0 );
163
end;
164

165
constructor TArray2D<_TItem_>.Create( const CountX_,CountY_:Integer );
166
begin
167
     Create( CountX_, CountY_, 0 );
168
end;
169

170
constructor TArray2D<_TItem_>.Create( const CountX_,CountY_,Margin_:Integer );
171
begin
172
     Create( CountX_, CountY_, Margin_, Margin_ );
173
end;
174

175
constructor TArray2D<_TItem_>.Create( const CountX_,CountY_,MarginX_,MarginY_:Integer );
176
begin
177
     inherited Create;
178

179
     _CountX  := CountX_;
180
     _CountY  := CountY_;
181
     _MarginX := MarginX_;
182
     _MarginY := MarginY_;
183
end;
184

185
procedure TArray2D<_TItem_>.AfterConstruction;
186
begin
187
     MakeArray;
188
end;
189

190
destructor TArray2D<_TItem_>.Destroy;
191
begin
192

193
     inherited;
194
end;
195

196
/////////////////////////////////////////////////////////////////////// メソッド
197

198
class procedure TArray2D<_TItem_>.Swap( var Array0_,Array1_:TArray2D<_TItem_> );
199
var
200
   A :TArray2D<_TItem_>;
201
begin
202
     A := Array0_;  Array0_ := Array1_;  Array1_ := A;
203
end;
204

205
procedure TArray2D<_TItem_>.MakeEdgeLoop;
206
var
207
   EX, EY, MX, MY :Integer;
208
begin
209
     for EY := -_MarginY to -1 do
210
     begin
211
          MY := EY + _CountY;
212

213
          for EX := -_MarginX to                 -1 do Item[ EX, EY ] := Item[ EX + _CountX, MY ];
214
          for EX :=  0        to _CountX         -1 do Item[ EX, EY ] := Item[ EX          , MY ];
215
          for EX :=  _CountX  to _CountX+_MarginX-1 do Item[ EX, EY ] := Item[ EX - _CountX, MY ];
216
     end;
217

218
     for EY := 0 to _CountY-1 do
219
     begin
220
          for EX := -_MarginX to                 -1 do Item[ EX, EY ] := Item[ EX + _CountX, EY ];
221

222
          for EX :=  _CountX  to _CountX+_MarginX-1 do Item[ EX, EY ] := Item[ EX - _CountX, EY ];
223
     end;
224

225
     for EY := _CountY to _CountY+_MarginY-1 do
226
     begin
227
          MY := EY - _CountY;
228

229
          for EX := -_MarginX to                 -1 do Item[ EX, EY ] := Item[ EX + _CountX, MY ];
230
          for EX :=  0        to _CountX         -1 do Item[ EX, EY ] := Item[ EX          , MY ];
231
          for EX :=  _CountX  to _CountX+_MarginX-1 do Item[ EX, EY ] := Item[ EX - _CountX, MY ];
232
     end;
233
end;
234

235
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TBricArray2D<_TItem_>
236

237
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
238

239
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
240

241
/////////////////////////////////////////////////////////////////////// アクセス
242

243
function TBricArray2D<_TItem_>.GetGridX :Integer;
244
begin
245
     Result := BricX + 1;
246
end;
247

248
procedure TBricArray2D<_TItem_>.SetGridX( const GridX_:Integer );
249
begin
250
     BricX := GridX_ - 1;
251
end;
252

253
function TBricArray2D<_TItem_>.GetGridY :Integer;
254
begin
255
     Result := BricY + 1;
256
end;
257

258
procedure TBricArray2D<_TItem_>.SetGridY( const GridY_:Integer );
259
begin
260
     BricY := GridY_ - 1;
261
end;
262

263
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
264

265
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGridArray2D<_TItem_>
266

267
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
268

269
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
270

271
/////////////////////////////////////////////////////////////////////// アクセス
272

273
function TGridArray2D<_TItem_>.GetBricX :Integer;
274
begin
275
     Result := _CountX - 1;
276
end;
277

278
procedure TGridArray2D<_TItem_>.SetBricX( const BricX_:Integer );
279
begin
280
     _CountX  := BricX_ + 1;  MakeArray;
281
end;
282

283
function TGridArray2D<_TItem_>.GetBricY :Integer;
284
begin
285
     Result := _CountY - 1;
286
end;
287

288
procedure TGridArray2D<_TItem_>.SetBricY( const BricY_:Integer );
289
begin
290
     _CountY  := BricY_ + 1;  MakeArray;
291
end;
292

293
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
294

295
constructor TGridArray2D<_TItem_>.Create;
296
begin
297
     Create( 0, 0 );
298
end;
299

300
constructor TGridArray2D<_TItem_>.Create( const BricX_,BricY_:Integer );
301
begin
302
     Create( BricX_, BricY_, 0, 0 );
303
end;
304

305
constructor TGridArray2D<_TItem_>.Create( const BricX_,BricY_,MarginX_,MarginY_:Integer );
306
begin
307
     inherited;
308

309
     _CountX  := BricX_ + 1;
310
     _CountY  := BricY_ + 1;
311
end;
312

313
destructor TGridArray2D<_TItem_>.Destroy;
314
begin
315

316
     inherited;
317
end;
318

319
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
320

321
//############################################################################## □
322

323
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
324

325
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
326

327
end. //######################################################################### ■
328

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.