Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF > Class Template Reference
+ Collaboration diagram for MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >:

Public Member Functions

 MarchingCubes (const Eigen::PlainObjectBase< Derivedvalues > &values, const Eigen::PlainObjectBase< Derivedpoints > &points, const unsigned x_res, const unsigned y_res, const unsigned z_res, Eigen::PlainObjectBase< Derivedvertices > &vertices, Eigen::PlainObjectBase< DerivedF > &faces)
 

Static Public Member Functions

static DerivedF::Scalar add_vertex (const Eigen::PlainObjectBase< Derivedvalues > &values, const Eigen::PlainObjectBase< Derivedpoints > &points, unsigned int i0, unsigned int i1, Eigen::PlainObjectBase< Derivedvertices > &vertices, int &num_vertices, MyMap &edge2vertex)
 

Public Attributes

MyMap edge2vertex
 

Private Types

typedef std::unordered_map< EdgeKey, unsigned, EdgeHashMyMap
 
typedef MyMap::const_iterator MyMapIterator
 

Detailed Description

template<typename Derivedvalues, typename Derivedpoints, typename Derivedvertices, typename DerivedF>
class MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >

Member Typedef Documentation

◆ MyMap

template<typename Derivedvalues , typename Derivedpoints , typename Derivedvertices , typename DerivedF >
typedef std::unordered_map<EdgeKey, unsigned, EdgeHash> MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::MyMap
private

◆ MyMapIterator

template<typename Derivedvalues , typename Derivedpoints , typename Derivedvertices , typename DerivedF >
typedef MyMap::const_iterator MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::MyMapIterator
private

Constructor & Destructor Documentation

◆ MarchingCubes()

template<typename Derivedvalues , typename Derivedpoints , typename Derivedvertices , typename DerivedF >
MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::MarchingCubes ( const Eigen::PlainObjectBase< Derivedvalues > &  values,
const Eigen::PlainObjectBase< Derivedpoints > &  points,
const unsigned  x_res,
const unsigned  y_res,
const unsigned  z_res,
Eigen::PlainObjectBase< Derivedvertices > &  vertices,
Eigen::PlainObjectBase< DerivedF > &  faces 
)
inline
74 {
75 assert(values.cols() == 1);
76 assert(points.cols() == 3);
77
78 if(x_res <2 || y_res<2 ||z_res<2)
79 return;
80 faces.resize(10000,3);
81 int num_faces = 0;
82
83 vertices.resize(10000,3);
84 int num_vertices = 0;
85
86
87 unsigned n_cubes = (x_res-1) * (y_res-1) * (z_res-1);
88 assert(unsigned(points.rows()) == x_res * y_res * z_res);
89
90 unsigned int offsets_[8];
91 offsets_[0] = 0;
92 offsets_[1] = 1;
93 offsets_[2] = 1 + x_res;
94 offsets_[3] = x_res;
95 offsets_[4] = x_res*y_res;
96 offsets_[5] = 1 + x_res*y_res;
97 offsets_[6] = 1 + x_res + x_res*y_res;
98 offsets_[7] = x_res + x_res*y_res;
99
100 for (unsigned cube_it =0 ; cube_it < n_cubes; ++cube_it)
101 {
102
103 unsigned corner[8];
104 typename DerivedF::Scalar samples[12];
105 unsigned char cubetype(0);
106 unsigned int i;
107
108
109 // get point indices of corner vertices
110 for (i=0; i<8; ++i)
111 {
112 // get cube coordinates
113 unsigned int _idx = cube_it;
114 unsigned int X(x_res-1), Y(y_res-1);
115 unsigned int x = _idx % X; _idx /= X;
116 unsigned int y = _idx % Y; _idx /= Y;
117 unsigned int z = _idx;
118
119 // transform to point coordinates
120 _idx = x + y*x_res + z*x_res*y_res;
121
122 // add offset
123 corner[i] = _idx + offsets_[i];
124 }
125
126
127 // determine cube type
128 for (i=0; i<8; ++i)
129 if (values(corner[i]) > 0.0)
130 cubetype |= (1<<i);
131
132
133 // trivial reject ?
134 if (cubetype == 0 || cubetype == 255)
135 continue;
136
137
138 // compute samples on cube's edges
139 if (edgeTable[cubetype]&1)
140 samples[0] = add_vertex(values, points, corner[0], corner[1], vertices, num_vertices, edge2vertex);
141 if (edgeTable[cubetype]&2)
142 samples[1] = add_vertex(values, points, corner[1], corner[2], vertices, num_vertices, edge2vertex);
143 if (edgeTable[cubetype]&4)
144 samples[2] = add_vertex(values, points, corner[3], corner[2], vertices, num_vertices, edge2vertex);
145 if (edgeTable[cubetype]&8)
146 samples[3] = add_vertex(values, points, corner[0], corner[3], vertices, num_vertices, edge2vertex);
147 if (edgeTable[cubetype]&16)
148 samples[4] = add_vertex(values, points, corner[4], corner[5], vertices, num_vertices, edge2vertex);
149 if (edgeTable[cubetype]&32)
150 samples[5] = add_vertex(values, points, corner[5], corner[6], vertices, num_vertices, edge2vertex);
151 if (edgeTable[cubetype]&64)
152 samples[6] = add_vertex(values, points, corner[7], corner[6], vertices, num_vertices, edge2vertex);
153 if (edgeTable[cubetype]&128)
154 samples[7] = add_vertex(values, points, corner[4], corner[7], vertices, num_vertices, edge2vertex);
155 if (edgeTable[cubetype]&256)
156 samples[8] = add_vertex(values, points, corner[0], corner[4], vertices, num_vertices, edge2vertex);
157 if (edgeTable[cubetype]&512)
158 samples[9] = add_vertex(values, points, corner[1], corner[5], vertices, num_vertices, edge2vertex);
159 if (edgeTable[cubetype]&1024)
160 samples[10] = add_vertex(values, points, corner[2], corner[6], vertices, num_vertices, edge2vertex);
161 if (edgeTable[cubetype]&2048)
162 samples[11] = add_vertex(values, points, corner[3], corner[7], vertices, num_vertices, edge2vertex);
163
164
165
166 // connect samples by triangles
167 for (i=0; triTable[cubetype][0][i] != -1; i+=3 )
168 {
169 num_faces++;
170 if (num_faces > faces.rows())
171 faces.conservativeResize(faces.rows()+10000, Eigen::NoChange);
172
173 faces.row(num_faces-1) <<
174 samples[triTable[cubetype][0][i ]],
175 samples[triTable[cubetype][0][i+1]],
176 samples[triTable[cubetype][0][i+2]];
177
178 }
179
180 }
181
182 vertices.conservativeResize(num_vertices, Eigen::NoChange);
183 faces.conservativeResize(num_faces, Eigen::NoChange);
184
185 };
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index cols() const
Definition PlainObjectBase.h:153
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void conservativeResize(Index rows, Index cols)
Definition PlainObjectBase.h:390
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition PlainObjectBase.h:279
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rows() const
Definition PlainObjectBase.h:151
static DerivedF::Scalar add_vertex(const Eigen::PlainObjectBase< Derivedvalues > &values, const Eigen::PlainObjectBase< Derivedpoints > &points, unsigned int i0, unsigned int i1, Eigen::PlainObjectBase< Derivedvertices > &vertices, int &num_vertices, MyMap &edge2vertex)
Definition marching_cubes.cpp:187
MyMap edge2vertex
Definition marching_cubes.cpp:223
const int edgeTable[256]
Definition marching_cubes_tables.h:36
const int triTable[256][2][17]
Definition marching_cubes_tables.h:76
const Scalar & y
Definition MathFunctions.h:552
@ NoChange
Definition Constants.h:350
@ Y
Definition libslic3r.h:99
@ X
Definition libslic3r.h:98
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297

References MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::add_vertex(), Eigen::PlainObjectBase< Derived >::cols(), Eigen::PlainObjectBase< Derived >::conservativeResize(), MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::edge2vertex, edgeTable, Eigen::NoChange, Eigen::PlainObjectBase< Derived >::resize(), Eigen::PlainObjectBase< Derived >::rows(), and triTable.

+ Here is the call graph for this function:

Member Function Documentation

◆ add_vertex()

template<typename Derivedvalues , typename Derivedpoints , typename Derivedvertices , typename DerivedF >
static DerivedF::Scalar MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::add_vertex ( const Eigen::PlainObjectBase< Derivedvalues > &  values,
const Eigen::PlainObjectBase< Derivedpoints > &  points,
unsigned int  i0,
unsigned int  i1,
Eigen::PlainObjectBase< Derivedvertices > &  vertices,
int &  num_vertices,
MyMap edge2vertex 
)
inlinestatic
194 {
195 // find vertex if it has been computed already
196 MyMapIterator it = edge2vertex.find(EdgeKey(i0, i1));
197 if (it != edge2vertex.end())
198 return it->second;
199 ;
200
201 // generate new vertex
202 const Eigen::Matrix<typename Derivedpoints::Scalar, 1, 3> & p0 = points.row(i0);
203 const Eigen::Matrix<typename Derivedpoints::Scalar, 1, 3> & p1 = points.row(i1);
204
205 typename Derivedvalues::Scalar s0 = fabs(values(i0));
206 typename Derivedvalues::Scalar s1 = fabs(values(i1));
207 typename Derivedvalues::Scalar t = s0 / (s0+s1);
208
209
210 num_vertices++;
211 if (num_vertices > vertices.rows())
212 vertices.conservativeResize(vertices.rows()+10000, Eigen::NoChange);
213
214 // Linear interpolation based on linearly interpolating values
215 vertices.row(num_vertices-1) = ((1.0f-t)*p0 + t*p1).template cast<typename Derivedvertices::Scalar>();
216 edge2vertex[EdgeKey(i0, i1)] = num_vertices-1;
217
218 return num_vertices-1;
219 }
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:180
MyMap::const_iterator MyMapIterator
Definition marching_cubes.cpp:63
Definition marching_cubes.cpp:37

References Eigen::PlainObjectBase< Derived >::conservativeResize(), MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::edge2vertex, Eigen::NoChange, and Eigen::PlainObjectBase< Derived >::rows().

Referenced by MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::MarchingCubes().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ edge2vertex

template<typename Derivedvalues , typename Derivedpoints , typename Derivedvertices , typename DerivedF >
MyMap MarchingCubes< Derivedvalues, Derivedpoints, Derivedvertices, DerivedF >::edge2vertex

The documentation for this class was generated from the following file: