找到矢量旋转的最快方法

时间:2010-05-28 16:56:24

标签: python optimization math

我有两个2D矢量,比如u和v,由笛卡尔坐标定义。

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

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

我的测试用例:

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

4 个答案:

答案 0 :(得分:13)

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

不知道它是否快,但它很简洁

答案 1 :(得分:0)

一般想法:旋转x轴使其与v重合并检查u的新y坐标是否为正。

答案 2 :(得分:0)

所以你想知道代表向量的线的哪一侧你在向量v的头部的点是什么?我点击谷歌(查询:point on side of line)获取算法;发现吨,this one(读第二篇文章)没有三角法。

答案 3 :(得分: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

因此,如果你能确定这些测量中的任何一个,你可以确定其余的,只要你想到坐标和轴形成的直角三角形。