1
unit LUX.Brep.Cell.TetraFlip.D3.FMX;
3
interface //#################################################################### ■
5
uses System.Classes, System.Math.Vectors,
6
FMX.Types, FMX.Types3D, FMX.Controls3D, FMX.MaterialSources,
7
LUX, LUX.D3, LUX.Geometry.D3, LUX.Brep.Cell.TetraFlip, LUX.Brep.Cell.TetraFlip.D3;
9
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
11
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
13
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
15
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TEdges
17
TEdges = class( TControl3D )
21
_Material :TMaterialSource;
22
_TetraModel :TTetraModel3D;
25
procedure SetTetraModel( const TetraModel_:TTetraModel3D );
26
procedure SetEdgeRadius( const EdgeRadius_:Single );
28
procedure Render; override;
29
procedure MakeMesh( const Ps_:array of TSingle3D );
31
constructor Create( AOwner_:TComponent ); override;
32
destructor Destroy; override;
34
property Geometry :TMeshData read _Geometry ;
35
property Material :TMaterialSource read _Material write _Material ;
36
property TetraModel :TTetraModel3D read _TetraModel write SetTetraModel;
37
property EdgeRadius :Single read _EdgeRadius write SetEdgeRadius;
39
procedure MakeModel; virtual; abstract;
42
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDelaEdges
44
TDelaEdges = class( TEdges )
49
procedure MakeModel; override;
52
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TVoroEdges
54
TVoroEdges = class( TEdges )
59
procedure SetEdgeLength( const EdgeLength_:Single );
61
constructor Create( AOwner_:TComponent ); override;
63
property EdgeLength :Single read _EdgeLength write SetEdgeLength;
65
procedure MakeModel; override;
68
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
70
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
72
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
74
implementation //############################################################### ■
76
uses System.SysUtils, System.RTLConsts;
78
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
80
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
82
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TEdges
84
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
86
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
88
/////////////////////////////////////////////////////////////////////// アクセス
90
procedure TEdges.SetTetraModel( const TetraModel_:TTetraModel3D );
92
_TetraModel := TetraModel_; MakeModel;
95
procedure TEdges.SetEdgeRadius( const EdgeRadius_:Single );
97
_EdgeRadius := EdgeRadius_; MakeModel;
100
/////////////////////////////////////////////////////////////////////// メソッド
102
procedure TEdges.Render;
104
Context.SetMatrix( AbsoluteMatrix );
106
_Geometry.Render( Context, TMaterialSource.ValidMaterial( _Material ), AbsoluteOpacity );
109
procedure TEdges.MakeMesh( const Ps_:array of TSingle3D );
121
for I := 0 to Length-1 do Vertices[ I ] := Ps_[ I ];
128
for I := 0 to Length-1 do Indices[ I ] := I;
135
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
137
constructor TEdges.Create( AOwner_:TComponent );
143
_Geometry := TMeshData.Create;
146
destructor TEdges.Destroy;
153
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TDelaEdges
155
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
157
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
159
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
161
/////////////////////////////////////////////////////////////////////// メソッド
163
procedure TDelaEdges.MakeModel;
165
Ps :array of TSingle3D;
167
C0, C1 :TTetraCell3D;
172
C312, C123, C231 :TSingle3D;
177
for I0 := 0 to _TetraModel.ChildsN-1 do
179
C0 := _TetraModel[ I0 ];
185
with _VertTable[ K ] do
187
T0.P0 := C0.Poin[ _[ 0 ] ].Pos;
188
T0.P1 := C0.Poin[ _[ 1 ] ].Pos;
189
T0.P2 := C0.Poin[ _[ 2 ] ].Pos;
190
T0.P3 := C0.Poin[ _[ 3 ] ].Pos;
193
T0.C102 := MarginCorner( T0.P0, T0.P1, T0.P2, _EdgeRadius );
194
T0.C203 := MarginCorner( T0.P0, T0.P2, T0.P3, _EdgeRadius );
195
T0.P301 := MarginCorner( T0.P0, T0.P3, T0.P1, _EdgeRadius );
197
T0.C021 := MarginCorner( T0.P2, T0.P0, T0.P1, _EdgeRadius );
198
T0.C032 := MarginCorner( T0.P3, T0.P0, T0.P2, _EdgeRadius );
199
T0.C013 := MarginCorner( T0.P1, T0.P0, T0.P3, _EdgeRadius );
201
Ps := Ps + [ T0.C021, T0.C102, T0.C203,
202
T0.C032, T0.C203, T0.P301,
203
T0.C013, T0.P301, T0.C102,
204
T0.C102, T0.P301, T0.C203 ];
208
if not ( Assigned( C1 ) and Assigned( C1.Poin[ C0.Vert[ K ] ] ) ) then
210
T0.C312 := MarginCorner( T0.P1, T0.P3, T0.P2, _EdgeRadius );
211
T0.C123 := MarginCorner( T0.P2, T0.P1, T0.P3, _EdgeRadius );
212
T0.C231 := MarginCorner( T0.P3, T0.P2, T0.P1, _EdgeRadius );
214
Ps := Ps + [ T0.P2 , T0.P1 , T0.C312,
215
T0.C312, T0.C123, T0.P2 ,
216
T0.P3 , T0.P2 , T0.C123,
217
T0.C123, T0.C231, T0.P3 ,
218
T0.P1 , T0.P3 , T0.C231,
219
T0.C231, T0.C312, T0.P1 ];
228
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TVoroEdges
230
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
232
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
234
/////////////////////////////////////////////////////////////////////// アクセス
236
procedure TVoroEdges.SetEdgeLength( const EdgeLength_:Single );
238
_EdgeLength := EdgeLength_; MakeModel;
241
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
243
constructor TVoroEdges.Create( AOwner_:TComponent );
250
/////////////////////////////////////////////////////////////////////// メソッド
252
procedure TVoroEdges.MakeModel;
254
Ps :array of TSingle3D;
256
C0, C1 :TTetraCell3D;
261
C23, C31, C13 :TSingle3D;
266
C01, C02, C03 :TSingle3D;
271
for I0 := 0 to _TetraModel.ChildsN-1 do
273
C0 := _TetraModel[ I0 ];
277
T0.S := C0.CircumCenter;
281
with _VertTable[ K ] do
283
T0.V0 := C0.VoroEdge[ _[ 0 ] ];
284
T0.V1 := C0.VoroEdge[ _[ 1 ] ];
285
T0.V2 := C0.VoroEdge[ _[ 2 ] ];
286
T0.V3 := C0.VoroEdge[ _[ 3 ] ];
289
T0.C23 := T0.S + MarginCorner( T0.V2, T0.V3, _EdgeRadius );
290
T0.C31 := T0.S + MarginCorner( T0.V3, T0.V1, _EdgeRadius );
291
T0.C13 := T0.S + MarginCorner( T0.V1, T0.V2, _EdgeRadius );
293
Ps := Ps + [ T0.C23, T0.C31, T0.C13 ];
295
T0.C01 := T0.S + MarginCorner( T0.V0, T0.V1, _EdgeRadius );
296
T0.C02 := T0.S + MarginCorner( T0.V0, T0.V2, _EdgeRadius );
297
T0.C03 := T0.S + MarginCorner( T0.V0, T0.V3, _EdgeRadius );
301
if Assigned( C1 ) and Assigned( C1.Poin[ C0.Vert[ K ] ] ) then
303
T1.S := C1.CircumCenter;
305
T1.V0 := C1.VoroEdge[ C0.Join[ K, 0 ] ];
306
T1.V1 := C1.VoroEdge[ C0.Join[ K, 1 ] ];
307
T1.V2 := C1.VoroEdge[ C0.Join[ K, 2 ] ];
308
T1.V3 := C1.VoroEdge[ C0.Join[ K, 3 ] ];
310
T1.C01 := T1.S + MarginCorner( T1.V0, T1.V1, _EdgeRadius );
311
T1.C02 := T1.S + MarginCorner( T1.V0, T1.V2, _EdgeRadius );
312
T1.C03 := T1.S + MarginCorner( T1.V0, T1.V3, _EdgeRadius );
314
Ps := Ps + [ T1.C01, T0.C01, T0.C03,
315
T1.C02, T0.C02, T0.C01,
316
T1.C03, T0.C03, T0.C02 ];
320
T1.S := T0.S + _EdgeLength * T0.V0;
322
Ps := Ps + [ T1.S, T0.C01, T0.C03,
323
T1.S, T0.C02, T0.C01,
324
T1.S, T0.C03, T0.C02 ];
333
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
335
//############################################################################## □
337
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
339
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
341
end. //######################################################################### ■