我想显示两个线段的交点。这些段具有动画效果,因此它们可以根据进度开始和停止相交。
因此我有以下代码:
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,y2 = Math.max(this.y1,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-PhilippePaillé的评论此处为用于计算交点的代码。我住在另一个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,c2) / denom ];
}