1 #ifndef GEODESIC_ALGORITHM_GRAPH_BASE_010907
2 #define GEODESIC_ALGORITHM_GRAPH_BASE_010907
26 std::vector<SurfacePoint>* stop_points = NULL);
29 std::vector<SurfacePoint>& path);
32 std::vector<SurfacePoint>& path,std::vector<unsigned>& indexVertex);
35 double& best_source_distance);
41 double memory =
m_nodes.size()*
sizeof(Node);
42 std::cout <<
"uses about " << memory/1e6 <<
"Mb of memory" <<std::endl;
63 best_total_distance = best_node->distance_from_source();
67 std::vector<node_pointer> possible_nodes;
71 for(
unsigned i=0; i<possible_nodes.size(); ++i)
75 double distance_from_dest = node->distance(&point);
76 if(node->distance_from_source() + distance_from_dest < best_total_distance)
78 best_total_distance = node->distance_from_source() + distance_from_dest;
100 std::vector<node_pointer>& storage) = 0;
103 std::vector<node_pointer>& storage,
104 std::vector<double>& distances,
105 double threshold_distance) = 0;
117 double max_propagation_distance,
118 std::vector<SurfacePoint>* stop_points)
120 set_stop_conditions(stop_points, max_propagation_distance);
121 set_sources(sources);
125 for(
unsigned i=0; i<m_nodes.size(); ++i)
130 clock_t start = clock();
132 std::vector<node_pointer> visible_nodes;
133 for(
unsigned i=0; i<m_sources.size(); ++i)
139 for(
unsigned j=0; j<visible_nodes.size(); ++j)
142 double distance = node->distance(source);
143 if(distance < node->distance_from_source())
145 node->distance_from_source() = distance;
146 node->source_index() = i;
147 node->previous() = NULL;
150 visible_nodes.clear();
153 for(
unsigned i=0; i<m_nodes.size(); ++i)
157 m_queue.insert(&m_nodes[i]);
161 unsigned counter = 0;
162 unsigned satisfied_index = 0;
164 std::vector<double> distances_between_nodes;
165 while(!m_queue.empty())
167 if(counter++ % 10 == 0)
169 if (check_stop_conditions(satisfied_index))
176 m_queue.erase(m_queue.begin());
177 assert(min_node->distance_from_source() <
GEODESIC_INF);
179 visible_nodes.clear();
180 distances_between_nodes.clear();
181 list_nodes_visible_from_node(min_node,
183 distances_between_nodes,
184 min_node->distance_from_source());
186 for(
unsigned i=0; i<visible_nodes.size(); ++i)
190 if(next_node->distance_from_source() > min_node->distance_from_source() +
191 distances_between_nodes[i])
195 typename queue_type::iterator iter = m_queue.find(next_node);
196 assert(iter != m_queue.end());
199 next_node->distance_from_source() = min_node->distance_from_source() +
200 distances_between_nodes[i];
201 next_node->source_index() = min_node->source_index();
202 next_node->previous() = min_node;
203 m_queue.insert(next_node);
208 m_propagation_distance_stopped = m_queue.empty() ?
GEODESIC_INF : (*m_queue.begin())->distance_from_source();
209 clock_t finish = clock();
210 m_time_consumed = (
static_cast<double>(finish)-
static_cast<double>(start))/CLOCKS_PER_SEC;
217 double queue_min_distance = (*m_queue.begin())->distance_from_source();
219 if(queue_min_distance < m_max_propagation_distance)
224 while(index < m_stop_vertices.size())
227 Node& node = m_nodes[node_index(v)];
228 if(queue_min_distance < node.distance_from_source() + m_stop_vertices[index].second)
239 std::vector<SurfacePoint>& path)
243 double total_path_length;
244 node_pointer node = best_first_node(destination, total_path_length);
251 path.push_back(destination);
253 if(node->distance(&destination) > 1e-50)
255 path.push_back(node->surface_point());
258 while(node->previous())
260 node = node->previous();
261 path.push_back(node->surface_point());
265 if(node->distance(&source) > 1e-50)
267 path.push_back(source);
273 std::vector<SurfacePoint>& path,std::vector<unsigned>& indexVertex)
278 double total_path_length;
279 node_pointer node = best_first_node(destination, total_path_length);
286 path.push_back(destination);
288 if(node->distance(&destination) > 1e-50)
290 path.push_back(node->surface_point());
293 while(node->previous())
295 node = node->previous();
299 indexVertex.push_back((
int)node_index(v));
301 path.push_back(node->surface_point());
305 if(node->distance(&source) > 1e-50)
307 path.push_back(source);
312 double& best_source_distance)
314 node_pointer node = best_first_node(point, best_source_distance);
315 return node ? node->source_index() : 0;
virtual void print_statistics()
double m_propagation_distance_stopped
std::vector< Node > m_nodes
node_pointer best_first_node(SurfacePoint &point, double &best_total_distance)
void trace_back_with_index(SurfacePoint &destination, std::vector< SurfacePoint > &path, std::vector< unsigned > &indexVertex)
~GeodesicAlgorithmGraphBase()
void propagate(std::vector< SurfacePoint > &sources, double max_propagation_distance=GEODESIC_INF, std::vector< SurfacePoint > *stop_points=NULL)
void set_sources(std::vector< SurfacePoint > &sources)
bool check_stop_conditions(unsigned &index)
void trace_back(SurfacePoint &destination, std::vector< SurfacePoint > &path)
std::set< node_pointer, Node > queue_type
virtual void list_nodes_visible_from_node(node_pointer node, std::vector< node_pointer > &storage, std::vector< double > &distances, double threshold_distance)=0
std::vector< SurfacePoint > m_sources
virtual void list_nodes_visible_from_source(MeshElementBase *p, std::vector< node_pointer > &storage)=0
unsigned node_index(vertex_pointer v)
GeodesicAlgorithmGraphBase(geodesic::Mesh *mesh)
unsigned best_source(SurfacePoint &point, double &best_source_distance)
base_pointer & base_element()
double const GEODESIC_INF