2010-05-28 48 views
2

我有两个2D矢量,比如u和v,用笛卡尔坐标定义。找到矢量旋转的最快方法

想象一下,矢量是针的时钟。我正在寻找最快的方式来找出使用python,如果v在u之后或之前(换句话说,在这个半平面中找出v,关于u的位置)。如果向量对齐的问题的目的答案应该在之前。

使用一些三角函数似乎很容易,但我相信应该有一种更快的方式使用坐标只。

我的测试用例:

def after(u, v): 
    """code here""" 
  • ((4,2),(6,1)):真
  • 后((4,2),(3,3)) :假
  • 后((4,2),(2,1)):假
  • 后((4,2),(3,-3)):真
  • 后((4,2 ),(-2,-5)):真(012)(4,2),(-4,-2),
  • ):假

回答

13
def after(u, v): 
    # return sign of cross product 
    return u[0]*v[1]<u[1]*v[0] 

不知道,如果它的速度快,但它是简洁

+0

谢谢。这正是我所期待的。 – kriss 2010-05-28 20:04:58

0

总体思路:使X轴用v一致,并检查新的u y坐标正。

+0

如果你使用这个链接http://en.wikipedia.org/wiki/Rotation_(mathematics)#Matrix_algebra计算旋转的数学,你可以恢复Pete建议的方法。 – vad 2010-05-28 17:27:46

0

所以你想知道代表矢量u的线的哪一侧在矢量v的头部位置?我打谷歌(查询:point on side of line)的算法;发现一吨,this one(阅读第二篇文章)没有三角函数。

0

如果您正在旋转,可以使用简单的三角函数来计算旋转。

还记得高中触发类的三条规则吗? “SOH CAH TOA”响铃?这是他们的意思:

鉴于直角三角形:

A * 
    | \ 
    | \ 
    | \ 
B *----* C 

SOH:

通过ΔABC形成的任何角度的正弦等于相反侧长度除以长度的斜边。例如,为了找到在点C处形成的角度:

   __ 
      AB 
SIN(∠BCA) = ---- 
      __ 
      AC 

CAH:

通过ΔABC形成的任何角度的余弦等于所述相邻边的长度(不是斜边)除以斜边的长度。因此,例如,以找到在点C处形成的角度:

   __ 
      BC 
COS(∠BCA) = ---- 
      __ 
      AC 

TOA:

通过ΔABC形成的任何角度的正切值等于相对侧的由分割长度相邻边的长度(而不是斜边)。因此,举例来说,找到C点处形成的角度:

   __ 
      AB 
TAN(∠BCA) = ---- 
      __ 
      BC 

所以,如果你能确定这些测量,可以确定休息,只要你认为所形成的直角三角形坐标和轴。