Подробности задачи: < /h3>
[*] Я могу перетаскивать и отбросить элементы Path на Canvas .
Я хочу реализовать функциональность схватки, чтобы убедиться, что элемент перетаскиваемого пути «схватывает» к ближайшему предварительно нарисованному Nurbs Path или Path Когда он достаточно близко.
Логика схватки основана на пороге расстояния. Если перетащенный путь находится на определенном расстоянии от любого пути от списка путей, он должен прийти к нему. < /P>
< /li>
< /ul>
у меня есть следующий код: < /p>
Код: Выделить всё
private void Image_MouseMoveInCanvas(object sender, MouseEventArgs e)
{
if (isDragging && (_draggedElement != null) && (e.LeftButton == MouseButtonState.Pressed) && _well is not null)
{
Point currentPosition = e.GetPosition(WellCanvas);
double offsetX = currentPosition.X - _dragStartPoint.X;
double offsetY = currentPosition.Y - _dragStartPoint.Y;
double newLeft = Canvas.GetLeft(_draggedElement) + offsetX;
double newTop = Canvas.GetTop(_draggedElement) + offsetY;
Canvas.SetLeft(element: _draggedElement, length: newLeft);
Canvas.SetTop(element: _draggedElement, length: newTop);
_dragStartPoint = currentPosition;
if (_draggedElement is Path movingPath)
{
// Snapping to the closest NURBS path
SnapToClosestNURBSSpline(movingPath: movingPath, wellPaths: _well.GetAllPath(), threshold: 20);
}
}
}
private void SnapToClosestNURBSSpline(Path movingPath, List
wellPaths, double threshold)
{
foreach (PathGeometry wellPath in wellPaths)
{
if (IsNearPath(movingPath: movingPath.Data, wellPath: wellPath, threshold: threshold))
{
// Snapping logic to match the position of the moving path to the closest well path
movingPath.Data = wellPath.Clone();
return;
}
}
}
private bool IsNearPath(Geometry movingPath, Geometry wellPath, double threshold)
{
// Using bounds to compare proximity (this might be an issue for complex NURBS paths)
Rect movingBounds = movingPath.Bounds;
Rect wellBounds = wellPath.Bounds;
return (Math.Abs(movingBounds.Left - wellBounds.Left)
Код предназначен для того, чтобы защелкнуть перетаченный путь < /code> element на ближайший в коллекции WellPaths
< /li>
< /ul>
Мой вопрос: < /h3>
Как лучше всего сравнить пути NURBS в этом контексте и выполнить щелчок? Путь должен двигаться, и когда он становится достаточно близко к любому пути в списке (Nurbs или иным образом), он должен прийти к этому пути и соответственно выровнять себя. < /li>
< /ul>
Любые предложения или рекомендации о том, как улучшить логику схватки, будут высоко оценены! Я использую границы путей для сравнения близости, но я подозреваю, что этот подход может работать неправильно для путей Nurbs, поскольку они могут быть более сложными, чем простой путь объекты.
br /> < /li>
Я также пробовал клонировать данные пути и настройка, но щелчок, похоже, не происходит, как ожидалось. < /p>
< /li>
< /ul>
Подробнее здесь: https://stackoverflow.com/questions/794 ... wpf-canvas