refactor: extract ComputeSlideDistance helpers in RotationSlideStrategy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -85,31 +85,13 @@ namespace OpenNest.Engine.BestFit
|
|||||||
|
|
||||||
for (var offset = alignedStart; offset <= perpMax; offset += stepSize)
|
for (var offset = alignedStart; offset <= perpMax; offset += stepSize)
|
||||||
{
|
{
|
||||||
var part2 = (Part)part2Template.Clone();
|
var (slideDist, finalPosition) = ComputeSlideResult(
|
||||||
|
part2Template, part1Lines, halfSpacing,
|
||||||
// Place part2 far away along push axis, at perpendicular offset.
|
offset, pushStartOffset, isHorizontalPush, pushDir);
|
||||||
// Left/Down: start on the positive side; Right/Up: start on the negative side.
|
|
||||||
var isPositiveStart = pushDir == PushDirection.Left || pushDir == PushDirection.Down;
|
|
||||||
var startPos = isPositiveStart ? pushStartOffset : -pushStartOffset;
|
|
||||||
|
|
||||||
if (isHorizontalPush)
|
|
||||||
part2.Offset(startPos, offset);
|
|
||||||
else
|
|
||||||
part2.Offset(offset, startPos);
|
|
||||||
|
|
||||||
// Get part2's offset lines (half-spacing outward)
|
|
||||||
var part2Lines = Helper.GetOffsetPartLines(part2, halfSpacing);
|
|
||||||
|
|
||||||
// Find contact distance
|
|
||||||
var slideDist = Helper.DirectionalDistance(part2Lines, part1Lines, pushDir);
|
|
||||||
|
|
||||||
if (slideDist >= double.MaxValue || slideDist < 0)
|
if (slideDist >= double.MaxValue || slideDist < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Move part2 to contact position
|
|
||||||
var pushVector = GetPushVector(pushDir, slideDist);
|
|
||||||
var finalPosition = part2.Location + pushVector;
|
|
||||||
|
|
||||||
candidates.Add(new PairCandidate
|
candidates.Add(new PairCandidate
|
||||||
{
|
{
|
||||||
Drawing = drawing,
|
Drawing = drawing,
|
||||||
@@ -134,5 +116,48 @@ namespace OpenNest.Engine.BestFit
|
|||||||
default: return Vector.Zero;
|
default: return Vector.Zero;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private static double ComputeSlideDistance(
|
||||||
|
Part part2Template, List<Line> part1Lines, double halfSpacing,
|
||||||
|
double offset, double pushStartOffset,
|
||||||
|
bool isHorizontalPush, PushDirection pushDir)
|
||||||
|
{
|
||||||
|
var part2 = (Part)part2Template.Clone();
|
||||||
|
|
||||||
|
var isPositiveStart = pushDir == PushDirection.Left || pushDir == PushDirection.Down;
|
||||||
|
var startPos = isPositiveStart ? pushStartOffset : -pushStartOffset;
|
||||||
|
|
||||||
|
if (isHorizontalPush)
|
||||||
|
part2.Offset(startPos, offset);
|
||||||
|
else
|
||||||
|
part2.Offset(offset, startPos);
|
||||||
|
|
||||||
|
var part2Lines = Helper.GetOffsetPartLines(part2, halfSpacing);
|
||||||
|
|
||||||
|
return Helper.DirectionalDistance(part2Lines, part1Lines, pushDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static (double slideDist, Vector finalPosition) ComputeSlideResult(
|
||||||
|
Part part2Template, List<Line> part1Lines, double halfSpacing,
|
||||||
|
double offset, double pushStartOffset,
|
||||||
|
bool isHorizontalPush, PushDirection pushDir)
|
||||||
|
{
|
||||||
|
var part2 = (Part)part2Template.Clone();
|
||||||
|
|
||||||
|
var isPositiveStart = pushDir == PushDirection.Left || pushDir == PushDirection.Down;
|
||||||
|
var startPos = isPositiveStart ? pushStartOffset : -pushStartOffset;
|
||||||
|
|
||||||
|
if (isHorizontalPush)
|
||||||
|
part2.Offset(startPos, offset);
|
||||||
|
else
|
||||||
|
part2.Offset(offset, startPos);
|
||||||
|
|
||||||
|
var part2Lines = Helper.GetOffsetPartLines(part2, halfSpacing);
|
||||||
|
var slideDist = Helper.DirectionalDistance(part2Lines, part1Lines, pushDir);
|
||||||
|
|
||||||
|
var pushVector = GetPushVector(pushDir, slideDist);
|
||||||
|
var finalPosition = part2.Location + pushVector;
|
||||||
|
|
||||||
|
return (slideDist, finalPosition);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user