Я бы хотел отобразить точку пересечения двух отрезков. Сегменты анимированы, поэтому они начинают и прекращают пересекаться в зависимости от прогресса.
Поэтому у меня есть этот код:
class LineSegment {
constructor(x1,y1,x2,y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
contains (x,y) {
const
x1 = Math.min(this.x1, this.x2),
y1 = Math.min(this.y1, this.y2),
x2 = Math.max(this.x1, this.x2),
y2 = Math.max(this.y1, this.y2),
dot = ((x - x1) * (y2 - y1)) - ((y - y1) * (x2 - x1))
;
return dot <= Number.EPSILON &&
x >= x1 && x <= x2 &&
y >= y1 && y <= y2;
}
}
Где-то в коде, который я использую, вот так:
const
seg1 = new LineSegment(…),
seg2 = new LineSegment(…),
i = Intersect(seg1, seg2), //working code that calculates x and y values
//for the »unbounded« intersection
contains = i !== null &&
seg1.contains(i.x, i.y) &&
seg2.contains(i.x, i.y)
;
if (contains) {
//show a circle around x and y
} else {
//remove that one
}
На самом деле, эти пересечения »мерцание«, означаетиногда они работают, а иногда нет. Чего мне здесь не хватает, я думаю, что у меня здесь проблемы с числовыми данными?
Из-за комментария @ Gilles-Philippe Paillé здесь к коду, используемому для вычисления пересечения. Я живу в другом классе Хелпер и выглядит так:
intersect ({ a: a2, b: b2, c: c2 }) {
const
{
a:a1,
b:b1,
c:c1
} = this,
denom = det(a1, a2, b1, b2)
;
//only chuck norris can devide by zero!
return denom == 0 ?
null :
[ -1 * det(b1, c1, b2, c2) / denom,
det(a1, c1, a2, c2) / denom ];
}