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" 14 typedef DijkstraNode* node_pointer;
19 double& distance_from_source(){
return m_distance;};
20 node_pointer& previous(){
return m_previous;};
21 unsigned& source_index(){
return m_source_index;};
22 vertex_pointer& vertex(){
return m_vertex;};
26 m_distance = GEODESIC_INF;
30 bool operator()(node_pointer
const s1, node_pointer
const s2)
const 32 return s1->distance_from_source() != s2->distance_from_source() ?
33 s1->distance_from_source() < s2->distance_from_source() :
34 s1->vertex()->id() < s2->vertex()->id();
37 double distance(SurfacePoint* p)
39 return m_vertex->distance(p);
42 SurfacePoint surface_point()
44 return SurfacePoint(m_vertex);
49 unsigned m_source_index;
50 node_pointer m_previous;
51 vertex_pointer m_vertex;
54 class GeodesicAlgorithmDijkstra:
public GeodesicAlgorithmGraphBase<DijkstraNode>
57 typedef DijkstraNode Node;
58 typedef Node* node_pointer;
60 GeodesicAlgorithmDijkstra(geodesic::Mesh* mesh):
61 GeodesicAlgorithmGraphBase<Node>(mesh)
65 m_nodes.resize(mesh->vertices().size());
66 for(
unsigned i=0; i<m_nodes.size(); ++i)
68 m_nodes[i].vertex() = &m_mesh->vertices()[i];
72 ~GeodesicAlgorithmDijkstra(){};
76 void list_nodes_visible_from_source(MeshElementBase* p,
77 std::vector<node_pointer>& storage);
79 void list_nodes_visible_from_node(node_pointer node,
80 std::vector<node_pointer>& storage,
81 std::vector<double>& distances,
82 double threshold_distance);
85 void GeodesicAlgorithmDijkstra::list_nodes_visible_from_source(MeshElementBase* p,
86 std::vector<node_pointer>& storage)
88 FEASSERT(p->type() != UNDEFINED_POINT);
92 face_pointer f =
static_cast<face_pointer
>(p);
93 for(
unsigned i=0; i<3; ++i)
95 vertex_pointer v = f->adjacent_vertices()[i];
96 storage.push_back(&m_nodes[node_index(v)]);
99 else if(p->type() == EDGE)
101 edge_pointer e =
static_cast<edge_pointer
>(p);
102 for(
unsigned i=0; i<2; ++i)
104 vertex_pointer v = e->adjacent_vertices()[i];
105 storage.push_back(&m_nodes[node_index(v)]);
110 vertex_pointer v =
static_cast<vertex_pointer
>(p);
111 storage.push_back(&m_nodes[node_index(v)]);
115 inline void GeodesicAlgorithmDijkstra::list_nodes_visible_from_node(node_pointer node,
116 std::vector<node_pointer>& storage,
117 std::vector<double>& distances,
118 double threshold_distance)
120 vertex_pointer v = node->vertex();
121 FEASSERT(storage.size() == distances.size());
123 for(
unsigned i=0; i<v->adjacent_edges().size(); ++i)
125 edge_pointer e = v->adjacent_edges()[i];
126 vertex_pointer new_v = e->opposite_vertex(v);
127 node_pointer new_node = &m_nodes[node_index(new_v)];
129 if(new_node->distance_from_source() > threshold_distance + e->length())
131 storage.push_back(new_node);
132 distances.push_back(e->length());
139 #endif //GEODESIC_ALGORITHM_DIJKSTRA_010506 Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11