29 #ifndef MARCHING_CUBES_INCLUDED
30 #define MARCHING_CUBES_INCLUDED
31 #include <pcl/pcl_macros.h>
43 enum { CORNERS=4,EDGES=4,NEIGHBORS=4 };
44 static int CornerIndex (
int x,
int y);
45 static int AntipodalCornerIndex(
int idx);
46 static void FactorCornerIndex (
int idx,
int& x,
int& y);
47 static int EdgeIndex (
int orientation,
int i);
48 static void FactorEdgeIndex (
int idx,
int& orientation,
int& i);
50 static int ReflectCornerIndex (
int idx,
int edgeIndex);
51 static int ReflectEdgeIndex (
int idx,
int edgeIndex);
53 static void EdgeCorners(
int idx,
int& c1,
int &c2);
59 enum { CORNERS=8,EDGES=12,NEIGHBORS=6 };
61 static int CornerIndex (
int x,
int y,
int z);
62 static void FactorCornerIndex (
int idx,
int& x,
int& y,
int& z);
63 static int EdgeIndex (
int orientation,
int i,
int j);
64 static void FactorEdgeIndex (
int idx,
int& orientation,
int& i,
int &j);
65 static int FaceIndex (
int dir,
int offSet);
67 static void FactorFaceIndex (
int idx,
int& x,
int &y,
int& z);
68 static void FactorFaceIndex (
int idx,
int& dir,
int& offSet);
70 static int AntipodalCornerIndex (
int idx);
71 static int FaceReflectCornerIndex (
int idx,
int faceIndex);
72 static int FaceReflectEdgeIndex (
int idx,
int faceIndex);
73 static int FaceReflectFaceIndex (
int idx,
int faceIndex);
74 static int EdgeReflectCornerIndex (
int idx,
int edgeIndex);
75 static int EdgeReflectEdgeIndex (
int edgeIndex);
77 static int FaceAdjacentToEdges (
int eIndex1,
int eIndex2);
78 static void FacesAdjacentToEdge (
int eIndex,
int& f1Index,
int& f2Index);
80 static void EdgeCorners(
int idx,
int& c1,
int &c2);
81 static void FaceCorners(
int idx,
int& c1,
int &c2,
int& c3,
int& c4);
86 static double Interpolate(
double v1,
double v2);
87 static void SetVertex(
int e,
const double values[
Square::CORNERS],
double iso);
90 static const int* edgeMask();
91 static int edges(
int i,
int j);
92 static double& vertexList(
int i,
int j);
94 static int GetIndex(
const double values[Square::CORNERS],
double iso);
95 static int IsAmbiguous(
const double v[Square::CORNERS],
double isoValue);
96 static int AddEdges(
const double v[Square::CORNERS],
double isoValue,
Edge* edges);
97 static int AddEdgeIndices(
const double v[Square::CORNERS],
double isoValue,
int* edges);
102 static void SetVertex(
int e,
const double values[
Cube::CORNERS],
double iso);
103 static int GetFaceIndex(
const double values[Cube::CORNERS],
double iso,
int faceIndex);
105 static void SetVertex(
int e,
const float values[Cube::CORNERS],
float iso);
106 static int GetFaceIndex(
const float values[Cube::CORNERS],
float iso,
int faceIndex);
108 static int GetFaceIndex(
int mcIndex,
int faceIndex);
110 static double Interpolate(
double v1,
double v2);
111 static float Interpolate(
float v1,
float v2);
112 enum { MAX_TRIANGLES=5 };
113 static const int* edgeMask();
114 static int triangles(
int i,
int j);
115 static const int* cornerMap();
116 static double& vertexList(
int i,
int j);
118 static int AddTriangleIndices(
int mcIndex,
int* triangles);
120 static int GetIndex(
const double values[Cube::CORNERS],
double iso);
121 static int IsAmbiguous(
const double v[Cube::CORNERS],
double isoValue,
int faceIndex);
122 static int HasRoots(
const double v[Cube::CORNERS],
double isoValue);
123 static int HasRoots(
const double v[Cube::CORNERS],
double isoValue,
int faceIndex);
124 static int AddTriangles(
const double v[Cube::CORNERS],
double isoValue,
Triangle* triangles);
125 static int AddTriangleIndices(
const double v[Cube::CORNERS],
double isoValue,
int* triangles);
127 static int GetIndex(
const float values[Cube::CORNERS],
float iso);
128 static int IsAmbiguous(
const float v[Cube::CORNERS],
float isoValue,
int faceIndex);
129 static int HasRoots(
const float v[Cube::CORNERS],
float isoValue);
130 static int HasRoots(
const float v[Cube::CORNERS],
float isoValue,
int faceIndex);
131 static int AddTriangles(
const float v[Cube::CORNERS],
float isoValue,
Triangle* triangles);
132 static int AddTriangleIndices(
const float v[Cube::CORNERS],
float isoValue,
int* triangles);
134 static int IsAmbiguous(
int mcIndex,
int faceIndex);
135 static int HasRoots(
int mcIndex);
136 static int HasFaceRoots(
int mcIndex,
int faceIndex);
137 static int HasEdgeRoots(
int mcIndex,
int edgeIndex);
143 #endif //MARCHING_CUBES_INCLUDED
pcl::detail::MeshIndex< struct FaceIndexTag > FaceIndex
Index used to access elements in the half-edge mesh.
pcl::detail::MeshIndex< struct EdgeIndexTag > EdgeIndex
Index used to access elements in the half-edge mesh.