123 if( aShapeList.size() == 0 )
128 KDTree kdTree( 2, adaptor );
133 return ( aRef - aFirst ).SquaredEuclideanNorm() < ( aRef - aSecond ).SquaredEuclideanNorm();
139 return std::min( ( aRef - aFirst ).SquaredEuclideanNorm(),
140 ( aRef - aSecond ).SquaredEuclideanNorm() );
145 bool success =
false;
148 SHAPE_T shape1 = aShape->GetShape();
153 SEG seg1( aShape->GetStart(), aShape->GetEnd() );
155 d[0] = ( seg0.
A - seg1.
A ).SquaredEuclideanNorm();
156 d[1] = ( seg0.
A - seg1.
B ).SquaredEuclideanNorm();
157 d[2] = ( seg0.
B - seg1.
A ).SquaredEuclideanNorm();
158 d[3] = ( seg0.
B - seg1.
B ).SquaredEuclideanNorm();
160 int idx = std::min_element( d, d + 4 ) - d;
171 aPrevShape->
SetEnd( *inter );
174 aShape->SetStart( *inter );
176 aShape->SetEnd( *inter );
192 d[0] = ( segPts[0] -
arcPts[0] ).SquaredEuclideanNorm();
193 d[1] = ( segPts[0] -
arcPts[1] ).SquaredEuclideanNorm();
194 d[2] = ( segPts[1] -
arcPts[0] ).SquaredEuclideanNorm();
195 d[3] = ( segPts[1] -
arcPts[1] ).SquaredEuclideanNorm();
197 int idx = std::min_element( d, d + 4 ) - d;
218 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
219 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
220 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
221 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
223 int idx = std::min_element( d, d + 4 ) - d;
226 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
250 d[0] = ( bezPts[0] -
arcPts[0] ).SquaredEuclideanNorm();
251 d[1] = ( bezPts[0] -
arcPts[1] ).SquaredEuclideanNorm();
252 d[2] = ( bezPts[1] -
arcPts[0] ).SquaredEuclideanNorm();
253 d[3] = ( bezPts[1] -
arcPts[1] ).SquaredEuclideanNorm();
255 int idx = std::min_element( d, d + 4 ) - d;
301 d[0] = ( segPts[0] - bezPts[0] ).SquaredEuclideanNorm();
302 d[1] = ( segPts[0] - bezPts[1] ).SquaredEuclideanNorm();
303 d[2] = ( segPts[1] - bezPts[0] ).SquaredEuclideanNorm();
304 d[3] = ( segPts[1] - bezPts[1] ).SquaredEuclideanNorm();
306 int idx = std::min_element( d, d + 4 ) - d;
310 case 0: segShape->
SetStart( bezPts[0] );
break;
311 case 1: segShape->
SetStart( bezPts[1] );
break;
312 case 2: segShape->
SetEnd( bezPts[0] );
break;
313 case 3: segShape->
SetEnd( bezPts[1] );
break;
327 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
328 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
329 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
330 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
332 int idx = std::min_element( d, d + 4 ) - d;
335 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
373 std::set<PCB_SHAPE*> startCandidates;
380 startCandidates.emplace( shape );
384 while( startCandidates.size() )
386 graphic = *startCandidates.begin();
396 findNext( curr_graphic, prevPt, kdTree, adaptor, aChainingEpsilon );
401 connectPair( curr_graphic, nextGraphic );
406 curr_graphic = nextGraphic;
408 startCandidates.erase( curr_graphic );
415 PCB_SHAPE* grAtEnd =
findNext( graphic, ptEnd, kdTree, adaptor, aChainingEpsilon );
416 PCB_SHAPE* grAtStart =
findNext( graphic, ptStart, kdTree, adaptor, aChainingEpsilon );
418 bool beginFromEndPt =
true;
421 if( grAtEnd && grAtStart )
426 min_distance_sq( ptStart, grAtStart->
GetStart(), grAtStart->
GetEnd() );
428 beginFromEndPt = dAtEnd <= dAtStart;
431 beginFromEndPt =
true;
433 beginFromEndPt =
false;
438 walkFrom( graphic, graphic->
GetEnd() );
439 walkFrom( graphic, graphic->
GetStart() );
443 walkFrom( graphic, graphic->
GetStart() );
444 walkFrom( graphic, graphic->
GetEnd() );
447 startCandidates.erase( graphic );