Luxophia

Форк
0
/
LUX.Data.Lattice.T3.D3.pas 
217 строк · 8.0 Кб
1
unit LUX.Data.Lattice.T3.D3;
2

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

5
uses System.SysUtils, System.Classes,
6
     LUX, LUX.D1, LUX.D3, LUX.Data.Lattice.T3;
7

8
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
9

10
     TSingleBricArray3D         = class;
11
     TSingleGridArray3D         = class;
12
     TSingleBricIterGridArray3D = class;
13

14
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
15

16
     //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
17

18
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricArray3D
19

20
     ISingleBricArray3D = interface( IBricArray3D )
21
     ['{07DD7FC2-8BD0-4D64-86E5-7FFDE4CF7CA3}']
22
     {protected}
23
     {public}
24
     end;
25

26
     //-------------------------------------------------------------------------
27

28
     TSingleBricArray3D = class( TBricArray3D<Single>, ISingleBricArray3D )
29
     private
30
     protected
31
     public
32
     end;
33

34
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleGridArray3D
35

36
     ISingleGridArray3D = interface( IGridArray3D )
37
     ['{9E07E15D-0E29-4541-A755-53BABC4AC560}']
38
     {protected}
39
     {public}
40
     end;
41

42
     //-------------------------------------------------------------------------
43

44
     TSingleGridArray3D = class( TGridArray3D<Single>, ISingleGridArray3D )
45
     private
46
     protected
47
     public
48
       ///// メソッド
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> );
53
     end;
54

55
     //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricIterGridArray3D
56

57
     ISingleBricIterGridArray3D = interface( IBricIterGridArray3D<Single> )
58
     ['{1FA11B62-B22A-4966-815F-48EF06FDBF3B}']
59
     {protected}
60
     {public}
61
     end;
62

63
     //-------------------------------------------------------------------------
64

65
     TSingleBricIterGridArray3D = class( TBricIterGridArray3D<Single>, ISingleBricIterGridArray3D )
66
     private
67
     protected
68
     public
69
       ///// メソッド
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;
74
     end;
75

76
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
77

78
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
79

80
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
81

82
implementation //############################################################### ■
83

84
uses System.Math;
85

86
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
87

88
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
89

90
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricArray3D
91

92
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
93

94
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
95

96
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
97

98
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleGridArray3D
99

100
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
101

102
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
103

104
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
105

106
/////////////////////////////////////////////////////////////////////// メソッド
107

108
procedure TSingleGridArray3D.ForBrics( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
109
begin
110
     inherited ForBrics( procedure( const B_:TBricIterGridArray3D<Single> )
111
     begin
112
          Proc_( B_ as TSingleBricIterGridArray3D );
113
     end );
114
end;
115

116
procedure TSingleGridArray3D.ForEdgesX( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
117
begin
118
     inherited ForEdgesX( procedure( const E_:TBricIterGridArray3D<Single> )
119
     begin
120
          Proc_( E_ as TSingleBricIterGridArray3D );
121
     end );
122
end;
123

124
procedure TSingleGridArray3D.ForEdgesY( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
125
begin
126
     inherited ForEdgesY( procedure( const E_:TBricIterGridArray3D<Single> )
127
     begin
128
          Proc_( E_ as TSingleBricIterGridArray3D );
129
     end );
130
end;
131

132
procedure TSingleGridArray3D.ForEdgesZ( const Proc_:TConstProc<TSingleBricIterGridArray3D> );
133
begin
134
     inherited ForEdgesZ( procedure( const E_:TBricIterGridArray3D<Single> )
135
     begin
136
          Proc_( E_ as TSingleBricIterGridArray3D );
137
     end );
138
end;
139

140
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TSingleBricIterGridArray3D
141

142
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
143

144
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
145

146
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
147

148
/////////////////////////////////////////////////////////////////////// メソッド
149

150
function TSingleBricIterGridArray3D.Interp( const Xd_,Yd_,Zd_:Single ) :Single;
151
var
152
   Y00, Y01, Y10, Y11, Z0, Z1 :Single;
153
begin
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 ];
158

159
     Z0 := ( Y01 - Y00 ) * Yd_ + Y00;
160
     Z1 := ( Y11 - Y10 ) * Yd_ + Y10;
161

162
     Result := ( Z1 - Z0 ) * Zd_ + Z0;
163
end;
164

165
//------------------------------------------------------------------------------
166

167
function TSingleBricIterGridArray3D.FracGrad( const Xd_,Yd_,Zd_:Single ) :TSingle3D;
168
//······································
169
     function GetInterp( const X,Y,Z:Shortint ) :Single;
170
     var
171
        Y00, Y01, Y10, Y11, Z0, Z1 :Single;
172
     begin
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 ];
177

178
          Z0 := ( Y01 - Y00 ) * Yd_ + Y00;
179
          Z1 := ( Y11 - Y10 ) * Yd_ + Y10;
180

181
          Result := ( Z1 - Z0 ) * Zd_ + Z0;
182
     end;
183
//······································
184
begin
185
     with Result do
186
     begin
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;
190
     end;
191
end;
192

193
function TSingleBricIterGridArray3D.Grad( const d_:TSingle3D ) :TSingle3D;
194
begin
195
     Result := FracGrad( d_.X, d_.Y, d_.Z );
196
end;
197

198
function TSingleBricIterGridArray3D.AbsoGrad( const X_,Y_,Z_:Single ) :TSingle3D;
199
var
200
   Xd, Yd, Zd :Single;
201
begin
202
     PosZ := Floor( Z_ );  Zd := Z_ - PosZ;
203
     PosY := Floor( Y_ );  Yd := Y_ - PosY;
204
     PosX := Floor( X_ );  Xd := X_ - PosX;
205

206
     Result := FracGrad( Xd, Yd, Zd );
207
end;
208

209
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
210

211
//############################################################################## □
212

213
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
214

215
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
216

217
end. //######################################################################### ■
218

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

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

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

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