feat(expand): plateview spacing expander
Grows part-to-part spacing of a selected group with the work area and non-selected parts as hard boundaries. Doubling + bisection search over the target spacing; Gauss-Seidel straight-line relaxation with anchor mover policy (later-index selected part moves, first selection never). Overlapping input is separated along penetration MTVs instead of being rejected. Cancel/failure never mutates part positions. Clearance gains BoundaryDistance for ring-pair gaps (part-in-cutout legality).
This commit is contained in:
@@ -62,6 +62,24 @@ namespace OpenNest.Geometry
|
||||
return Separation(linesA, linesB);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Non-negative minimum boundary (edge-to-edge) distance between two rings
|
||||
/// and the direction that translates <paramref name="a"/> away from
|
||||
/// <paramref name="b"/> at the closest contact. Never tests overlap: a ring
|
||||
/// contained in another (a part inside a cutout ring) still reports its true
|
||||
/// gap. For signed material clearance use <see cref="Between"/>.
|
||||
/// </summary>
|
||||
public static ClearanceResult BoundaryDistance(Polygon a, Polygon b)
|
||||
{
|
||||
var linesA = a.ToLines();
|
||||
var linesB = b.ToLines();
|
||||
|
||||
if (linesA.Count == 0 || linesB.Count == 0)
|
||||
return new ClearanceResult(0, new Vector(1, 0));
|
||||
|
||||
return Separation(linesA, linesB);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Minimum boundary distance between two non-overlapping rings and the
|
||||
/// direction that translates <paramref name="linesA"/> away from
|
||||
|
||||
Reference in New Issue
Block a user