1
unit LUX.Data.Lattice.T3.D3;
3
interface //#################################################################### ■
5
uses System.SysUtils, System.Classes,
6
LUX, LUX.D1, LUX.D3, LUX.Data.Lattice.T3;
8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
10
TSingleBricArray3D = class;
11
TSingleGridArray3D = class;
12
TSingleBricIterGridArray3D = class;
14
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
16
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
18
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricArray3D
20
ISingleBricArray3D = interface( IBricArray3D )
21
['{07DD7FC2-8BD0-4D64-86E5-7FFDE4CF7CA3}']
26
//-------------------------------------------------------------------------
28
TSingleBricArray3D = class( TBricArray3D<Single>, ISingleBricArray3D )
34
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleGridArray3D
36
ISingleGridArray3D = interface( IGridArray3D )
37
['{9E07E15D-0E29-4541-A755-53BABC4AC560}']
42
//-------------------------------------------------------------------------
44
TSingleGridArray3D = class( TGridArray3D<Single>, ISingleGridArray3D )
49
procedure ForBrics( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
50
procedure ForEdgesX( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
51
procedure ForEdgesY( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
52
procedure ForEdgesZ( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
55
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricIterGridArray3D
57
ISingleBricIterGridArray3D = interface( IBricIterGridArray3D<Single> )
58
['{1FA11B62-B22A-4966-815F-48EF06FDBF3B}']
63
//-------------------------------------------------------------------------
65
TSingleBricIterGridArray3D = class( TBricIterGridArray3D<Single>, ISingleBricIterGridArray3D )
70
function Interp( const Xd_,Yd_,Zd_:Single ) :Single; override;
71
function FracGrad( const Xd_,Yd_,Zd_:Single ) :TSingle3D; overload;
72
function Grad( const d_:TSingle3D ) :TSingle3D; overload;
73
function AbsoGrad( const X_,Y_,Z_:Single ) :TSingle3D;
76
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
78
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
80
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
82
implementation //############################################################### ■
86
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
88
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
90
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricArray3D
92
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
94
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
96
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
98
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleGridArray3D
100
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
102
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
104
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
106
/////////////////////////////////////////////////////////////////////// メソッド
108
procedure TSingleGridArray3D.ForBrics( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
110
inherited ForBrics( procedure( const B_:TBricIterGridArray3D<Single> )
112
Proc_( B_ as TSingleBricIterGridArray3D );
116
procedure TSingleGridArray3D.ForEdgesX( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
118
inherited ForEdgesX( procedure( const E_:TBricIterGridArray3D<Single> )
120
Proc_( E_ as TSingleBricIterGridArray3D );
124
procedure TSingleGridArray3D.ForEdgesY( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
126
inherited ForEdgesY( procedure( const E_:TBricIterGridArray3D<Single> )
128
Proc_( E_ as TSingleBricIterGridArray3D );
132
procedure TSingleGridArray3D.ForEdgesZ( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
134
inherited ForEdgesZ( procedure( const E_:TBricIterGridArray3D<Single> )
136
Proc_( E_ as TSingleBricIterGridArray3D );
140
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricIterGridArray3D
142
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
144
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
146
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
148
/////////////////////////////////////////////////////////////////////// メソッド
150
function TSingleBricIterGridArray3D.Interp( const Xd_,Yd_,Zd_:Single ) :Single;
152
Y00, Y01, Y10, Y11, Z0, Z1 :Single;
154
Y00 := ( Grids[ 1, 0, 0 ] - Grids[ 0, 0, 0 ] ) * Xd_ + Grids[ 0, 0, 0 ];
155
Y01 := ( Grids[ 1, 1, 0 ] - Grids[ 0, 1, 0 ] ) * Xd_ + Grids[ 0, 1, 0 ];
156
Y10 := ( Grids[ 1, 0, 1 ] - Grids[ 0, 0, 1 ] ) * Xd_ + Grids[ 0, 0, 1 ];
157
Y11 := ( Grids[ 1, 1, 1 ] - Grids[ 0, 1, 1 ] ) * Xd_ + Grids[ 0, 1, 1 ];
159
Z0 := ( Y01 - Y00 ) * Yd_ + Y00;
160
Z1 := ( Y11 - Y10 ) * Yd_ + Y10;
162
Result := ( Z1 - Z0 ) * Zd_ + Z0;
165
//------------------------------------------------------------------------------
167
function TSingleBricIterGridArray3D.FracGrad( const Xd_,Yd_,Zd_:Single ) :TSingle3D;
168
//······································
169
function GetInterp( const X,Y,Z:Shortint ) :Single;
171
Y00, Y01, Y10, Y11, Z0, Z1 :Single;
173
Y00 := ( Grids[ X+1, Y+0, Z+0 ] - Grids[ X+0, Y+0, Z+0 ] ) * Xd_ + Grids[ X+0, Y+0, Z+0 ];
174
Y01 := ( Grids[ X+1, Y+1, Z+0 ] - Grids[ X+0, Y+1, Z+0 ] ) * Xd_ + Grids[ X+0, Y+1, Z+0 ];
175
Y10 := ( Grids[ X+1, Y+0, Z+1 ] - Grids[ X+0, Y+0, Z+1 ] ) * Xd_ + Grids[ X+0, Y+0, Z+1 ];
176
Y11 := ( Grids[ X+1, Y+1, Z+1 ] - Grids[ X+0, Y+1, Z+1 ] ) * Xd_ + Grids[ X+0, Y+1, Z+1 ];
178
Z0 := ( Y01 - Y00 ) * Yd_ + Y00;
179
Z1 := ( Y11 - Y10 ) * Yd_ + Y10;
181
Result := ( Z1 - Z0 ) * Zd_ + Z0;
183
//······································
187
X := ( GetInterp( +1, 0, 0 ) - GetInterp( -1, 0, 0 ) ) / 2;
188
Y := ( GetInterp( 0, +1, 0 ) - GetInterp( 0, -1, 0 ) ) / 2;
189
Z := ( GetInterp( 0, 0, +1 ) - GetInterp( 0, 0, -1 ) ) / 2;
193
function TSingleBricIterGridArray3D.Grad( const d_:TSingle3D ) :TSingle3D;
195
Result := FracGrad( d_.X, d_.Y, d_.Z );
198
function TSingleBricIterGridArray3D.AbsoGrad( const X_,Y_,Z_:Single ) :TSingle3D;
202
PosZ := Floor( Z_ ); Zd := Z_ - PosZ;
203
PosY := Floor( Y_ ); Yd := Y_ - PosY;
204
PosX := Floor( X_ ); Xd := X_ - PosX;
206
Result := FracGrad( Xd, Yd, Zd );
209
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
211
//############################################################################## □
213
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
215
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
217
end. //######################################################################### ■