fix(core): arc bounding box inflated for near-zero sweep arcs
Arcs with sweep angles smaller than Tolerance.Epsilon were treated as full circles by IsBetweenRad's shortcut check, causing UpdateBounds to expand the bounding box to Center ± Radius. This made zoom-to-fit zoom out far beyond the actual part extents. Skip cardinal angle expansion when sweep is near-zero so the bounding box uses only the arc's start/end points. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -404,26 +404,29 @@ namespace OpenNest.Geometry
|
||||
maxY = startpt.Y;
|
||||
}
|
||||
|
||||
var angle1 = StartAngle;
|
||||
var angle2 = EndAngle;
|
||||
var sweep = SweepAngle();
|
||||
if (sweep > Tolerance.Epsilon)
|
||||
{
|
||||
var angle1 = StartAngle;
|
||||
var angle2 = EndAngle;
|
||||
|
||||
// switch the angle to counter clockwise.
|
||||
if (IsReversed)
|
||||
Generic.Swap(ref angle1, ref angle2);
|
||||
if (IsReversed)
|
||||
Generic.Swap(ref angle1, ref angle2);
|
||||
|
||||
if (Angle.IsBetweenRad(Angle.HalfPI, angle1, angle2))
|
||||
maxY = Center.Y + Radius;
|
||||
if (Angle.IsBetweenRad(Angle.HalfPI, angle1, angle2))
|
||||
maxY = Center.Y + Radius;
|
||||
|
||||
if (Angle.IsBetweenRad(System.Math.PI, angle1, angle2))
|
||||
minX = Center.X - Radius;
|
||||
if (Angle.IsBetweenRad(System.Math.PI, angle1, angle2))
|
||||
minX = Center.X - Radius;
|
||||
|
||||
const double oneHalfPI = System.Math.PI * 1.5;
|
||||
const double oneHalfPI = System.Math.PI * 1.5;
|
||||
|
||||
if (Angle.IsBetweenRad(oneHalfPI, angle1, angle2))
|
||||
minY = Center.Y - Radius;
|
||||
if (Angle.IsBetweenRad(oneHalfPI, angle1, angle2))
|
||||
minY = Center.Y - Radius;
|
||||
|
||||
if (Angle.IsBetweenRad(Angle.TwoPI, angle1, angle2))
|
||||
maxX = Center.X + Radius;
|
||||
if (Angle.IsBetweenRad(Angle.TwoPI, angle1, angle2))
|
||||
maxX = Center.X + Radius;
|
||||
}
|
||||
|
||||
boundingBox.X = minX;
|
||||
boundingBox.Y = minY;
|
||||
|
||||
Reference in New Issue
Block a user