176 std::vector<double> node_pts;
177 std::vector<CN_ANCHOR_PTR> anchors;
178 std::vector< std::vector<CN_ANCHOR_PTR> > anchorChains(
m_allNodes.size() );
187 if( !prev || prev->Pos() != n->Pos() )
189 node_pts.push_back( n->Pos().x );
190 node_pts.push_back( n->Pos().y );
191 anchors.push_back( n );
195 anchorChains[anchors.size() - 1].push_back( n );
198 if( anchors.size() < 2 )
207 for(
size_t i = 0; i < anchors.size() - 1; i++ )
211 mstEdges.emplace_back( src, dst, src->Dist( *dst ) );
216 delaunator::Delaunator delaunator( node_pts );
217 auto& triangles = delaunator.triangles;
219 for(
size_t i = 0; i < triangles.size(); i += 3 )
223 mstEdges.emplace_back( src, dst, src->Dist( *dst ) );
225 src = anchors[triangles[i + 1]];
226 dst = anchors[triangles[i + 2]];
227 mstEdges.emplace_back( src, dst, src->Dist( *dst ) );
229 src = anchors[triangles[i + 2]];
230 dst = anchors[triangles[i]];
231 mstEdges.emplace_back( src, dst, src->Dist( *dst ) );
234 for(
size_t i = 0; i < delaunator.halfedges.size(); i++ )
236 if( delaunator.halfedges[i] == delaunator::INVALID_INDEX )
240 const CN_ANCHOR_PTR& dst = anchors[triangles[delaunator.halfedges[i]]];
241 mstEdges.emplace_back( src, dst, src->Dist( *dst ) );
245 for(
size_t i = 0; i < anchorChains.size(); i++ )
247 std::vector<CN_ANCHOR_PTR>& chain = anchorChains[i];
249 if( chain.size() < 2 )
252 std::sort( chain.begin(), chain.end(),
255 return a->GetCluster().get() < b->GetCluster().get();
258 for(
unsigned int j = 1; j < chain.size(); j++ )
262 int weight = prevNode->GetCluster() != curNode->GetCluster() ? 1 : 0;
263 mstEdges.emplace_back( prevNode, curNode, weight );
std::multiset< CN_ANCHOR_PTR, CN_PTR_CMP > m_allNodes
bool areNodesColinear(const std::vector< CN_ANCHOR_PTR > &aNodes) const
std::shared_ptr< CN_ANCHOR > CN_ANCHOR_PTR