29 #ifndef OCT_NODE_INCLUDED
30 #define OCT_NODE_INCLUDED
32 #include "Allocator.h"
33 #include "BinaryNode.h"
34 #include "MarchingCubes.h"
38 template<
class NodeData ,
class Real=
float >
50 template<
class NodeAdjacencyFunction>
51 void __processNodeFaces(
OctNode* node,NodeAdjacencyFunction* F,
int cIndex1,
int cIndex2,
int cIndex3,
int cIndex4);
52 template<
class NodeAdjacencyFunction>
53 void __processNodeEdges(
OctNode* node,NodeAdjacencyFunction* F,
int cIndex1,
int cIndex2);
54 template<
class NodeAdjacencyFunction>
55 void __processNodeNodes(
OctNode* node,NodeAdjacencyFunction* F);
56 template<
class NodeAdjacencyFunction>
57 static void __ProcessNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,NodeAdjacencyFunction* F);
58 template<
class TerminatingNodeAdjacencyFunction>
59 static void __ProcessTerminatingNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,TerminatingNodeAdjacencyFunction* F);
60 template<
class Po
intAdjacencyFunction>
61 static void __ProcessPointAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node2,
int radius2,
int cWidth2,PointAdjacencyFunction* F);
62 template<
class NodeAdjacencyFunction>
63 static void __ProcessFixedDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,
int depth,NodeAdjacencyFunction* F);
64 template<
class NodeAdjacencyFunction>
65 static void __ProcessMaxDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int cWidth2,
int depth,NodeAdjacencyFunction* F);
68 static inline int Overlap(
int c1,
int c2,
int c3,
int dWidth);
69 inline static int ChildOverlap(
int dx,
int dy,
int dz,
int d,
int cRadius2);
71 const OctNode* __faceNeighbor(
int dir,
int off)
const;
72 const OctNode* __edgeNeighbor(
int o,
const int i[2],
const int idx[2])
const;
73 OctNode* __faceNeighbor(
int dir,
int off,
int forceChildren);
74 OctNode* __edgeNeighbor(
int o,
const int i[2],
const int idx[2],
int forceChildren);
76 static const int DepthShift,OffsetShift,OffsetShift1,OffsetShift2,OffsetShift3;
77 static const int DepthMask,OffsetMask;
80 static int UseAllocator(
void);
81 static void SetAllocator(
int blockSize);
85 short d , off[DIMENSION];
90 int initChildren(
void );
92 void depthAndOffset(
int& depth,
int offset[DIMENSION])
const;
93 int depth(
void)
const;
94 static inline void DepthAndOffset(
const long long& index,
int& depth,
int offset[DIMENSION]);
95 static inline void CenterAndWidth(
const long long& index,
Point3D<Real>& center,Real& width);
96 static inline int Depth(
const long long& index);
97 static inline void Index(
int depth,
const int offset[3],
short& d,
short off[DIMENSION]);
98 void centerAndWidth(
Point3D<Real>& center , Real& width )
const;
101 int leaves(
void)
const;
102 int maxDepthLeaves(
int maxDepth)
const;
103 int nodes(
void)
const;
104 int maxDepth(
void)
const;
106 const OctNode* root(
void)
const;
117 void setFullDepth(
int maxDepth);
119 void printLeaves(
void)
const;
120 void printRange(
void)
const;
122 template<
class NodeAdjacencyFunction>
123 void processNodeFaces(
OctNode* node,NodeAdjacencyFunction* F,
int fIndex,
int processCurrent=1);
124 template<
class NodeAdjacencyFunction>
125 void processNodeEdges(
OctNode* node,NodeAdjacencyFunction* F,
int eIndex,
int processCurrent=1);
126 template<
class NodeAdjacencyFunction>
127 void processNodeCorners(
OctNode* node,NodeAdjacencyFunction* F,
int cIndex,
int processCurrent=1);
128 template<
class NodeAdjacencyFunction>
129 void processNodeNodes(
OctNode* node,NodeAdjacencyFunction* F,
int processCurrent=1);
131 template<
class NodeAdjacencyFunction>
132 static void ProcessNodeAdjacentNodes(
int maxDepth,
OctNode* node1,
int width1,
OctNode* node2,
int width2,NodeAdjacencyFunction* F,
int processCurrent=1);
133 template<
class NodeAdjacencyFunction>
134 static void ProcessNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,NodeAdjacencyFunction* F,
int processCurrent=1);
135 template<
class TerminatingNodeAdjacencyFunction>
136 static void ProcessTerminatingNodeAdjacentNodes(
int maxDepth,
OctNode* node1,
int width1,
OctNode* node2,
int width2,TerminatingNodeAdjacencyFunction* F,
int processCurrent=1);
137 template<
class TerminatingNodeAdjacencyFunction>
138 static void ProcessTerminatingNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,TerminatingNodeAdjacencyFunction* F,
int processCurrent=1);
139 template<
class Po
intAdjacencyFunction>
140 static void ProcessPointAdjacentNodes(
int maxDepth,
const int center1[3],
OctNode* node2,
int width2,PointAdjacencyFunction* F,
int processCurrent=1);
141 template<
class Po
intAdjacencyFunction>
142 static void ProcessPointAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node2,
int radius2,
int width2,PointAdjacencyFunction* F,
int processCurrent=1);
143 template<
class NodeAdjacencyFunction>
144 static void ProcessFixedDepthNodeAdjacentNodes(
int maxDepth,
OctNode* node1,
int width1,
OctNode* node2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
145 template<
class NodeAdjacencyFunction>
146 static void ProcessFixedDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
147 template<
class NodeAdjacencyFunction>
148 static void ProcessMaxDepthNodeAdjacentNodes(
int maxDepth,
OctNode* node1,
int width1,
OctNode* node2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
149 template<
class NodeAdjacencyFunction>
150 static void ProcessMaxDepthNodeAdjacentNodes(
int dx,
int dy,
int dz,
OctNode* node1,
int radius1,
OctNode* node2,
int radius2,
int width2,
int depth,NodeAdjacencyFunction* F,
int processCurrent=1);
154 OctNode* faceNeighbor(
int faceIndex,
int forceChildren=0);
155 const OctNode* faceNeighbor(
int faceIndex)
const;
156 OctNode* edgeNeighbor(
int edgeIndex,
int forceChildren=0);
157 const OctNode* edgeNeighbor(
int edgeIndex)
const;
158 OctNode* cornerNeighbor(
int cornerIndex,
int forceChildren=0);
159 const OctNode* cornerNeighbor(
int cornerIndex)
const;
164 static int CommonEdge(
const OctNode* node1,
int eIndex1,
const OctNode* node2,
int eIndex2);
165 static int CompareForwardDepths(
const void* v1,
const void* v2);
166 static int CompareByDepthAndXYZ(
const void* v1 ,
const void* v2 );
167 static int CompareByDepthAndZIndex(
const void* v1 ,
const void* v2 );
168 static int CompareForwardPointerDepths(
const void* v1,
const void* v2);
169 static int CompareBackwardDepths(
const void* v1,
const void* v2);
170 static int CompareBackwardPointerDepths(
const void* v1,
const void* v2);
173 template<
class NodeData2>
176 static inline int Overlap2(
const int &depth1,
const int offSet1[DIMENSION],
const Real& multiplier1,
const int &depth2,
const int offSet2[DIMENSION],
const Real& multiplier2);
179 int write(
const char* fileName)
const;
180 int write(FILE* fp)
const;
181 int read(
const char* fileName);
199 void set(
int depth );
209 const OctNode* neighbors[3][3][3];
235 const OctNode* neighbors[5][5][5];
249 void set(
int depth );
251 Neighbors5& setNeighbors(
OctNode* node ,
int xStart=0 ,
int xEnd=5 ,
int yStart=0 ,
int yEnd=5 ,
int zStart=0 ,
int zEnd=5 );
262 void set(
int depth );
266 void centerIndex(
int maxDepth,
int index[DIMENSION])
const;
267 int width(
int maxDepth)
const;
270 #ifndef DOXY_IGNORE_THIS
271 #include "Octree.inl"