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)
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;
134 m_mesh->closest_vertices(&destination, &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)
188 m_mesh->closest_vertices(s, &visible_vertices);
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;