Я создаю приложение на основе Paper.js.
У меня есть список элементов, каждый из которых состоит из группы верхнего уровня и множества дочерних путей.
Мне нужно реализовать обнаружение столкновений, которое в настоящее время работает следующим образом:
Когда элемент перетаскивается, его компоненты (пути, из которых он состоит) сравниваются с любыми другими путями в том же слое с помощью метода Path#getIntersections(path).
Если метод возвращает непустой массив (CurveLocations, которые описывают точки пересечения), я знаю, что произошло столкновение. Я перестаю перетаскивать и комбинирую элементы.
Если возвращаемый массив пуст, столкновение не обрабатывается, поэтому нет необходимости прерывать перетаскивание. Я перевожу (перемещаю) перетаскиваемый элемент на расстояние, на которое его перетаскивали.
А теперь вот что мне нужно сделать на шаге 2:
При обнаружении столкновения мне нужно переместить элемент в ближайшую «правильную» позицию (ближайшую к текущей позиции мыши, не перекрывая какую-либо другую форму/границу).
Теперь я могу заняться реализацией SAT или GJK и решать их без метода getIntersections, но единственное, чего мне здесь не хватает, так это MTV (если не ошибаюсь).
Может кто-нибудь подтвердить, возможно ли это или нет, и если да, то как?
Обновлять
После некоторого возни с различными событиями мыши я пришел к текущему (несовершенному) решению:
onMouseDown: сохранить смещение мыши (положение элемента минус положение мыши).
onMouseDrag: проверка пересечений. Если это так, переместите перетаскиваемый объект с помощью event.delta.negate(), пока проверка возвращает true. Когда закончите, обновите смещение.
Если пересечение не обнаружено, просто переместите перетаскиваемый элемент в позицию мыши минус смещение.- onMouseUp: то же, что и в событии перетаскивания, за исключением того, что если столкновения не обнаружено, ничего не делать.
Это более или менее работает, за исключением того, что оно дергается и не имеет отношения к сдерживанию.
Будет обновлено примером, как только позволит время.