Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : CubitOctree.hpp
3 : : //
4 : : // Purpose : Defines the grid node of the CubitOctree model
5 : : //
6 : : // Creator : William Roshan Quadros
7 : : //
8 : : // Creation Date : 01/01/2003
9 : : //
10 : : // Owner :
11 : : //-------------------------------------------------------------------------
12 : : #ifndef CUBITOCTREENODE_H
13 : : #define CUBITOCTREENODE_H
14 : : #include "CubitVector.hpp"
15 : : #include "DLIList.hpp"
16 : : #include "PriorityQueue.hpp"
17 : : #include <queue>
18 : : #include "CubitDefines.h"
19 : : //#include "MemoryManager.hpp"
20 : : #include "OctreeIntersectionData.hpp"
21 : : #include "CubitOctreeConstants.hpp"
22 : :
23 : : class RefFace;
24 : : class CubitOctree;
25 : : class CubitOctreeCell;
26 : : class CubitFacet;
27 : : class CubitOctreeNode;
28 : : class CubitOctreeGenerator;
29 : :
30 : :
31 : : class CubitOctreeNode{
32 : :
33 : : public:
34 : :
35 : : CubitOctreeNode( const CubitVector &cen, CubitOctreeCell *parent_cell, const int i, const int j, const int k );
36 : : CubitOctreeNode( const double &x, const double &y, const double &z );
37 : : void initialize_constructor( const double &x, const double &y, const double &z );
38 : : //- Constructor
39 : :
40 : : ~CubitOctreeNode();
41 : : //- Distructor
42 : :
43 : : void display( OctreeNodeConstant type = NODE_SIZE, float draw_size = -1 );
44 : : //- Displays the grid nodes
45 : :
46 : 0 : inline int get_color(){ return color; }
47 : : //- Returns color
48 : :
49 : 0 : inline void set_color (const int new_color) {color = new_color;}
50 : :
51 : 0 : inline int get_num(){ return num; }
52 : : //- Returns the serial number of the grid node
53 : :
54 : 0 : inline CubitVector& get_coord(){ return coord; }
55 : : //- Returns the cartesian coordinates
56 : :
57 : : double get_size( OctreeSourceEntityType type ) const;
58 : : //- Returns size of the node
59 : :
60 : : int id(){ return num; }
61 : :
62 : : void set_size( double s, int type );
63 : : //- Sets size at the node
64 : :
65 : : void set_adj_node( enum OctreePosition type, CubitOctreeNode *ptr_grid_node );
66 : : //- sets the adjacent nodes
67 : :
68 : : void set_adj_node_distance( enum OctreePosition type, int dist );
69 : : //- sets the adjacent nodes distance
70 : :
71 : : double manhattan_distance_adj_node( int index );
72 : : inline double manhattan_distance_adj_node( CubitOctreeNode *ptr_adj_node );
73 : :
74 : 0 : inline double get_distance(){ return distance; }
75 : :
76 : 0 : inline double x(){ return coord.x(); }
77 : 0 : inline double y(){ return coord.y(); }
78 : 0 : inline double z(){ return coord.z(); }
79 : : //- Returns cartesian co-ordinates
80 : :
81 : : inline void x( double value ){ coord.x( value ); }
82 : : inline void y( double value ){ coord.y( value ); }
83 : : inline void z( double value ){ coord.z( value ); }
84 : : //- Sets cartician co-ordinates of node
85 : :
86 : : CubitOctreeNode *get_adj_node( int num );
87 : : //- Returns one of the six adjacent nodes
88 : :
89 : : int get_adj_node_distance( enum OctreePosition type );
90 : : //- returns the distance with the adj node in the direction of type
91 : :
92 : : void append_list_item( CubitVector facet_normal );
93 : :
94 : : void calc_facet_patch_distance_normal(DLIList<OctreeIntersectionData*> &idatas, int num_use_idatas, double &patch_distance, CubitVector &patch_normal, CubitBoolean sort, CubitBoolean set_Refface);
95 : : void SAT_find_face_distance_average_normal ();
96 : :
97 : 0 : inline CubitOctreeCell* get_min_depth_cell(){ return minDepthCell; }
98 : : //- returns minimum depth cell
99 : :
100 : 0 : inline int get_cell_depth_difference(){ return cellDepthDifference; }
101 : :
102 : :
103 : : int get_counter();
104 : : //- uses static counter to number the cell
105 : :
106 : 0 : static inline void reset_counter() {mCounter = -1;}
107 : :
108 : 0 : inline void update_adj_cell( CubitOctreeCell *ptr_cell, int i, int j, int k )
109 : : {
110 : 0 : adjCell[i][j][k] = ptr_cell;
111 : 0 : }
112 : : //- updates the cell at i, j, k location
113 : :
114 : : int find_min_depth_cell_and_depth_difference( void );
115 : : //- finds the maximum depth adjacent cell and difference in adj cells' depth
116 : :
117 : : void calculate_size_based_on_cell_dimension( double bbox_dimension );
118 : : //- calculates size using 6 adj nodes distance
119 : :
120 : 0 : inline CubitOctreeCell *get_adj_cell( const int i, const int j, const int k ) { return adjCell[i][j][k]; }
121 : :
122 : : // MARK is used in establishing connection between skl point and grid nodes contained in it using DFS
123 : 0 : inline void set_mark( CubitBoolean type ){ mark = type; }
124 : 0 : inline CubitBoolean get_mark(){ return mark; }
125 : :
126 : 0 : inline void set_visit( CubitBoolean type ){ visit = type; }
127 : : //- sets the visit with type ( CUBIT_FALSE or CUBIT_TRUE )
128 : :
129 : 0 : inline CubitBoolean get_visit() const {return visit;}
130 : : //- Returns visit
131 : :
132 : : inline CubitVector get_normal() const {return mNormal;}
133 : :
134 : :
135 : :
136 : : int find_half_space( CubitFacet *ptr_facet );
137 : :
138 : : //- returns half space direction
139 : :
140 : 0 : inline CubitBoolean get_halfspace_direction(){ return halfspaceDirection; }
141 : 0 : inline void set_halfspace_direction( const CubitBoolean type ){ halfspaceDirection = type ; }
142 : :
143 : : void find_intersection_with_facet( CubitOctreeType type, RefFace *ptr_face, CubitFacet *ptr_facet, DLIList<CubitOctreeNode*> &boundary_white_node_list);
144 : : //- checks intesection between the lines joining grid node and adjacent nodes with the facet.
145 : : //- queue_mat_generation stores the BLACK grinodes that contains distanace and normal for MAT generation.
146 : :
147 : : CubitBoolean find_intersection_point( int axis, CubitVector grid_node0, CubitVector grid_node1, CubitVector &facet_normal, CubitVector facet_vert0, CubitVector facet_vert1, CubitVector facet_vert2, CubitVector &int_point, double ¶ );
148 : : //- returns true if the intersection between the line segment and facet takes place
149 : : //- para stores the parameter of intersection point int_point
150 : :
151 : : static CubitBoolean is_same_side(const CubitVector &p1, const CubitVector &p2, const CubitVector &a, const CubitVector &b);
152 : : static CubitBoolean is_intersection_point_contained_inside_facet( const CubitVector &int_point, const CubitVector &facet_vert0, const CubitVector &facet_vert1, const CubitVector &facet_vert2 );
153 : : //- returns true if intersection point is contained inside the facet
154 : : //- interior angle at the intersecton point should add up to 360 deg.
155 : :
156 : :
157 : : //- Appends the source point
158 : :
159 : 0 : inline void append_list_item( OctreeIntersectionData *ptr_int_data )
160 : : {
161 : 0 : octreeIntersectionDataList.push( ptr_int_data );
162 : 0 : }
163 : :
164 : : //- Appends intesection data like, face, int_point, facet etc.
165 : :
166 : 0 : DLIList<OctreeIntersectionData*>* get_idata_list() {return &octreeIntersectionDataList;}
167 : :
168 : : CubitBoolean bfs_to_find_contained_nodes(int max_onode_per_src);
169 : : CubitBoolean dfs_to_find_contained_nodes(int max_onode_per_src);
170 : : // Breadth first search is used to find nodes contained inside the box of skeleton source point
171 : :
172 : :
173 : : //- sizing function due to each type of source point is evaluated separately.
174 : : //- then these function can be blended to find final sizing function.
175 : : //- curently the minimum of all function is selected.
176 : :
177 : : static CubitBoolean compare_function( CubitOctreeNode *&a, CubitOctreeNode *&b );
178 : :
179 : : void find_distance_at_adj_node(PriorityQueue<CubitOctreeNode *> *heap );
180 : :
181 : : CubitBoolean find_size_using_adj_node();
182 : :
183 : :
184 : : //static void set_scope_box_limits( double max_x, double min_x, double max_y, double min_y, double max_z, double min_z);
185 : : //static void reset_scope_box_limits();
186 : : //- To avoid the overflow of stack during linking source point and grid nodes
187 : : //static double scpBoxMaxX, scpBoxMinX, scpBoxMaxY, scpBoxMinY, scpBoxMaxZ, scpBoxMinZ;
188 : : //SetDynamicMemoryAllocation(memoryManager)
189 : : //- class specific new and delete operators
190 : :
191 : : private:
192 : :
193 : :
194 : :
195 : :
196 : : private:
197 : : int num;
198 : : //- Serial number of node
199 : :
200 : : static int mCounter;
201 : :
202 : : CubitBoolean visit;
203 : : CubitBoolean mark;
204 : :
205 : : short color;
206 : : // in CubitOctree based approach
207 : : //- GREY is default ( all nodes outside WHITE or Solid )
208 : : //- BLACK (node inside solid), WHITE (node at the boundary during facet CubitOctree intersection)
209 : :
210 : : CubitBoolean halfspaceDirection;
211 : :
212 : : double size;
213 : :
214 : : //- Size at the grid node is initially set to 0.0
215 : :
216 : :
217 : : // OPT: keep pointer to list and clear list after intersection
218 : : DLIList<OctreeIntersectionData *> octreeIntersectionDataList;
219 : :
220 : : // OPT: use cubit hash to temp hold this data
221 : : int cellDepthDifference;
222 : : //- used in splitting CubitOctree cells during smooth transition
223 : :
224 : :
225 : : CubitOctreeCell *minDepthCell;
226 : : //- keeps the pointer to minimum depth adjacent cell
227 : :
228 : : double distance;
229 : :
230 : : CubitVector coord;
231 : : // Co-ordinates of the grid node
232 : :
233 : : CubitOctreeNode *adjGridNode[6];
234 : : //0 to 5 LEFT, RIGHT, BOTTOM, TOP, BACK, FRONT
235 : :
236 : : int adjNodeDistance[6]; ///???
237 : : //- stores the lengths between adjacent nodes
238 : :
239 : : CubitOctreeCell *adjCell[2][2][2];
240 : :
241 : :
242 : : RefFace *refFace;
243 : : //- Face associated with the grid node used in wave propagation
244 : :
245 : : CubitVector mNormal;
246 : : //- Normal at the grid_node is used in MAT generation.
247 : :
248 : :
249 : : //static MemoryManager memoryManager;
250 : : //- memory management object
251 : :
252 : : };
253 : :
254 : : #endif
255 : :
256 : : //EOF
257 : :
|