【发布时间】:2020-03-27 09:59:16
【问题描述】:
我想显示两条线段的交点。分段是动画的,因此它们根据进度开始和停止相交。
所以我有这个代码:
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é 在这里对用于计算交点的代码的评论。我住在另一个 Helper 类中,看起来像这样:
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 ];
}
【问题讨论】:
-
@Gilles-PhilippePaillé 需要 contains 方法,因为只有在两个段都包含该点时才会显示该点。否则它将始终显示,除非该行是线性相关的
-
抱歉,我删除了评论,因为我意识到
dot做得更多。我明白你的意思。
标签: javascript geometry computational-geometry