2 #ifndef GEODESIC_ALGORITHM_SUBDIVISION_122806 3 #define GEODESIC_ALGORITHM_SUBDIVISION_122806 19 template <
class Po
inter>
26 template <
class Po
inter,
class Parameter>
45 bool operator()(node_pointer
const s1, node_pointer
const s2)
const 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;
93 unsigned subdivision_level = 0):
98 m_nodes.reserve(mesh->vertices().size());
99 for(
unsigned i=0; i<mesh->vertices().size(); ++i)
102 m_nodes.push_back(Node(v));
105 set_subdivision_level(subdivision_level);
114 m_subdivision_level = subdivision_level;
116 m_nodes.resize(m_mesh->vertices().size());
117 m_nodes.reserve(m_mesh->vertices().size() +
118 m_mesh->edges().size()*subdivision_level);
120 for(
unsigned i=0; i<m_mesh->edges().size(); ++i)
123 for(
unsigned i=0; i<subdivision_level; ++i)
125 double offset = (double)(i+1)/(double)(subdivision_level+1);
126 m_nodes.push_back(Node(e, offset));
133 std::vector<node_pointer>& storage);
135 void list_nodes_visible_from_node(node_pointer node,
136 std::vector<node_pointer>& storage,
137 std::vector<double>& distances,
138 double threshold_distance);
142 return e->
id()*m_subdivision_level + m_mesh->vertices().size();
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)
162 node_pointer node = &m_nodes[node_index(v)];
163 if(node->distance_from_source() > threshold_distance)
165 storage.push_back(node);
171 unsigned node_index = node_indexx(e);
172 for(
unsigned i=0; i<m_subdivision_level; ++i)
174 node_pointer node = &m_nodes[node_index++];
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());
270 #endif //GEODESIC_ALGORITHM_SUBDIVISION_122806 void set_subdivision_level(unsigned subdivision_level)
void list_nodes_visible_from_node(node_pointer node, std::vector< node_pointer > &storage, std::vector< double > &distances, double threshold_distance)
node_pointer & previous()
~GeodesicAlgorithmSubdivision()
vertex_pointer_vector & adjacent_vertices()
edge_pointer_vector & adjacent_edges()
SubdivisionNode(Pointer p, Parameter param)
void list_nodes_visible_from_source(MeshElementBase *p, std::vector< node_pointer > &storage)
SurfacePoint & surface_point()
unsigned subdivision_level()
bool operator()(node_pointer const s1, node_pointer const s2) const
unsigned node_indexx(edge_pointer e)
GeodesicAlgorithmSubdivision(geodesic::Mesh *mesh=NULL, unsigned subdivision_level=0)
vertex_pointer opposite_vertex(edge_pointer e)
edge_pointer opposite_edge(vertex_pointer v)
double const GEODESIC_INF
unsigned & source_index()
face_pointer_vector & adjacent_faces()
vertex_pointer opposite_vertex(vertex_pointer v)
SubdivisionNode(Pointer p)
edge_pointer next_edge(edge_pointer e, vertex_pointer v)
double & distance_from_source()