【问题标题】:2D angle between vectors. Negative for up and right?向量之间的二维角度。负向上,对吗?
【发布时间】:2016-07-31 16:12:21
【问题描述】:

我正在研究一些二维数学,我发现我在up(0, 1)right(1, 0) 之间得到的角度是-90,除非我疯了或在这里遗漏了什么,否则这似乎是错误的。我希望+90。我希望这里有人可以帮助我进行健全性检查。

这是我正在使用的实现:

GetAngle(a, b) = atan2(Cross(a, b), Dot(a, b))

地点:

Cross(a, b) = (a.x * b.y) - (a.y * b.x)
Dot(a, b) = (a.x * b.x) + (a.y * b.y)

【问题讨论】:

  • 为什么不简单:angle = acos(dot(a,b)/(abs(a)*(abs(b)))
  • 如果您面向北(“上”)并想向东(“右”),您必须转 -90(逆时针直角),对吗? ??????
  • @AhmedFasih 是的,我明白我现在假设不正确。感觉很像说If you want to walk forward, just take -5 steps by the toe-to-heel rule。伙计,我必须在这个上重新连接我的大脑......啊!

标签: math language-agnostic 2d linear-algebra


【解决方案1】:

由于右手定则,它应该是 -90 度。根据您的计算:

a = (0, 1)
b = (1, 0)
Cross(a,b) = 0 * 0 - 1 * 1 = -1 = sin(angle)
Dot(a,b) = 0 * 1 + 1 * 0 = 0 = cos(angle)

因此,

GetAngle(a,b) = atan2(-1, 0) = -90 degrees

请注意,atan2(y,x)tan^-1(y/x)。您的GetAngle 公式基于叉积定义为a X b = ||a||||b||sin(angle between a and b) 而点积定义为a . b = ||a||||b||cos(angle between a and b)

希望这会有所帮助。

【讨论】:

  • 对,所以如果我想顺时针正转,我必须将叉积改为左手,对吗?我不应该这样做有充分的理由吗? (也许只有我对 2d 中的右手习惯感到困惑?)
  • @xoorath 你可以这样做,但你会违反约定(并在此过程中更改交叉产品的定义)。最好坚持公认的右手约定。
  • 有道理。感谢您的帮助。
【解决方案2】:

我知道这是一个老问题,但是:

要计算两个向量之间的角度,使符号告诉您另一个向量是向右还是向左(即负向左,正向向右),您可以计算差异在两个atan2 之间,然后像这样更正它们:

def angleVec2(d, v):

    a_1 = math.atan2(d[1], d[0])
    a_2 = math.atan2(v[1], v[0])

    diff = a_2 - a_1

    if diff < -math.pi:
        diff = math.pi-(abs(diff)-math.pi)
    elif diff > math.pi:
        diff = -math.pi+(abs(diff)-math.pi)

    return diff

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多