3
interface //#################################################################### ■
5
uses System.SysUtils, System.Classes,
11
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
13
TArray3D<_TItem_> = class;
14
TCellArray3D<_TItem_> = class;
15
TPoinArray3D<_TItem_> = class;
16
TCellIterPoinArray3D<_TItem_> = class;
18
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
20
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
22
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray3D<_TItem_>
24
IArray3D = interface( IArray2D )
25
['{2ED01C38-BB77-4958-83DE-E4F723A74774}']
28
function GetElemsZ :Integer;
29
function GetItemsZ :Integer;
30
procedure SetItemsZ( const ItemsZ_:Integer );
31
function GetMargsZ :Integer;
32
procedure SetMargsZ( const MargsZ_:Integer );
33
function GetItemsN :Integer;
35
function GetCounStepX :Integer;
36
function GetCounStepY :Integer;
37
function GetCounStepZ :Integer;
38
function GetByteStepX :Integer;
39
function GetByteStepY :Integer;
40
function GetByteStepZ :Integer;
41
function GetLines( const Y_,Z_:Integer ) :PByteArray;
42
function GetLineSize :Integer;
45
property ElemsZ :Integer read GetElemsZ ;
46
property ItemsZ :Integer read GetItemsZ write SetItemsZ;
47
property MargsZ :Integer read GetMargsZ write SetMargsZ;
48
property ItemsN :Integer read GetItemsN ;
50
property CounStepX :Integer read GetCounStepX;
51
property CounStepY :Integer read GetCounStepY;
52
property CounStepZ :Integer read GetCounStepZ;
53
property ByteStepX :Integer read GetByteStepX;
54
property ByteStepY :Integer read GetByteStepY;
55
property ByteStepZ :Integer read GetByteStepZ;
56
property Lines[ const Y_,Z_:Integer ] :PByteArray read GetLines ;
57
property LineSize :Integer read GetLineSize ;
60
//-------------------------------------------------------------------------
62
TArray3D<_TItem_> = class( TArray2D<_TItem_>, IArray3D )
64
_PItem_ = TCoreArray<_TItem_>._PElem_;
67
function ElemsI( const X_,Y_,Z_:Integer ) :Integer; inline;
68
function ItemsI( const X_,Y_,Z_:Integer ) :Integer; inline;
74
function GetElemsN :Integer; override;
75
function GetElemsZ :Integer;
76
function GetElems( const X_,Y_,Z_:Integer ) :_TItem_;
77
procedure SetElems( const X_,Y_,Z_:Integer; const Elem_:_TItem_ );
78
function GetElemsP( const X_,Y_,Z_:Integer ) :_PItem_;
79
function GetItemsZ :Integer;
80
procedure SetItemsZ( const ItemsZ_:Integer );
81
function GetMargsZ :Integer;
82
procedure SetMargsZ( const MargsZ_:Integer );
83
function GetItemsN :Integer; override;
84
function GetItems( const X_,Y_,Z_:Integer ) :_TItem_;
85
procedure SetItems( const X_,Y_,Z_:Integer; const Item_:_TItem_ );
86
function GetItemsP( const X_,Y_,Z_:Integer ) :_PItem_;
87
function GetItem0P :Pointer;
89
function GetCounStepX :Integer;
90
function GetCounStepY :Integer;
91
function GetCounStepZ :Integer;
92
function GetByteStepX :Integer;
93
function GetByteStepY :Integer;
94
function GetByteStepZ :Integer;
95
function GetLines( const Y_,Z_:Integer ) :PByteArray;
96
function GetLineSize :Integer;
98
procedure MakeArray; override;
100
constructor Create; overload;
101
constructor Create( const ItemsX_,ItemsY_,ItemsZ_:Integer ); overload;
102
constructor Create( const ItemsX_,ItemsY_,ItemsZ_,Margs_:Integer ); reintroduce; overload;
103
constructor Create( const ItemsX_,ItemsY_,ItemsZ_,MargsX_,MargsY_,MargsZ_:Integer ); overload; virtual;
104
destructor Destroy; override;
106
property ItemByte :Integer read GetElemByte ;
107
property ElemsZ :Integer read GetElemsZ ;
108
property Elems[ const X_,Y_,Z_:Integer ] :_TItem_ read GetElems write SetElems ;
109
property ElemsP[ const X_,Y_,Z_:Integer ] :_PItem_ read GetElemsP ;
110
property ItemsZ :Integer read GetItemsZ write SetItemsZ;
111
property MargsZ :Integer read GetMargsZ write SetMargsZ;
112
property ItemsN :Integer read GetItemsN ;
113
property Items[ const X_,Y_,Z_:Integer ] :_TItem_ read GetItems write SetItems ; default;
114
property ItemsP[ const X_,Y_,Z_:Integer ] :_PItem_ read GetItemsP ;
115
property Item0P :Pointer read GetItem0P ;
117
property CounStepX :Integer read GetCounStepX ;
118
property CounStepY :Integer read GetCounStepY ;
119
property CounStepZ :Integer read GetCounStepZ ;
120
property ByteStepX :Integer read GetByteStepX ;
121
property ByteStepY :Integer read GetByteStepY ;
122
property ByteStepZ :Integer read GetByteStepZ ;
123
property Lines[ const Y_,Z_:Integer ] :PByteArray read GetLines ;
124
property LineSize :Integer read GetLineSize ;
126
procedure Read( const Stream_:TStream ); virtual;
127
procedure Write( const Stream_:TStream ); virtual;
130
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray3D<_TItem_>
132
ICellArray3D = interface( IArray3D )
133
['{40BD11E7-4BF9-43F3-BE98-846C78B22EFD}']
135
function GetPoinsX :Integer;
136
procedure SetPoinsX( const PoinX_:Integer );
137
function GetPoinsY :Integer;
138
procedure SetPoinsY( const PoinY_:Integer );
139
function GetPoinsZ :Integer;
140
procedure SetPoinsZ( const PoinZ_:Integer );
142
property CellsX :Integer read GetItemsX write SetItemsX;
143
property CellsY :Integer read GetItemsY write SetItemsY;
144
property CellsZ :Integer read GetItemsZ write SetItemsZ;
145
property PoinsX :Integer read GetPoinsX write SetPoinsX;
146
property PoinsY :Integer read GetPoinsY write SetPoinsY;
147
property PoinsZ :Integer read GetPoinsZ write SetPoinsZ;
150
//-------------------------------------------------------------------------
152
TCellArray3D<_TItem_> = class( TArray3D<_TItem_>, ICellArray3D )
156
function GetPoinsX :Integer;
157
procedure SetPoinsX( const PoinX_:Integer );
158
function GetPoinsY :Integer;
159
procedure SetPoinsY( const PoinY_:Integer );
160
function GetPoinsZ :Integer;
161
procedure SetPoinsZ( const PoinZ_:Integer );
164
property Cells[ const X_,Y_,Z_:Integer ] :_TItem_ read GetItems write SetItems ; default;
165
property CellsX :Integer read GetItemsX write SetItemsX;
166
property CellsY :Integer read GetItemsY write SetItemsY;
167
property CellsZ :Integer read GetItemsZ write SetItemsZ;
168
property PoinsX :Integer read GetPoinsX write SetPoinsX;
169
property PoinsY :Integer read GetPoinsY write SetPoinsY;
170
property PoinsZ :Integer read GetPoinsZ write SetPoinsZ;
172
procedure MakeEdgePerio; override;
173
procedure MakeEdgeMirro; override;
176
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray3D<_TItem_>
178
IPoinArray3D = interface( IArray3D )
179
['{60135172-47A4-4183-8CE9-B590E8F21835}']
181
function GetCellsX :Integer;
182
procedure SetCellsX( const CellsX_:Integer );
183
function GetCellsY :Integer;
184
procedure SetCellsY( const CellsY_:Integer );
185
function GetCellsZ :Integer;
186
procedure SetCellsZ( const CellsZ_:Integer );
188
property PoinsX :Integer read GetItemsX write SetItemsX;
189
property PoinsY :Integer read GetItemsY write SetItemsY;
190
property PoinsZ :Integer read GetItemsZ write SetItemsZ;
191
property CellsX :Integer read GetCellsX write SetCellsX;
192
property CellsY :Integer read GetCellsY write SetCellsY;
193
property CellsZ :Integer read GetCellsZ write SetCellsZ;
196
//-------------------------------------------------------------------------
198
TPoinArray3D<_TItem_> = class( TArray3D<_TItem_>, IPoinArray3D )
202
function GetCellsX :Integer;
203
procedure SetCellsX( const CellsX_:Integer );
204
function GetCellsY :Integer;
205
procedure SetCellsY( const CellsY_:Integer );
206
function GetCellsZ :Integer;
207
procedure SetCellsZ( const CellsZ_:Integer );
208
function GetCellsN :Integer;
210
function NewCellIter :TCellIterPoinArray3D<_TItem_>; virtual;
212
constructor Create( const CellsX_,CellsY_,CellsZ_,MargsX_,MargsY_,MargsZ_:Integer ); override;
213
destructor Destroy; override;
215
property Poins[ const X_,Y_,Z_:Integer ] :_TItem_ read GetItems write SetItems ; default;
216
property PoinsX :Integer read GetItemsX write SetItemsX;
217
property PoinsY :Integer read GetItemsY write SetItemsY;
218
property PoinsZ :Integer read GetItemsZ write SetItemsZ;
219
property PoinsN :Integer read GetItemsN ;
220
property CellsX :Integer read GetCellsX write SetCellsX;
221
property CellsY :Integer read GetCellsY write SetCellsY;
222
property CellsZ :Integer read GetCellsZ write SetCellsZ;
223
property CellsN :Integer read GetCellsN ;
225
procedure Read( const Stream_:TStream ); override;
226
procedure Write( const Stream_:TStream ); override;
227
procedure ForCells( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
228
procedure ForEdgesX( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
229
procedure ForEdgesY( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
230
procedure ForEdgesZ( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
232
procedure MakeEdgePerio; override;
233
procedure MakeEdgeMirro; override;
236
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellIterPoinArray3D<_TItem_>
238
ICellIterPoinArray3D<_TItem_> = interface
239
['{F5FE2821-AAE8-4D83-9732-956556A2E7C2}']
241
function GetPos :TInteger3D;
242
procedure SetPos( const Pos_:TInteger3D );
243
function GetPoins( const X_,Y_,Z_:Shortint ) :_TItem_;
244
procedure SetPoins( const X_,Y_,Z_:Shortint; const Item_:_TItem_ );
245
function GetGiX( const I_:Shortint ) :Integer;
246
function GetGiY( const I_:Shortint ) :Integer;
247
function GetGiZ( const I_:Shortint ) :Integer;
249
property Pos :TInteger3D read GetPos write SetPos ;
250
property Poins[ const X_,Y_,Z_:Shortint ] :_TItem_ read GetPoins write SetPoins; default;
251
property GiX[ const I_:Shortint ] :Integer read GetGiX;
252
property GiY[ const I_:Shortint ] :Integer read GetGiY;
253
property GiZ[ const I_:Shortint ] :Integer read GetGiZ;
255
procedure GoPrevX; overload;
256
procedure GoNextX; overload;
257
procedure GoPrevY; overload;
258
procedure GoNextY; overload;
259
procedure GoPrevZ; overload;
260
procedure GoNextZ; overload;
261
procedure GoPrevX( const N_:Integer ); overload;
262
procedure GoNextX( const N_:Integer ); overload;
263
procedure GoPrevY( const N_:Integer ); overload;
264
procedure GoNextY( const N_:Integer ); overload;
265
procedure GoPrevZ( const N_:Integer ); overload;
266
procedure GoNextZ( const N_:Integer ); overload;
267
function Interp( const Xd_,Yd_,Zd_:Single ) :_TItem_;
268
function AbsoInterp( const X_,Y_,Z_:Single ) :_TItem_;
271
//-------------------------------------------------------------------------
273
TCellIterPoinArray3D<_TItem_> = class( TInterfacedObject, ICellIterPoinArray3D<_TItem_> )
278
_Paren :TPoinArray3D<_TItem_>;
279
_HeadZ :array [ -1..+2 ] of _PItem_;
280
_HeadY :array [ -1..+2, -1..+2 ] of _PItem_;
281
_Poins :array [ -1..+2, -1..+2, -1..+2 ] of _PItem_;
282
_GX :array [ -1..+2 ] of Integer;
283
_GY :array [ -1..+2 ] of Integer;
284
_GZ :array [ -1..+2 ] of Integer;
286
function GetPosX :Integer;
287
procedure SetPosX( const PosX_:Integer );
288
function GetPosY :Integer;
289
procedure SetPosY( const PosY_:Integer );
290
function GetPosZ :Integer;
291
procedure SetPosZ( const PosZ_:Integer );
292
function GetPos :TInteger3D;
293
procedure SetPos( const Pos_:TInteger3D );
294
function GetPoins( const X_,Y_,Z_:Shortint ) :_TItem_;
295
procedure SetPoins( const X_,Y_,Z_:Shortint; const Item_:_TItem_ );
296
function GetGiX( const I_:Shortint ) :Integer;
297
function GetGiY( const I_:Shortint ) :Integer;
298
function GetGiZ( const I_:Shortint ) :Integer;
299
function GetGi( const X_,Y_,Z_:Shortint ) :TInteger3D;
301
constructor Create( const Array_:TPoinArray3D<_TItem_> );
302
destructor Destroy; override;
304
property PosX :Integer read GetPosX write SetPosX ;
305
property PosY :Integer read GetPosY write SetPosY ;
306
property PosZ :Integer read GetPosZ write SetPosZ ;
307
property Pos :TInteger3D read GetPos write SetPos ;
308
property Poins[ const X_,Y_,Z_:Shortint ] :_TItem_ read GetPoins write SetPoins; default;
309
property GiX[ const I_:Shortint ] :Integer read GetGiX ;
310
property GiY[ const I_:Shortint ] :Integer read GetGiY ;
311
property GiZ[ const I_:Shortint ] :Integer read GetGiZ ;
312
property Gi[ const X_,Y_,Z_:Shortint ] :TInteger3D read GetGi ;
314
procedure GoPrevX; overload;
315
procedure GoNextX; overload;
316
procedure GoPrevY; overload;
317
procedure GoNextY; overload;
318
procedure GoPrevZ; overload;
319
procedure GoNextZ; overload;
320
procedure GoPrevX( const N_:Integer ); overload;
321
procedure GoNextX( const N_:Integer ); overload;
322
procedure GoPrevY( const N_:Integer ); overload;
323
procedure GoNextY( const N_:Integer ); overload;
324
procedure GoPrevZ( const N_:Integer ); overload;
325
procedure GoNextZ( const N_:Integer ); overload;
326
function Interp( const Xd_,Yd_,Zd_:Single ) :_TItem_; virtual;
327
function AbsoInterp( const X_,Y_,Z_:Single ) :_TItem_; virtual;
328
procedure ForCells( const Proc_:TProc );
329
procedure ForEdgesX( const Proc_:TProc );
330
procedure ForEdgesY( const Proc_:TProc );
331
procedure ForEdgesZ( const Proc_:TProc );
334
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
336
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
338
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
340
implementation //############################################################### ■
344
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
346
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
348
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TArray3D<_TItem_>
350
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
352
/////////////////////////////////////////////////////////////////////// メソッド
354
function TArray3D<_TItem_>.ElemsI( const X_,Y_,Z_:Integer ) :Integer;
356
Result := ( Z_ * _ElemsY + Y_ ) * _ElemsX + X_;
359
function TArray3D<_TItem_>.ItemsI( const X_,Y_,Z_:Integer ) :Integer;
361
Result := ( ( _MargsZ + Z_ ) * _ElemsY + ( _MargsY + Y_ ) ) * _ElemsX + ( _MargsX + X_ );
364
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
366
/////////////////////////////////////////////////////////////////////// アクセス
368
function TArray3D<_TItem_>.GetElemsN :Integer;
370
Result := _ElemsZ * _ElemsY * _ElemsX;
373
//------------------------------------------------------------------------------
375
function TArray3D<_TItem_>.GetElemsZ :Integer;
380
//------------------------------------------------------------------------------
382
function TArray3D<_TItem_>.GetElems( const X_,Y_,Z_:Integer ) :_TItem_;
384
Result := _Elems[ ElemsI( X_, Y_, Z_ ) ];
387
procedure TArray3D<_TItem_>.SetElems( const X_,Y_,Z_:Integer; const Elem_:_TItem_ );
389
_Elems[ ElemsI( X_, Y_, Z_ ) ] := Elem_;
392
function TArray3D<_TItem_>.GetElemsP( const X_,Y_,Z_:Integer ) :_PItem_;
394
Result := @_Elems[ ElemsI( X_, Y_, Z_ ) ];
397
//------------------------------------------------------------------------------
399
function TArray3D<_TItem_>.GetItemsZ :Integer;
404
procedure TArray3D<_TItem_>.SetItemsZ( const ItemsZ_:Integer );
406
_ItemsZ := ItemsZ_; MakeArray;
409
function TArray3D<_TItem_>.GetMargsZ :Integer;
414
procedure TArray3D<_TItem_>.SetMargsZ( const MargsZ_:Integer );
416
_MargsZ := MargsZ_; MakeArray;
419
function TArray3D<_TItem_>.GetItemsN :Integer;
421
Result := _ItemsZ * _ItemsY * _ItemsX;
424
//------------------------------------------------------------------------------
426
function TArray3D<_TItem_>.GetItems( const X_,Y_,Z_:Integer ) :_TItem_;
428
Result := _Elems[ ItemsI( X_, Y_, Z_ ) ];
431
procedure TArray3D<_TItem_>.SetItems( const X_,Y_,Z_:Integer; const Item_:_TItem_ );
433
_Elems[ ItemsI( X_, Y_, Z_ ) ] := Item_;
436
function TArray3D<_TItem_>.GetItemsP( const X_,Y_,Z_:Integer ) :_PItem_;
438
Result := @_Elems[ ItemsI( X_, Y_, Z_ ) ];
441
function TArray3D<_TItem_>.GetItem0P :Pointer;
443
Result := GetItemsP( 0, 0, 0 );
446
//------------------------------------------------------------------------------
448
function TArray3D<_TItem_>.GetCounStepX :Integer;
453
function TArray3D<_TItem_>.GetCounStepY :Integer;
455
Result := CounStepX * _ElemsX;
458
function TArray3D<_TItem_>.GetCounStepZ :Integer;
460
Result := CounStepY * _ElemsY;
463
//------------------------------------------------------------------------------
465
function TArray3D<_TItem_>.GetByteStepX :Integer;
467
Result := ItemByte * CounStepX;
470
function TArray3D<_TItem_>.GetByteStepY :Integer;
472
Result := ItemByte * CounStepY;
475
function TArray3D<_TItem_>.GetByteStepZ :Integer;
477
Result := ItemByte * CounStepZ;
480
//------------------------------------------------------------------------------
482
function TArray3D<_TItem_>.GetLines( const Y_,Z_:Integer ) :PByteArray;
484
Result := @_Elems[ ItemsI( 0, Y_, Z_ ) ];
487
function TArray3D<_TItem_>.GetLineSize :Integer;
489
Result := ItemByte * _ItemsX;
492
/////////////////////////////////////////////////////////////////////// メソッド
494
procedure TArray3D<_TItem_>.MakeArray;
496
_ElemsZ := _MargsZ + _ItemsZ + _MargsZ;
501
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
503
constructor TArray3D<_TItem_>.Create;
508
constructor TArray3D<_TItem_>.Create( const ItemsX_,ItemsY_,ItemsZ_:Integer );
510
Create( ItemsX_, ItemsY_, ItemsZ_, 0 );
513
constructor TArray3D<_TItem_>.Create( const ItemsX_,ItemsY_,ItemsZ_,Margs_:Integer );
515
Create( ItemsX_, ItemsY_, ItemsZ_, Margs_, Margs_, Margs_ );
518
constructor TArray3D<_TItem_>.Create( const ItemsX_,ItemsY_,ItemsZ_,MargsX_,MargsY_,MargsZ_:Integer );
520
inherited Create( ItemsX_, ItemsY_, MargsX_, MargsY_ );
526
destructor TArray3D<_TItem_>.Destroy;
532
/////////////////////////////////////////////////////////////////////// メソッド
534
procedure TArray3D<_TItem_>.Read( const Stream_:TStream );
536
Stream_.Read( _Elems[ 0 ], GetElemsByte );
539
procedure TArray3D<_TItem_>.Write( const Stream_:TStream );
541
Stream_.Write( _Elems[ 0 ], GetElemsByte );
544
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellArray3D<_TItem_>
546
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
548
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
550
/////////////////////////////////////////////////////////////////////// アクセス
552
function TCellArray3D<_TItem_>.GetPoinsX :Integer;
554
Result := CellsX + 1;
557
procedure TCellArray3D<_TItem_>.SetPoinsX( const PoinX_:Integer );
559
CellsX := PoinX_ - 1;
562
function TCellArray3D<_TItem_>.GetPoinsY :Integer;
564
Result := CellsY + 1;
567
procedure TCellArray3D<_TItem_>.SetPoinsY( const PoinY_:Integer );
569
CellsY := PoinY_ - 1;
572
function TCellArray3D<_TItem_>.GetPoinsZ :Integer;
574
Result := CellsZ + 1;
577
procedure TCellArray3D<_TItem_>.SetPoinsZ( const PoinZ_:Integer );
579
CellsY := PoinZ_ - 1;
582
//------------------------------------------------------------------------------
584
procedure TCellArray3D<_TItem_>.MakeEdgePerio;
586
MX, MY, MZ, NX, NY, NZ, HX, HY, HZ, X, Y, Z :Integer;
590
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
591
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
592
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2
594
MX := _MargsX; NX := _ItemsX; HX := _ItemsX-1;
595
MY := _MargsY; NY := _ItemsY; HY := _ItemsY-1;
596
MZ := _MargsZ; NZ := _ItemsZ; HZ := _ItemsZ-1;
602
for X := 00-MX to 00-01 do Items[ X, Y, Z ] := Items[ X + NX, Y, Z ];
603
for X := HX+01 to HX+MX do Items[ X, Y, Z ] := Items[ X - NX, Y, Z ];
606
for X := 00-MX to HX+MX do
608
for Y := 00-MY to 00-01 do Items[ X, Y, Z ] := Items[ X, Y + NY, Z ];
609
for Y := HY+01 to HY+MY do Items[ X, Y, Z ] := Items[ X, Y - NY, Z ];
613
for Y := 00-MY to HY+MY do
614
for X := 00-MX to HX+MX do
616
for Z := 00-MZ to 00-01 do Items[ X, Y, Z ] := Items[ X, Y, Z + NZ ];
617
for Z := HZ+01 to HZ+MZ do Items[ X, Y, Z ] := Items[ X, Y, Z - NZ ];
621
procedure TCellArray3D<_TItem_>.MakeEdgeMirro;
623
MX, MY, MZ, NX, NY, NZ, HX, HY, HZ, X, Y, Z :Integer;
627
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8
628
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
629
// +2 +1 00 ・ ・ ・ ・ ・ ・ +5 +4 +3 }
631
MX := _MargsX; NX := _ItemsX; HX := _ItemsX-1;
632
MY := _MargsY; NY := _ItemsY; HY := _ItemsY-1;
633
MZ := _MargsZ; NZ := _ItemsZ; HZ := _ItemsZ-1;
639
for X := 00-MX to 00-01 do Items[ X, Y, Z ] := Items[ 00 - X - 01, Y, Z ];
640
for X := HX+01 to HX+MX do Items[ X, Y, Z ] := Items[ HX - X + NX, Y, Z ];
643
for X := 00-MX to HX+MX do
645
for Y := 00-MY to 00-01 do Items[ X, Y, Z ] := Items[ X, 00 - Y - 01, Z ];
646
for Y := HY+01 to HY+MY do Items[ X, Y, Z ] := Items[ X, HY - Y + NY, Z ];
650
for Y := 00-MY to HY+MY do
651
for X := 00-MX to HX+MX do
653
for Z := 00-MZ to 00-01 do Items[ X, Y, Z ] := Items[ X, Y, 00 - Z - 01 ];
654
for Z := HZ+01 to HZ+MZ do Items[ X, Y, Z ] := Items[ X, Y, HZ - Z + NZ ];
658
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
660
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TPoinArray3D<_TItem_>
662
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
664
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
666
/////////////////////////////////////////////////////////////////////// アクセス
668
function TPoinArray3D<_TItem_>.GetCellsX :Integer;
670
Result := _ItemsX - 1;
673
procedure TPoinArray3D<_TItem_>.SetCellsX( const CellsX_:Integer );
675
_ItemsX := CellsX_ + 1; MakeArray;
678
function TPoinArray3D<_TItem_>.GetCellsY :Integer;
680
Result := _ItemsY - 1;
683
procedure TPoinArray3D<_TItem_>.SetCellsY( const CellsY_:Integer );
685
_ItemsY := CellsY_ + 1; MakeArray;
688
function TPoinArray3D<_TItem_>.GetCellsZ :Integer;
690
Result := _ItemsZ - 1;
693
procedure TPoinArray3D<_TItem_>.SetCellsZ( const CellsZ_:Integer );
695
_ItemsZ := CellsZ_ + 1; MakeArray;
698
function TPoinArray3D<_TItem_>.GetCellsN :Integer;
700
Result := CellsZ * CellsY * CellsX;
703
/////////////////////////////////////////////////////////////////////// メソッド
705
function TPoinArray3D<_TItem_>.NewCellIter :TCellIterPoinArray3D<_TItem_>;
707
Result := TCellIterPoinArray3D<_TItem_>.Create( Self );
710
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
712
constructor TPoinArray3D<_TItem_>.Create( const CellsX_,CellsY_,CellsZ_,MargsX_,MargsY_,MargsZ_:Integer );
714
inherited Create( CellsX_+1, CellsY_+1, CellsZ_+1,
715
MargsX_ , MargsY_ , MargsZ_ );
719
destructor TPoinArray3D<_TItem_>.Destroy;
725
/////////////////////////////////////////////////////////////////////// メソッド
727
procedure TPoinArray3D<_TItem_>.Read( const Stream_:TStream );
733
Read( S, SizeOf( TCardinal3D ) );
734
Read( M, SizeOf( TCardinal3D ) );
748
procedure TPoinArray3D<_TItem_>.Write( const Stream_:TStream );
768
Write( S, SizeOf( TCardinal3D ) );
769
Write( M, SizeOf( TCardinal3D ) );
775
//------------------------------------------------------------------------------
777
procedure TPoinArray3D<_TItem_>.ForCells( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
779
B :TCellIterPoinArray3D<_TItem_>;
783
B.ForCells( procedure begin Proc_( B ); end );
788
procedure TPoinArray3D<_TItem_>.ForEdgesX( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
790
E :TCellIterPoinArray3D<_TItem_>;
794
E.ForEdgesX( procedure begin Proc_( E ); end );
799
procedure TPoinArray3D<_TItem_>.ForEdgesY( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
801
E :TCellIterPoinArray3D<_TItem_>;
805
E.ForEdgesY( procedure begin Proc_( E ); end );
810
procedure TPoinArray3D<_TItem_>.ForEdgesZ( const Proc_:TConstProc<TCellIterPoinArray3D<_TItem_>> );
812
E :TCellIterPoinArray3D<_TItem_>;
816
E.ForEdgesZ( procedure begin Proc_( E ); end );
821
//------------------------------------------------------------------------------
823
procedure TPoinArray3D<_TItem_>.MakeEdgePerio;
825
MX, MY, MZ, HX, HY, HZ, X, Y, Z :Integer;
829
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
830
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
831
// +3 +4 +5 ・ ・ ・ ・ ・ ・ 00 +1 +2 +3
833
MX := _MargsX; HX := _ItemsX-1;
834
MY := _MargsX; HY := _ItemsX-1;
835
MZ := _MargsZ; HZ := _ItemsZ-1;
841
for X := 00-MX to 00-01 do Items[ X, Y, Z ] := Items[ X + HX, Y, Z ];
842
for X := HX+00 to HX+MX do Items[ X, Y, Z ] := Items[ X - HX, Y, Z ];
845
for X := 00-MX to HX+MX do
847
for Y := 00-MY to 00-01 do Items[ X, Y, Z ] := Items[ X, Y + HY, Z ];
848
for Y := HY+00 to HY+MY do Items[ X, Y, Z ] := Items[ X, Y - HY, Z ];
852
for Y := 00-MY to HY+MY do
853
for X := 00-MX to HX+MX do
855
for Z := 00-MZ to 00-01 do Items[ X, Y, Z ] := Items[ X, Y, Z + HZ ];
856
for Z := HZ+00 to HZ+MZ do Items[ X, Y, Z ] := Items[ X, Y, Z - HZ ];
860
procedure TPoinArray3D<_TItem_>.MakeEdgeMirro;
862
MX, MY, MZ, HX, HY, HZ, X, Y, Z :Integer;
866
// -3 -2 -1 00 +1 +2 +3 +4 +5 +6 +7 +8 +9
867
// ┠─╂─╂─┣━╋━╋━╋━╋━╋━┫─╂─╂─┨
868
// +3 +2 +1 ・ ・ ・ ・ ・ ・ ・ +5 +4 +3
870
MX := _MargsX; HX := _ItemsX-1;
871
MY := _MargsX; HY := _ItemsX-1;
872
MZ := _MargsZ; HZ := _ItemsZ-1;
878
for X := 00-MX to 00-01 do Items[ X, Y, Z ] := Items[ -X , Y, Z ];
879
for X := HX+01 to HX+MX do Items[ X, Y, Z ] := Items[ -X + 2*HX, Y, Z ];
882
for X := 00-MX to HX+MX do
884
for Y := 00-MY to 00-01 do Items[ X, Y, Z ] := Items[ X, -Y , Z ];
885
for Y := HY+01 to HY+MY do Items[ X, Y, Z ] := Items[ X, -Y + 2*HY, Z ];
889
for Y := 00-MY to HY+MY do
890
for X := 00-MX to HX+MX do
892
for Z := 00-MZ to 00-01 do Items[ X, Y, Z ] := Items[ X, Y, -Z ];
893
for Z := HZ+01 to HZ+MZ do Items[ X, Y, Z ] := Items[ X, Y, -Z + 2*HZ ];
897
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TCellIterPoinArray3D<_TItem_>
899
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
901
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
903
/////////////////////////////////////////////////////////////////////// アクセス
905
function TCellIterPoinArray3D<_TItem_>.GetPosX :Integer;
910
procedure TCellIterPoinArray3D<_TItem_>.SetPosX( const PosX_:Integer );
916
_GX[ X ] := PosX_ + X;
922
_Poins[ Z, Y, X ] := _HeadY[ Z, Y ];
924
Inc( _Poins[ Z, Y, X ], _GX[ X ] * _Paren.CounStepX );
930
function TCellIterPoinArray3D<_TItem_>.GetPosY :Integer;
935
procedure TCellIterPoinArray3D<_TItem_>.SetPosY( const PosY_:Integer );
941
_GY[ Y ] := PosY_ + Y;
945
_HeadY[ Z, Y ] := _HeadZ[ Z ];
947
Inc( _HeadY[ Z, Y ], _GY[ Y ] * _Paren.CounStepY );
952
function TCellIterPoinArray3D<_TItem_>.GetPosZ :Integer;
957
procedure TCellIterPoinArray3D<_TItem_>.SetPosZ( const PosZ_:Integer );
963
_GZ[ Z ] := PosZ_ + Z;
965
_HeadZ[ Z ] := _Paren.Item0P;
967
Inc( _HeadZ[ Z ], _GZ[ Z ] * _Paren.CounStepZ );
971
//------------------------------------------------------------------------------
973
function TCellIterPoinArray3D<_TItem_>.GetPos :TInteger3D;
975
Result := TInteger3D.Create( PosX, PosY, PosZ );
978
procedure TCellIterPoinArray3D<_TItem_>.SetPos( const Pos_:TInteger3D );
988
//------------------------------------------------------------------------------
990
function TCellIterPoinArray3D<_TItem_>.GetPoins( const X_,Y_,Z_:Shortint ) :_TItem_;
992
Result := _Poins[ Z_, Y_, X_ ]^;
995
procedure TCellIterPoinArray3D<_TItem_>.SetPoins( const X_,Y_,Z_:Shortint; const Item_:_TItem_ );
997
_Poins[ Z_, Y_, X_ ]^ := Item_;
1000
//------------------------------------------------------------------------------
1002
function TCellIterPoinArray3D<_TItem_>.GetGiX( const I_:Shortint ) :Integer;
1004
Result := _GX[ I_ ];
1007
function TCellIterPoinArray3D<_TItem_>.GetGiY( const I_:Shortint ) :Integer;
1009
Result := _GY[ I_ ];
1012
function TCellIterPoinArray3D<_TItem_>.GetGiZ( const I_:Shortint ) :Integer;
1014
Result := _GZ[ I_ ];
1017
function TCellIterPoinArray3D<_TItem_>.GetGi( const X_,Y_,Z_:Shortint ) :TInteger3D;
1027
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
1029
constructor TCellIterPoinArray3D<_TItem_>.Create( const Array_:TPoinArray3D<_TItem_> );
1035
Pos := TInteger3D.Create( 0, 0, 0 );
1038
destructor TCellIterPoinArray3D<_TItem_>.Destroy;
1044
/////////////////////////////////////////////////////////////////////// メソッド
1046
procedure TCellIterPoinArray3D<_TItem_>.GoPrevX;
1050
Move( _GX[ -1 ], _GX[ 0 ], 3 * SizeOf( Integer ) ); Dec( _GX[ -1 ] );
1052
for Z := -1 to +2 do
1054
for Y := -1 to +2 do
1056
Move( _Poins[ Z, Y, -1 ], _Poins[ Z, Y, 0 ], 3 * SizeOf( _PItem_ ) );
1058
Dec( _Poins[ Z, Y, -1 ], _Paren.CounStepX );
1063
procedure TCellIterPoinArray3D<_TItem_>.GoNextX;
1067
Move( _GX[ 0 ], _GX[ -1 ], 3 * SizeOf( Integer ) ); Inc( _GX[ +2 ] );
1069
for Z := -1 to +2 do
1071
for Y := -1 to +2 do
1073
Move( _Poins[ Z, Y, 0 ], _Poins[ Z, Y, -1 ], 3 * SizeOf( _PItem_ ) );
1075
Inc( _Poins[ Z, Y, +2 ], _Paren.CounStepX );
1080
//------------------------------------------------------------------------------
1082
procedure TCellIterPoinArray3D<_TItem_>.GoPrevY;
1086
Move( _GY[ -1 ], _GY[ 0 ], 3 * SizeOf( Integer ) ); Dec( _GY[ -1 ] );
1088
for Z := -1 to +2 do
1090
Move( _HeadY[ Z, -1 ], _HeadY[ Z, 0 ], 3 * SizeOf( _PItem_ ) ); Dec( _HeadY[ Z, -1 ], _Paren.CounStepY );
1092
Move( _Poins[ Z, -1 ], _Poins[ Z, 0 ], 12 * SizeOf( _PItem_ ) );
1094
for X := -1 to +2 do Dec( _Poins[ Z, -1, X ], _Paren.CounStepY );
1098
procedure TCellIterPoinArray3D<_TItem_>.GoNextY;
1102
Move( _GY[ 0 ], _GY[ -1 ], 3 * SizeOf( Integer ) ); Inc( _GY[ +2 ] );
1104
for Z := -1 to +2 do
1106
Move( _HeadY[ Z, 0 ], _HeadY[ Z, -1 ], 3 * SizeOf( _PItem_ ) ); Inc( _HeadY[ Z, +2 ], _Paren.CounStepY );
1108
Move( _Poins[ Z, 0 ], _Poins[ Z, -1 ], 12 * SizeOf( _PItem_ ) );
1110
for X := -1 to +2 do Inc( _Poins[ Z, +2, X ], _Paren.CounStepY );
1114
//------------------------------------------------------------------------------
1116
procedure TCellIterPoinArray3D<_TItem_>.GoPrevZ;
1120
Move( _GZ[ -1 ], _GZ[ 0 ], 3 * SizeOf( Integer ) ); Dec( _GZ[ -1 ] );
1122
Move( _HeadZ[ -1 ], _HeadZ[ 0 ], 3 * SizeOf( _PItem_ ) ); Dec( _HeadZ[ -1 ], _Paren.CounStepZ );
1124
Move( _Poins[ -1 ], _Poins[ 0 ], 48 * SizeOf( _PItem_ ) );
1126
for Y := -1 to +2 do
1128
for X := -1 to +2 do Dec( _Poins[ -1, Y, X ], _Paren.CounStepZ );
1132
procedure TCellIterPoinArray3D<_TItem_>.GoNextZ;
1136
Move( _GZ[ 0 ], _GZ[ -1 ], 3 * SizeOf( Integer ) ); Inc( _GZ[ +2 ] );
1138
Move( _HeadZ[ 0 ], _HeadZ[ -1 ], 3 * SizeOf( _PItem_ ) ); Inc( _HeadZ[ +2 ], _Paren.CounStepZ );
1140
Move( _Poins[ 0 ], _Poins[ -1 ], 48 * SizeOf( _PItem_ ) );
1142
for Y := -1 to +2 do
1144
for X := -1 to +2 do
1146
Inc( _Poins[ +2, Y, X ], _Paren.CounStepZ );
1151
//------------------------------------------------------------------------------
1153
procedure TCellIterPoinArray3D<_TItem_>.GoPrevX( const N_:Integer );
1157
for N := 1 to N_ do GoPrevX;
1160
procedure TCellIterPoinArray3D<_TItem_>.GoNextX( const N_:Integer );
1164
for N := 1 to N_ do GoNextX;
1167
procedure TCellIterPoinArray3D<_TItem_>.GoPrevY( const N_:Integer );
1171
for N := 1 to N_ do GoPrevY;
1174
procedure TCellIterPoinArray3D<_TItem_>.GoNextY( const N_:Integer );
1178
for N := 1 to N_ do GoNextY;
1181
procedure TCellIterPoinArray3D<_TItem_>.GoPrevZ( const N_:Integer );
1185
for N := 1 to N_ do GoPrevZ;
1188
procedure TCellIterPoinArray3D<_TItem_>.GoNextZ( const N_:Integer );
1192
for N := 1 to N_ do GoNextZ;
1195
//------------------------------------------------------------------------------
1197
function TCellIterPoinArray3D<_TItem_>.Interp( const Xd_,Yd_,Zd_:Single ) :_TItem_;
1199
Result := Poins[ Round( Xd_ ), Round( Yd_ ), Round( Zd_ ) ];
1202
function TCellIterPoinArray3D<_TItem_>.AbsoInterp( const X_,Y_,Z_:Single ) :_TItem_;
1206
PosZ := Floor( Z_ ); Zd := Z_ - PosZ;
1207
PosY := Floor( Y_ ); Yd := Y_ - PosY;
1208
PosX := Floor( X_ ); Xd := X_ - PosX;
1210
Result := Interp( Xd, Yd, Zd );
1213
//------------------------------------------------------------------------------
1215
procedure TCellIterPoinArray3D<_TItem_>.ForCells( const Proc_:TProc );
1220
for Z := 1 to _Paren.CellsZ do
1223
for Y := 1 to _Paren.CellsY do
1226
for X := 1 to _Paren.CellsX do
1238
procedure TCellIterPoinArray3D<_TItem_>.ForEdgesX( const Proc_:TProc );
1243
for Z := 0 to _Paren.CellsZ do
1246
for Y := 0 to _Paren.CellsY do
1249
for X := 1 to _Paren.CellsX do
1261
procedure TCellIterPoinArray3D<_TItem_>.ForEdgesY( const Proc_:TProc );
1266
for Z := 0 to _Paren.CellsZ do
1269
for Y := 1 to _Paren.CellsY do
1272
for X := 0 to _Paren.CellsX do
1284
procedure TCellIterPoinArray3D<_TItem_>.ForEdgesZ( const Proc_:TProc );
1289
for Z := 1 to _Paren.CellsZ do
1292
for Y := 0 to _Paren.CellsY do
1295
for X := 0 to _Paren.CellsX do
1307
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
1309
//############################################################################## □
1311
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
1313
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
1315
end. //######################################################################### ■