Вместо того, чтобы пытаться найти прямые пересечения, вместо этого вы можете найти ближайшую точку на пути от положения движущейся точки.
Еслирасстояние между точкой и ближайшей точкой падает ниже порога (равного strokeWidth
из Path
и радиусу точки), тогда вы можете считать это действительным попаданием.
Однако есть ловушка : свойства вашего пути strokeJoin
& strokeCap
должны быть установлены на round
, так как это приводит к симметричной ширине обводки вокруг углови окончания, следовательно, избегая ложных негативов.
Вот пример:
var path = new Path({
segments: [
new Point(100, 200),
new Point(200, 100),
new Point(300, 300)
],
strokeWidth: 100,
// This is important.
strokeJoin: 'round',
// This is important.
strokeCap: 'round',
strokeColor: 'red',
selected: true,
position: view.center
})
var dot = new Path.Circle({
center: view.center,
radius: 10,
fillColor: 'red'
})
function onMouseMove(event) {
dot.position = event.point
var nearestPoint = path.getNearestPoint(dot.position)
var distance = dot.position.subtract(nearestPoint)
if (distance.length < (dot.bounds.width / 2) + (path.strokeWidth / 2)) {
path.strokeColor = 'blue'
} else {
path.strokeColor = 'red'
}
}
и Эскиз .
Это, как говоритсялучший способ сделать это - подождать (или реализовать себя), Расширение пути / смещение и вместо этого найти пересечение на расширенном пути, поскольку это позволит вам использовать любой strokeJoin
/strokeCap
настройка.
В идеале расширение / смещение будетбыть сделано с теми же strokeJoin
/ strokeCap
свойствами Path
.
Есть библиотека JS, которая надежно делает смещение полигонов , которая может быть вам полезна.