【问题标题】:How to get the angle of two cross line如何获得两条交叉线的角度
【发布时间】:2018-03-22 10:08:20
【问题描述】:

我有四点喜欢

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 纳入这个公式??

【问题讨论】:

  • 你知道如何用简单的数学在纸上做这个吗?如果不是,那么你首先有一个数学问题,而不是编程问题。
  • 具体来说,两个向量 AB 之间的角度可以通过A x B = |A|.|B| sin(theta) 找到,其中x叉积 操作。
  • 我投票决定将此问题作为题外话结束,因为它目前是一道数学题,而不是编程题。
  • 有一个替代公式是A . B = |A| * |B| * cos(theta)

标签: javascript php logic


【解决方案1】:

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

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

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;

【讨论】:

  • 这里的数学是完全错误的。它甚至不包含问题中给出的所有四个坐标。
  • @Alnitak 你能更具体一点吗?嗯就是个例子,坐标不用写。
  • 还是完全错了。 OP需要两个向量之间形成的角度,每个向量由两个任意点定义。巧合的是,在他的示例中,这四个点共有一些 X 坐标和 Y 坐标。
  • 哦,是的,这是一道数学题,(mybad) cos0 = (u * v) / (||u||.||v||)
  • 这是一种方式,尽管有些人更喜欢我使用的 sin 规则
【解决方案2】:

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

让我们从P1A 拨打AP2A

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

同样你需要一个介于P1BP2B 之间的向量B

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

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多