129 if( aShapeList.size() == 0 )
134 KDTree kdTree( 2, adaptor );
139 return ( aRef - aFirst ).SquaredEuclideanNorm() < ( aRef - aSecond ).SquaredEuclideanNorm();
145 return std::min( ( aRef - aFirst ).SquaredEuclideanNorm(),
146 ( aRef - aSecond ).SquaredEuclideanNorm() );
151 bool success =
false;
154 SHAPE_T shape1 = aShape->GetShape();
159 SEG seg1( aShape->GetStart(), aShape->GetEnd() );
161 d[0] = ( seg0.
A - seg1.
A ).SquaredEuclideanNorm();
162 d[1] = ( seg0.
A - seg1.
B ).SquaredEuclideanNorm();
163 d[2] = ( seg0.
B - seg1.
A ).SquaredEuclideanNorm();
164 d[3] = ( seg0.
B - seg1.
B ).SquaredEuclideanNorm();
166 int idx = std::min_element( d, d + 4 ) - d;
177 aPrevShape->
SetEnd( *inter );
180 aShape->SetStart( *inter );
182 aShape->SetEnd( *inter );
192 VECTOR2I mid = ( ( i0 == 0 ? seg0.
A : seg0.
B ) + ( i1 == 0 ? seg1.
A : seg1.
B ) ) / 2;
197 aPrevShape->
SetEnd( mid );
200 aShape->SetStart( mid );
202 aShape->SetEnd( mid );
217 d[0] = ( segPts[0] -
arcPts[0] ).SquaredEuclideanNorm();
218 d[1] = ( segPts[0] -
arcPts[1] ).SquaredEuclideanNorm();
219 d[2] = ( segPts[1] -
arcPts[0] ).SquaredEuclideanNorm();
220 d[3] = ( segPts[1] -
arcPts[1] ).SquaredEuclideanNorm();
222 int idx = std::min_element( d, d + 4 ) - d;
243 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
244 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
245 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
246 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
248 int idx = std::min_element( d, d + 4 ) - d;
251 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
275 d[0] = ( bezPts[0] -
arcPts[0] ).SquaredEuclideanNorm();
276 d[1] = ( bezPts[0] -
arcPts[1] ).SquaredEuclideanNorm();
277 d[2] = ( bezPts[1] -
arcPts[0] ).SquaredEuclideanNorm();
278 d[3] = ( bezPts[1] -
arcPts[1] ).SquaredEuclideanNorm();
280 int idx = std::min_element( d, d + 4 ) - d;
326 d[0] = ( segPts[0] - bezPts[0] ).SquaredEuclideanNorm();
327 d[1] = ( segPts[0] - bezPts[1] ).SquaredEuclideanNorm();
328 d[2] = ( segPts[1] - bezPts[0] ).SquaredEuclideanNorm();
329 d[3] = ( segPts[1] - bezPts[1] ).SquaredEuclideanNorm();
331 int idx = std::min_element( d, d + 4 ) - d;
335 case 0: segShape->
SetStart( bezPts[0] );
break;
336 case 1: segShape->
SetStart( bezPts[1] );
break;
337 case 2: segShape->
SetEnd( bezPts[0] );
break;
338 case 3: segShape->
SetEnd( bezPts[1] );
break;
352 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
353 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
354 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
355 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
357 int idx = std::min_element( d, d + 4 ) - d;
360 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
398 std::set<PCB_SHAPE*> startCandidates;
405 startCandidates.emplace( shape );
409 while( startCandidates.size() )
411 graphic = *startCandidates.begin();
421 findNext( curr_graphic, prevPt, kdTree, adaptor, aChainingEpsilon );
426 connectPair( curr_graphic, nextGraphic );
431 curr_graphic = nextGraphic;
433 startCandidates.erase( curr_graphic );
440 PCB_SHAPE* grAtEnd =
findNext( graphic, ptEnd, kdTree, adaptor, aChainingEpsilon );
441 PCB_SHAPE* grAtStart =
findNext( graphic, ptStart, kdTree, adaptor, aChainingEpsilon );
443 bool beginFromEndPt =
true;
446 if( grAtEnd && grAtStart )
451 min_distance_sq( ptStart, grAtStart->
GetStart(), grAtStart->
GetEnd() );
453 beginFromEndPt = dAtEnd <= dAtStart;
456 beginFromEndPt =
true;
458 beginFromEndPt =
false;
463 walkFrom( graphic, graphic->
GetEnd() );
464 walkFrom( graphic, graphic->
GetStart() );
468 walkFrom( graphic, graphic->
GetStart() );
469 walkFrom( graphic, graphic->
GetEnd() );
472 startCandidates.erase( graphic );