127 if( aShapeList.size() == 0 )
132 KDTree kdTree( 2, adaptor );
137 return ( aRef - aFirst ).SquaredEuclideanNorm() < ( aRef - aSecond ).SquaredEuclideanNorm();
143 return std::min( ( aRef - aFirst ).SquaredEuclideanNorm(),
144 ( aRef - aSecond ).SquaredEuclideanNorm() );
149 bool success =
false;
152 SHAPE_T shape1 = aShape->GetShape();
157 SEG seg1( aShape->GetStart(), aShape->GetEnd() );
159 d[0] = ( seg0.
A - seg1.
A ).SquaredEuclideanNorm();
160 d[1] = ( seg0.
A - seg1.
B ).SquaredEuclideanNorm();
161 d[2] = ( seg0.
B - seg1.
A ).SquaredEuclideanNorm();
162 d[3] = ( seg0.
B - seg1.
B ).SquaredEuclideanNorm();
164 int idx = std::min_element( d, d + 4 ) - d;
175 aPrevShape->
SetEnd( *inter );
178 aShape->SetStart( *inter );
180 aShape->SetEnd( *inter );
196 d[0] = ( segPts[0] - arcPts[0] ).SquaredEuclideanNorm();
197 d[1] = ( segPts[0] - arcPts[1] ).SquaredEuclideanNorm();
198 d[2] = ( segPts[1] - arcPts[0] ).SquaredEuclideanNorm();
199 d[3] = ( segPts[1] - arcPts[1] ).SquaredEuclideanNorm();
201 int idx = std::min_element( d, d + 4 ) - d;
205 case 0: segShape->
SetStart( arcPts[0] );
break;
206 case 1: segShape->
SetStart( arcPts[1] );
break;
207 case 2: segShape->
SetEnd( arcPts[0] );
break;
208 case 3: segShape->
SetEnd( arcPts[1] );
break;
222 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
223 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
224 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
225 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
227 int idx = std::min_element( d, d + 4 ) - d;
230 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
254 d[0] = ( bezPts[0] - arcPts[0] ).SquaredEuclideanNorm();
255 d[1] = ( bezPts[0] - arcPts[1] ).SquaredEuclideanNorm();
256 d[2] = ( bezPts[1] - arcPts[0] ).SquaredEuclideanNorm();
257 d[3] = ( bezPts[1] - arcPts[1] ).SquaredEuclideanNorm();
259 int idx = std::min_element( d, d + 4 ) - d;
280 bezShape->
SetEnd( arcPts[0] );
287 bezShape->
SetEnd( arcPts[1] );
305 d[0] = ( segPts[0] - bezPts[0] ).SquaredEuclideanNorm();
306 d[1] = ( segPts[0] - bezPts[1] ).SquaredEuclideanNorm();
307 d[2] = ( segPts[1] - bezPts[0] ).SquaredEuclideanNorm();
308 d[3] = ( segPts[1] - bezPts[1] ).SquaredEuclideanNorm();
310 int idx = std::min_element( d, d + 4 ) - d;
314 case 0: segShape->
SetStart( bezPts[0] );
break;
315 case 1: segShape->
SetStart( bezPts[1] );
break;
316 case 2: segShape->
SetEnd( bezPts[0] );
break;
317 case 3: segShape->
SetEnd( bezPts[1] );
break;
331 d[0] = ( pts0[0] - pts1[0] ).SquaredEuclideanNorm();
332 d[1] = ( pts0[0] - pts1[1] ).SquaredEuclideanNorm();
333 d[2] = ( pts0[1] - pts1[0] ).SquaredEuclideanNorm();
334 d[3] = ( pts0[1] - pts1[1] ).SquaredEuclideanNorm();
336 int idx = std::min_element( d, d + 4 ) - d;
339 VECTOR2I middle = ( pts0[i0] + pts1[i1] ) / 2;
377 std::set<PCB_SHAPE*> startCandidates;
384 startCandidates.emplace( shape );
388 while( startCandidates.size() )
390 graphic = *startCandidates.begin();
400 findNext( curr_graphic, prevPt, kdTree, adaptor, aChainingEpsilon );
405 connectPair( curr_graphic, nextGraphic );
410 curr_graphic = nextGraphic;
412 startCandidates.erase( curr_graphic );
419 PCB_SHAPE* grAtEnd =
findNext( graphic, ptEnd, kdTree, adaptor, aChainingEpsilon );
420 PCB_SHAPE* grAtStart =
findNext( graphic, ptStart, kdTree, adaptor, aChainingEpsilon );
422 bool beginFromEndPt =
true;
425 if( grAtEnd && grAtStart )
430 min_distance_sq( ptStart, grAtStart->
GetStart(), grAtStart->
GetEnd() );
432 beginFromEndPt = dAtEnd <= dAtStart;
435 beginFromEndPt =
true;
437 beginFromEndPt =
false;
442 walkFrom( graphic, graphic->
GetEnd() );
443 walkFrom( graphic, graphic->
GetStart() );
447 walkFrom( graphic, graphic->
GetStart() );
448 walkFrom( graphic, graphic->
GetEnd() );
451 startCandidates.erase( graphic );