38 #ifndef PCL_GRAPH_IMPL_EDGE_WEIGHT_COMPUTER_CPP
39 #define PCL_GRAPH_IMPL_EDGE_WEIGHT_COMPUTER_CPP
59 template <
typename EdgeWeightMap>
68 template <
typename EdgeDescriptor>
85 template <
typename Po
intT,
typename Enable =
void>
95 template <
typename Po
intT>
97 typename
std::enable_if<pcl::traits::has_curvature<PointT>>::type>
102 return (p1.curvature > 0.0f && p2.curvature > 0.0f);
112 template <
typename GraphT>
113 template <
class EdgeWeightMap>
117 typename boost::graph_traits<GraphT>::edge_iterator ei, ee;
120 if (g_terms_.size() || l_terms_.size())
122 for (
size_t i = 0; i < g_terms_.size(); ++i)
124 g_terms_[i].init(boost::num_edges(graph));
126 for (
size_t i = 0; i < l_terms_.size(); ++i)
128 l_terms_[i].init(boost::num_edges(graph), boost::num_vertices(graph));
132 for (boost::tie(ei, ee) = boost::edges(graph); ei != ee; ++ei, ++edge_id)
134 typename boost::graph_traits<GraphT>::vertex_descriptor v1, v2;
136 for (
size_t i = 0; i < g_terms_.size(); ++i)
138 g_terms_[i].round1(graph[v1], graph[v2], edge_id);
140 for (
size_t i = 0; i < l_terms_.size(); ++i)
142 l_terms_[i].round1(graph[v1], graph[v2], v1, v2, edge_id);
146 for (
size_t i = 0; i < g_terms_.size(); ++i)
148 g_terms_[i].extract();
150 for (
size_t i = 0; i < l_terms_.size(); ++i)
152 l_terms_[i].extract();
160 for (boost::tie(ei, ee) = boost::edges(graph); ei != ee; ++ei, ++edge_id)
162 typename boost::graph_traits<GraphT>::vertex_descriptor v1, v2;
164 const PointT& p1 = graph[v1];
165 const PointT& p2 = graph[v2];
167 for (
size_t i = 0; i < terms_.size(); ++i)
169 a *= balancing_function_(terms_[i].compute_(p1, p2),
170 terms_[i].getInfluence(is_convex(p1, p2)));
172 for (
size_t i = 0; i < g_terms_.size(); ++i)
174 a *= balancing_function_(g_terms_[i].round2(edge_id),
175 g_terms_[i].getInfluence(is_convex(p1, p2)));
177 for (
size_t i = 0; i < l_terms_.size(); ++i)
179 a *= balancing_function_(l_terms_[i].round2(v1, v2, edge_id),
180 l_terms_[i].getInfluence(is_convex(p1, p2)));
189 case SMALL_WEIGHT_IGNORE:
193 case SMALL_WEIGHT_COERCE_TO_THRESHOLD:
195 typedef typename boost::graph_traits<GraphT>::edge_iterator
EdgeIterator;
197 for (boost::tie(ei, ee) = boost::edges(graph); ei != ee; ++ei)
198 if (weights[*ei] < threshold_)
200 weights[*ei] = threshold_;
204 case SMALL_WEIGHT_REMOVE_EDGE:
210 re(predicate, graph);