与SylvesterJS的线路交叉点 - 我是否打破了数学?

时间:2012-07-25 20:46:35

标签: javascript math geometry lines

我正在使用sylvester.js作为数学框架,但似乎忘记了几何(可能),或者我没有正确使用它。我在尝试:

var angle = 45;
var line1 = $L([1,1],[Math.tan(angle * Math.PI/180),Math.tan(angle * Math.PI/180)]); //Should be a 45-degree angle
angle = -45;
var line2 = $L([0,0],[Math.tan(angle * Math.PI/180),Math.tan(angle * Math.PI/180)]); //Should be a -45-degree angle
line1.intersects(line2);
//returns false, should be true, I would think?

这应该在0到-45度创建一条直线,而在45度相交的情况下创建另一条直线,对吧?有什么建议? (注意:我通常使用deg2rad var而不是Math.PI / 180,这纯粹是为了示例)

3 个答案:

答案 0 :(得分:2)

回想一下,角度的切线等于相邻腿的相对腿的长度。换句话说,超越运行。因此,切线给出了线的斜率,而不是沿线的矢量。

enter image description here

要将角度转换为矢量,请使用正弦和余弦:

m⃑ = [cos(θ), sin(θ)]

你可以在公式中看到这个从极坐标转换为笛卡尔坐标:

(x, y) = (r * cos(θ), r * sin(θ))

由于幅度无关紧要(即使你有一个幅度,$L将矢量归一化),将“r”保留在等式之外,你得到m⃑上面。

请注意,对于代码中的每个方向向量,两个分量是相等的,因此向量位于y = x行;因此它们是平行的。您还可以显示向量是平行的,因为向量是彼此的标量倍数。更具体地说,由于矢量具有相反的方向(标量是负的),因此它们是antiparallel。参考点(0,0)和(1,1)位于两条线上,因此每个矢量跨越的线重叠。仅当存在唯一的交叉点时,Sylvester.js'Line.intersects才返回true。由于两条线相交,所以没有唯一的点,函数返回false。

答案 1 :(得分:1)

要从角度定义向量,您需要进行以下计算。

x = sin(angle)
y = cos(angle)

你做到了这一点:

x = tan(angle)
y = tan(angle)

答案 2 :(得分:0)

这只是一个猜测,因为我对sylvester做过很多事情,但由于line是vector的一个特殊实例,你的问题可能在于如何定义事物。当您定义line2并将其锚定在[0,0]时,第二个点为[-.013,-.013],line2可能会以错误的方向射击以与另一条线相交;我不确定该线路是否会双向扩展。