13 #ifndef _OM_PROJECTOR_HXX_
14 #define _OM_PROJECTOR_HXX_
20 template <
class Mesh,
class Matrix>
37 template <
class Mesh,
class Matrix>
40 if (!m_mesh->IsTriMesh)
return false;
43 m_resolution = resolution;
51 m_mesh->request_face_normals();
52 m_mesh->request_vertex_normals();
53 MeshT::FaceIter end = m_mesh->faces_end();
58 for (MeshT::FaceIter face = m_mesh->faces_begin(); face != end; ++face)
60 MeshT::FHIter first = m_mesh->fh_begin(face);
61 m_mesh->calc_edge_vector(first, firstVec);
62 m_mesh->calc_edge_vector(++first, secondVec);
63 normal = cross(firstVec, secondVec);
65 m_mesh->set_normal(face, normal);
67 m_mesh->update_vertex_normals();
71 else if (zDir == ZDIR_Z || zDir == ZDIR_NORMAL)
74 if (!m_mesh->has_face_colors() || !m_mesh->has_vertex_normals())
76 m_mesh->request_face_normals();
77 m_mesh->request_vertex_normals();
78 m_mesh->update_normals();
83 std::vector<ScalarT> all;
84 MeshT::EdgeIter ende = m_mesh->edges_end();
86 for (MeshT::EdgeIter edge = m_mesh->edges_begin(); edge != ende; ++edge)
87 all.push_back(m_mesh->calc_edge_length(edge));
89 std::sort(all.begin(), all.end());
90 m_length = all[all.size()/2];
94 length = all[all.size()/2] * length;
98 MeshT::VertexIter end = m_mesh->vertices_end();
100 unsigned int total = m_mesh->n_vertices();
105 int N = m_mesh->n_vertices();
109 #pragma omp parallel// shared(m_mesh)
111 #pragma omp for schedule(dynamic)
112 for (
int i = 0; i < N; ++i)
114 MeshT::VertexHandle vertex = m_mesh->vertex_handle(i);
115 if (i%5000 == 0) MDS_LOG_NOTE(
"Computed " << i <<
" vertices of " << total <<
".");
116 direction = m_mesh->curvature(vertex);
119 rasterizeVertex(solver, vertex);
123 case XDIR_DO_NOT_CHECK:
124 #pragma omp parallel //shared(m_mesh)
126 #pragma omp for schedule(dynamic)
127 for (
int i = 0; i < N; ++i)
130 MeshT::VertexHandle vertex = m_mesh->vertex_handle(i);
131 if (i%5000 == 0) MDS_LOG_NOTE(
"Computed " << i <<
" vertices of " << total <<
".");
135 rasterizeVertex(solver, vertex);
152 template <
class Mesh,
class Matrix>
159 normal.normalize_cond();
164 for (MeshT::FVIter it = m_mesh->fv_begin(face); it; ++it, ++i)
171 VectorT realNormal= (vertices[1]-vertices[0]) % (vertices[2]-vertices[1]);
173 if (realNormal[2] < 0)
175 current = vertices[2];
176 vertices[2] = vertices[0];
177 vertices[0] = current;
183 for (MeshT::FVIter it = m_mesh->fv_begin(face); it; ++it, ++i)
185 vertices[i][2] = m_mesh->curvatureMagnitude(it);
188 normal = (vertices[1] - vertices[0]) % (vertices[2] - vertices[0]);
193 if (equationFract == 0.0) equationFract = 1.0;
195 ScalarT d = -(normal[0]*vertices[0][0] + normal[1]*vertices[0][1] + normal[2]*vertices[0][2]);
202 if (m_zDir == ZDIR_NORMAL)
205 while(!triangle.
isEnd())
207 current[0] = triangle.
getX();
208 current[1] = triangle.
getY();
210 if (current[0] >= m_MatrixTDelim.minimum[0] && current[0] <= m_MatrixTDelim.maximum[0] &&
211 current[1] >= m_MatrixTDelim.minimum[1] && current[1] <= m_MatrixTDelim.maximum[1])
212 matrix(current[1], current[0]) = (sin(acos(normal | Z)));
217 while(!triangle.
isEnd())
219 current[0] = triangle.
getX();
220 current[1] = triangle.
getY();
222 if (current[0] >= m_MatrixTDelim.minimum[0] && current[0] <= m_MatrixTDelim.maximum[0] &&
223 current[1] >= m_MatrixTDelim.minimum[1] && current[1] <= m_MatrixTDelim.maximum[1])
224 matrix(current[1], current[0]) = (normal[0] * current[0] + normal[1] * current[1] + d)/equationFract;
238 template <
class Mesh,
class Matrix>
243 if (m_zDir == ZDIR_Z)
248 std::set<int> addedFaces;
249 std::set<int> searchedVertices;
256 MatrixT matrix(m_resolution, m_resolution);
257 matrix.setConstant(INITIAL);
259 m_MatrixTDelim.minimum =
PointT(0.0, 0.0, 0.0);
263 std::vector<VertexHandleT> stack;
264 stack.push_back(vertex);
266 std::vector<FaceHandleT> facesToRasterize;
268 while (!stack.empty())
270 vertex = stack.back();
273 currentPoint = m_mesh->point(vertex);
276 for (MeshT::VFIter around = m_mesh->vf_begin(vertex); around; ++around)
279 index = around.handle().idx();
280 if (addedFaces.count(index) == 0)
283 addedFaces.insert(index);
284 facesToRasterize.push_back(around);
289 for (MeshT::VVIter around = m_mesh->vv_begin(vertex); around; ++around)
291 index = around.handle().idx();
294 if (searchedVertices.count(index) == 0)
300 searchedVertices.insert(index);
303 if (transformed[0] >= m_MatrixTDelim.minimum[0] && transformed[0] <= m_MatrixTDelim.maximum[0] &&
304 transformed[1] >= m_MatrixTDelim.minimum[1] && transformed[1] <= m_MatrixTDelim.maximum[1])
306 stack.push_back(around);
307 for (MeshT::VVIter around2 = m_mesh->vv_begin(around); around2; ++around2)
309 index = around2.handle().idx();
310 if (searchedVertices.count(index) == 0)
312 stack.push_back(around2);
313 searchedVertices.insert(index);
321 unsigned int total = facesToRasterize.size();
324 for (
unsigned int i = 0; i < total; ++i)
326 for (MeshT::FFIter around = m_mesh->ff_begin(facesToRasterize[i]); around; ++around)
327 facesToRasterize.push_back(around);
330 total = facesToRasterize.size();
331 for (
unsigned int i = 0; i < total; ++i)
332 rasterizeOnMatrixT(solver, facesToRasterize[i], matrix);
335 Mesh::Normal normal = m_mesh->normal(originalHandle);
336 normal.normalize_cond();
338 Mesh::FaceHandle face;
340 for(
int x = 0; x < m_resolution; ++x)
341 for(
int y = 0; y < m_resolution; ++y)
343 if (matrix(y, x) == INITIAL)
345 Mesh::Point point(x, y, 0.0);
348 tree.getPassingFace(point, normal, face);
351 rasterizeOnMatrixT(solver, face, matrix);
355 m_mesh->property(m_propertyHandle, originalHandle) = matrix;
358 #endif _OM_PROJECTOR_HXX_