2 #ifndef GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506
3 #define GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506
40 unsigned m_source_index;
41 node_pointer m_previous;
53 m_nodes(
mesh->vertices().size())
56 for(
unsigned i=0; i<m_nodes.size(); ++i)
64 virtual void propagate(std::vector<SurfacePoint>& sources,
66 std::vector<SurfacePoint>* stop_points = NULL);
69 std::vector<SurfacePoint>& path);
72 double& best_source_distance);
75 void set_sources(std::vector<SurfacePoint>& sources)
80 bool check_stop_conditions(
unsigned& index);
82 std::vector<Node> m_nodes;
84 std::vector<SurfacePoint> m_sources;
86 typedef std::set<node_pointer, Node> queue_type;
91 double& best_source_distance)
102 std::vector<vertex_pointer> possible_vertices;
107 for(
unsigned i=0; i<possible_vertices.size(); ++i)
111 double distance_from_source = m_nodes[v->
id()].distance_from_source();
112 double distance_from_dest = v->
distance(&point);
113 if(distance_from_source + distance_from_dest < best_source_distance)
115 best_source_distance = distance_from_source + distance_from_dest;
126 std::vector<SurfacePoint>& path)
129 path.push_back(destination);
133 std::vector<vertex_pointer> possible_vertices;
138 for(
unsigned i=0; i<possible_vertices.size(); ++i)
142 double distance_from_source = m_nodes[v->
id()].distance_from_source();
143 double distance_from_dest = v->
distance(&destination);
144 if(distance_from_source + distance_from_dest < min_distance)
146 min_distance = distance_from_source + distance_from_dest;
154 node_pointer node = &m_nodes[path.back().base_element()->id()];
165 path.push_back(source);
170 double max_propagation_distance,
171 std::vector<SurfacePoint>* stop_points)
174 set_sources(sources);
177 for(
unsigned i=0; i<m_nodes.size(); ++i)
182 clock_t start = clock();
184 std::vector<vertex_pointer> visible_vertices;
185 for(
unsigned i=0; i<m_sources.size(); ++i)
189 for(
unsigned j=0; j<visible_vertices.size(); ++j)
195 if(distance < node->distance_from_source())
202 visible_vertices.
clear();
205 for(
unsigned i=0; i<m_nodes.size(); ++i)
209 m_queue.insert(&m_nodes[i]);
213 unsigned counter = 0;
214 unsigned satisfied_index = 0;
216 while(!m_queue.empty())
218 if(counter++ % 10 == 0)
220 if (check_stop_conditions(satisfied_index))
228 m_queue.erase(m_queue.begin());
242 queue_type::iterator iter = m_queue.find(next_node);
243 assert(iter != m_queue.end());
249 m_queue.insert(next_node);
255 clock_t finish = clock();
256 m_time_consumed = (
static_cast<double>(finish)-
static_cast<double>(start))/CLOCKS_PER_SEC;
259 inline bool GeodesicAlgorithmDijkstraAlternative::check_stop_conditions(
unsigned& index)
261 double queue_min_distance = (*m_queue.begin())->distance_from_source();
271 Node& node = m_nodes[v->id()];
272 if(queue_min_distance < node.distance_from_source() +
m_stop_vertices[index].second)
double & distance_from_source()
vertex_pointer & vertex()
node_pointer & previous()
unsigned & source_index()
bool operator()(node_pointer const s1, node_pointer const s2) const
vertex_pointer opposite_vertex(vertex_pointer v)
void set_stop_conditions(std::vector< SurfacePoint > *stop_points, double stop_distance)
double m_max_propagation_distance
std::vector< stop_vertex_with_distace_type > m_stop_vertices
virtual void propagate(std::vector< SurfacePoint > &sources, double max_propagation_distance=GEODESIC_INF, std::vector< SurfacePoint > *stop_points=NULL)
~GeodesicAlgorithmDijkstraAlternative()
virtual void trace_back(SurfacePoint &destination, std::vector< SurfacePoint > &path)
virtual unsigned best_source(SurfacePoint &point, double &best_source_distance)
GeodesicAlgorithmDijkstraAlternative(geodesic::Mesh *mesh=NULL)
edge_pointer_vector & adjacent_edges()
std::vector< Vertex > & vertices()
unsigned closest_vertices(SurfacePoint *p, std::vector< vertex_pointer > *storage=NULL)
double distance(double *v)
base_pointer & base_element()
double const GEODESIC_INF