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)
|
||||
{
|
||||
var part2 = (Part)part2Template.Clone();
|
||||
|
||||
// Place part2 far away along push axis, at perpendicular offset.
|
||||
// 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);
|
||||
var (slideDist, finalPosition) = ComputeSlideResult(
|
||||
part2Template, part1Lines, halfSpacing,
|
||||
offset, pushStartOffset, isHorizontalPush, pushDir);
|
||||
|
||||
if (slideDist >= double.MaxValue || slideDist < 0)
|
||||
continue;
|
||||
|
||||
// Move part2 to contact position
|
||||
var pushVector = GetPushVector(pushDir, slideDist);
|
||||
var finalPosition = part2.Location + pushVector;
|
||||
|
||||
candidates.Add(new PairCandidate
|
||||
{
|
||||
Drawing = drawing,
|
||||
@@ -134,5 +116,48 @@ namespace OpenNest.Engine.BestFit
|
||||
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