Loading [MathJax]/extensions/tex2jax.js
Free Electron
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
geodesic_cpp_mod/geodesic_algorithm_dijkstra.h
1 //Copyright (C) 2008 Danil Kirsanov, MIT License
2 #ifndef GEODESIC_ALGORITHM_DIJKSTRA_010506
3 #define GEODESIC_ALGORITHM_DIJKSTRA_010506
4 
5 #include "geodesic_algorithm_graph_base.h"
6 #include "geodesic_mesh_elements.h"
7 #include <vector>
8 #include <set>
9 
10 namespace geodesic{
11 
12 class DijkstraNode
13 {
14  typedef DijkstraNode* node_pointer;
15 public:
16  DijkstraNode(){};
17  ~DijkstraNode(){};
18 
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;};
23 
24  void clear()
25  {
26  m_distance = GEODESIC_INF;
27  m_previous = NULL;
28  }
29 
30  bool operator()(node_pointer const s1, node_pointer const s2) const
31  {
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();
35  };
36 
37  double distance(SurfacePoint* p)
38  {
39  return m_vertex->distance(p);
40  }
41 
42  SurfacePoint surface_point()
43  {
44  return SurfacePoint(m_vertex);
45  }
46 
47 private:
48  double m_distance; //distance to the closest source
49  unsigned m_source_index; //closest source index
50  node_pointer m_previous; //previous node in the geodesic path
51  vertex_pointer m_vertex; //correspoding vertex
52 };
53 
54 class GeodesicAlgorithmDijkstra: public GeodesicAlgorithmGraphBase<DijkstraNode>
55 {
56 public:
57  typedef DijkstraNode Node;
58  typedef Node* node_pointer;
59 
60  GeodesicAlgorithmDijkstra(geodesic::Mesh* mesh):
61  GeodesicAlgorithmGraphBase<Node>(mesh)
62  {
63  m_type = DIJKSTRA;
64 
65  m_nodes.resize(mesh->vertices().size());
66  for(unsigned i=0; i<m_nodes.size(); ++i)
67  {
68  m_nodes[i].vertex() = &m_mesh->vertices()[i];
69  }
70  };
71 
72  ~GeodesicAlgorithmDijkstra(){};
73 
74 protected:
75 
76  void list_nodes_visible_from_source(MeshElementBase* p,
77  std::vector<node_pointer>& storage); //list all nodes that belong to this mesh element
78 
79  void list_nodes_visible_from_node(node_pointer node, //list all nodes that belong to this mesh element
80  std::vector<node_pointer>& storage,
81  std::vector<double>& distances,
82  double threshold_distance); //list only the nodes whose current distance is larger than the threshold
83 };
84 
85 void GeodesicAlgorithmDijkstra::list_nodes_visible_from_source(MeshElementBase* p,
86  std::vector<node_pointer>& storage)
87 {
88  FEASSERT(p->type() != UNDEFINED_POINT);
89 
90  if(p->type() == FACE)
91  {
92  face_pointer f = static_cast<face_pointer>(p);
93  for(unsigned i=0; i<3; ++i)
94  {
95  vertex_pointer v = f->adjacent_vertices()[i];
96  storage.push_back(&m_nodes[node_index(v)]);
97  }
98  }
99  else if(p->type() == EDGE)
100  {
101  edge_pointer e = static_cast<edge_pointer>(p);
102  for(unsigned i=0; i<2; ++i)
103  {
104  vertex_pointer v = e->adjacent_vertices()[i];
105  storage.push_back(&m_nodes[node_index(v)]);
106  }
107  }
108  else //VERTEX
109  {
110  vertex_pointer v = static_cast<vertex_pointer>(p);
111  storage.push_back(&m_nodes[node_index(v)]);
112  }
113 }
114 
115 inline void GeodesicAlgorithmDijkstra::list_nodes_visible_from_node(node_pointer node, //list all nodes that belong to this mesh element
116  std::vector<node_pointer>& storage,
117  std::vector<double>& distances,
118  double threshold_distance)
119 {
120  vertex_pointer v = node->vertex();
121  FEASSERT(storage.size() == distances.size());
122 
123  for(unsigned i=0; i<v->adjacent_edges().size(); ++i)
124  {
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)];
128 
129  if(new_node->distance_from_source() > threshold_distance + e->length())
130  {
131  storage.push_back(new_node);
132  distances.push_back(e->length());
133  }
134  }
135 }
136 
137 } //geodesic
138 
139 #endif //GEODESIC_ALGORITHM_DIJKSTRA_010506
Definition: geodesic_cpp_03_02_2008/geodesic_algorithm_base.h:11