2 #ifndef GEODESIC_ALGORITHM_DIJKSTRA_010506 3 #define GEODESIC_ALGORITHM_DIJKSTRA_010506 5 #include "geodesic_algorithm_graph_base.h" 6 #include "geodesic_mesh_elements.h" 15 typedef DijkstraNode* node_pointer;
20 double& distance_from_source(){
return m_distance;};
21 node_pointer& previous(){
return m_previous;};
22 unsigned& source_index(){
return m_source_index;};
23 vertex_pointer& vertex(){
return m_vertex;};
27 m_distance = GEODESIC_INF;
31 bool operator()(node_pointer
const s1, node_pointer
const s2)
const 33 return s1->distance_from_source() != s2->distance_from_source() ?
34 s1->distance_from_source() < s2->distance_from_source() :
35 s1->vertex()->id() < s2->vertex()->id();
38 double distance(SurfacePoint* p)
40 return m_vertex->distance(p);
43 SurfacePoint surface_point()
45 return SurfacePoint(m_vertex);
50 unsigned m_source_index;
51 node_pointer m_previous;
52 vertex_pointer m_vertex;
55 class GeodesicAlgorithmDijkstra:
public GeodesicAlgorithmGraphBase<DijkstraNode>
58 typedef DijkstraNode Node;
59 typedef Node* node_pointer;
61 GeodesicAlgorithmDijkstra(geodesic::Mesh* mesh):
62 GeodesicAlgorithmGraphBase<Node>(mesh)
66 m_nodes.resize(mesh->vertices().size());
67 for(
unsigned i=0; i<m_nodes.size(); ++i)
69 m_nodes[i].vertex() = &m_mesh->vertices()[i];
73 ~GeodesicAlgorithmDijkstra(){};
77 void list_nodes_visible_from_source(MeshElementBase* p,
78 std::vector<node_pointer>& storage);
80 void list_nodes_visible_from_node(node_pointer node,
81 std::vector<node_pointer>& storage,
82 std::vector<double>& distances,
83 double threshold_distance);
86 void GeodesicAlgorithmDijkstra::list_nodes_visible_from_source(MeshElementBase* p,
87 std::vector<node_pointer>& storage)
89 assert(p->type() != UNDEFINED_POINT);
93 face_pointer f =
static_cast<face_pointer
>(p);
94 for(
unsigned i=0; i<3; ++i)
96 vertex_pointer v = f->adjacent_vertices()[i];
97 storage.push_back(&m_nodes[node_index(v)]);
100 else if(p->type() == EDGE)
102 edge_pointer e =
static_cast<edge_pointer
>(p);
103 for(
unsigned i=0; i<2; ++i)
105 vertex_pointer v = e->adjacent_vertices()[i];
106 storage.push_back(&m_nodes[node_index(v)]);
111 vertex_pointer v =
static_cast<vertex_pointer
>(p);
112 storage.push_back(&m_nodes[node_index(v)]);
116 inline void GeodesicAlgorithmDijkstra::list_nodes_visible_from_node(node_pointer node,
117 std::vector<node_pointer>& storage,
118 std::vector<double>& distances,
119 double threshold_distance)
121 vertex_pointer v = node->vertex();
122 assert(storage.size() == distances.size());
124 for(
unsigned i=0; i<v->adjacent_edges().size(); ++i)
126 edge_pointer e = v->adjacent_edges()[i];
127 vertex_pointer new_v = e->opposite_vertex(v);
128 node_pointer new_node = &m_nodes[node_index(new_v)];
130 if(new_node->distance_from_source() > threshold_distance + e->length())
132 storage.push_back(new_node);
133 distances.push_back(e->length());
140 #endif //GEODESIC_ALGORITHM_DIJKSTRA_010506 Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11