如何获得两条交叉线的角度

时间:2018-03-22 10:08:20

标签: javascript php logic

我有四点像

P1A (10,9)
P1B (10,10)

P2A (11,10)
P2B (11,9)

这显示了

LineA(from P1A ~ P2A)LineB(from P1B ~ P2B)

现在,我想得到两条线的角度。

在这种情况下,角度必须为90度。

如何通过编程获得角度?

我很高兴如果我能在php或javascript上得到这个想法

我认为公式必须与向量a,b一样。

cosΘ = a1 x b1 + a2 x b2 / MathSqrt(a1 x a1 + a2 x a2) x MathSqrt(b1 x b1 + b2 x b2)

但是如何将P1A,P1B,P2A,P2B纳入此公式?

2 个答案:

答案 0 :(得分:3)

在javascript中您可以使用Math.atan2()

  

Math.atan2()方法返回介于-π和π之间的数值   表示(x,y)点的角度θ。

let P1A = {
    x: 10,
    y: 9
};

let P1B = {
    x: 11,
    y: 10
};

// angle in radians
let angleRadians = Math.atan2(P1B.y - P1A.y, P1B.x - P1A.x);

// angle in degrees
let angleDeg = Math.atan2(P1B.y - P1A.y, P1B.x - P1A.x) * 180 / Math.PI;

答案 1 :(得分:1)

你有两个向量,每个向量由两个点定义。

让我们从AP1A致电P2A您的行:

A = P2A - P1A = [11, 10] - [10, 9] = [1, 1]

同样,您需要BP1B之间的向量P2B

B = P2B - P1B = [11, 9] - [10, 10] = [1, -1]

要找到矢量之间的角度,您需要:

A x B = |A| * |B| * sin(theta)

A . B = |A| * |B| * cos(theta)

使用上面显示的第一种方法:

theta = asin((A x B) / (|A| * |B|))

其中A x B = A.x * B.y - A.y * B.x

所以在你的情况下A x B = (1 * -1) - (1 * 1) = -2

你的矢量都有sqrt(2)长度所以:

theta = asin(-2 / (sqrt(2) * sqrt(2)) = asin(-1) = -π / 2 radians = -90 degrees