2 #ifndef GEODESIC_ALGORITHM_SUBDIVISION_122806
3 #define GEODESIC_ALGORITHM_SUBDIVISION_122806
19 template <
class Po
inter>
26 template <
class Po
inter,
class Parameter>
63 if(s1->
x() != s2->
x())
65 return s1->
x() < s2->
x();
67 if(s1->
y() != s2->
y())
69 return s1->
y() < s2->
y();
71 if(s1->
z() != s2->
z())
73 return s1->
z() < s2->
z();
84 unsigned m_source_index;
85 node_pointer m_previous;
133 std::vector<node_pointer>& storage);
136 std::vector<node_pointer>& storage,
137 std::vector<double>& distances,
138 double threshold_distance);
147 std::vector<node_pointer>& storage,
148 double threshold_distance = -1.0);
150 unsigned m_subdivision_level;
153 inline void GeodesicAlgorithmSubdivision::list_nodes(MeshElementBase* p,
154 std::vector<node_pointer>& storage,
155 double threshold_distance)
163 if(node->distance_from_source() > threshold_distance)
165 storage.push_back(node);
168 else if(p->type() ==
EDGE)
172 for(
unsigned i=0; i<m_subdivision_level; ++i)
175 if(node->distance_from_source() > threshold_distance)
177 storage.push_back(node);
185 std::vector<node_pointer>& storage)
192 for(
unsigned i=0; i<3; ++i)
200 list_nodes(p,storage);
206 list_nodes(p,storage);
211 std::vector<node_pointer>& storage,
212 std::vector<double>& distances,
213 double threshold_distance)
217 assert(storage.size() == distances.size());
227 list_nodes(e, storage, threshold_distance);
228 list_nodes(v_opposite, storage, threshold_distance);
234 list_nodes(e, storage, threshold_distance);
243 list_nodes(v0, storage, threshold_distance);
244 list_nodes(v1, storage, threshold_distance);
250 list_nodes(f->
next_edge(e,v0), storage, threshold_distance);
251 list_nodes(f->
next_edge(e,v1), storage, threshold_distance);
260 unsigned index = distances.size();
261 distances.resize(storage.size());
262 for(; index<storage.size(); ++index)
264 distances[index] = node->distance(&storage[index]->surface_point());
vertex_pointer opposite_vertex(vertex_pointer v)
vertex_pointer opposite_vertex(edge_pointer e)
edge_pointer opposite_edge(vertex_pointer v)
edge_pointer next_edge(edge_pointer e, vertex_pointer v)
SubdivisionNode * node_pointer
std::vector< SubdivisionNode > m_nodes
unsigned node_index(vertex_pointer v)
~GeodesicAlgorithmSubdivision()
void list_nodes_visible_from_node(node_pointer node, std::vector< node_pointer > &storage, std::vector< double > &distances, double threshold_distance)
void set_subdivision_level(unsigned subdivision_level)
GeodesicAlgorithmSubdivision(geodesic::Mesh *mesh=NULL, unsigned subdivision_level=0)
unsigned node_indexx(edge_pointer e)
unsigned subdivision_level()
void list_nodes_visible_from_source(MeshElementBase *p, std::vector< node_pointer > &storage)
vertex_pointer_vector & adjacent_vertices()
edge_pointer_vector & adjacent_edges()
face_pointer_vector & adjacent_faces()
std::vector< Edge > & edges()
std::vector< Vertex > & vertices()
bool operator()(node_pointer const s1, node_pointer const s2) const
double & distance_from_source()
node_pointer & previous()
SurfacePoint & surface_point()
unsigned & source_index()
SubdivisionNode(Pointer p, Parameter param)
SubdivisionNode(Pointer p)
double const GEODESIC_INF