2 #ifndef GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506 3 #define GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506 31 bool operator()(node_pointer
const s1, node_pointer
const s2)
const 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)
58 m_nodes[i].vertex() = &m_mesh->vertices()[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;
103 m_mesh->closest_vertices(&point, &possible_vertices);
107 for(
unsigned i=0; i<possible_vertices.size(); ++i)
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;
134 m_mesh->closest_vertices(&destination, &possible_vertices);
138 for(
unsigned i=0; i<possible_vertices.size(); ++i)
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)
173 set_stop_conditions(stop_points, max_propagation_distance);
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)
188 m_mesh->closest_vertices(s, &visible_vertices);
189 for(
unsigned j=0; j<visible_vertices.size(); ++j)
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)
263 if(queue_min_distance < m_max_propagation_distance)
268 while(index < m_stop_vertices.size())
271 Node& node = m_nodes[v->
id()];
283 #endif //GEODESIC_ALGORITHM_DIJKSTRA_ALTERNATIVE_010506 unsigned & source_index()
virtual unsigned best_source(SurfacePoint &point, double &best_source_distance)
edge_pointer_vector & adjacent_edges()
double & distance_from_source()
GeodesicAlgorithmDijkstraAlternative(geodesic::Mesh *mesh=NULL)
node_pointer & previous()
double const GEODESIC_INF
virtual void trace_back(SurfacePoint &destination, std::vector< SurfacePoint > &path)
base_pointer & base_element()
bool operator()(node_pointer const s1, node_pointer const s2) const
double distance(double *v)
vertex_pointer opposite_vertex(vertex_pointer v)
~GeodesicAlgorithmDijkstraAlternative()
virtual void propagate(std::vector< SurfacePoint > &sources, double max_propagation_distance=GEODESIC_INF, std::vector< SurfacePoint > *stop_points=NULL)
vertex_pointer & vertex()