代码之家  ›  专栏  ›  技术社区  ›  Zack The Human Kunal

计算二维矢量的叉积

  •  62
  • Zack The Human Kunal  · 技术社区  · 16 年前

    维基百科:

    交叉积是对 三维 欧几里得空间,产生另一个垂直于包含两个输入向量的平面的向量。

    假设定义只定义在三个( or seven, one and zero )维度,如何计算两个二维向量的叉积?

    我看到了两个实现。一个返回一个新的向量(但只接受一个向量),另一个返回一个标量(但是两个向量之间的计算)。

    实现1(返回标量):

    float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
    {
        return (v1.X*v2.Y) - (v1.Y*v2.X);
    }
    

    实现2(返回向量):

    Vector2D CrossProduct(const Vector2D & v) const
    {
        return Vector2D(v.Y, -v.X);
    }
    

    为什么会有不同的实现?我使用标量实现的目的是什么?我使用向量实现的目的是什么?

    我问的原因是因为我自己在写一个vector2d类,不知道使用哪种方法。

    6 回复  |  直到 6 年前
        1
  •  91
  •   Jesse Cluff Drew Hall    12 年前

    实现1返回由输入向量的常规三维交叉积产生的向量的大小,将其z值隐式取为0(即,将二维空间视为三维空间中的平面)。三维交叉积将垂直于该平面,因此具有0个x&y分量(因此返回的标量是三维交叉积向量的z值)。

    请注意,由三维叉积产生的矢量的大小也等于 地区 两个向量之间的平行四边形,这为实现1提供了另一个目的。此外,该区域有符号,可用于确定从v1到v2的旋转方向是逆时针还是顺时针。还应注意,实现1是从这两个向量构建的2x2矩阵的行列式。

    实现2返回一个垂直于输入向量的向量,该向量仍在同一个二维平面中。不是经典意义上的叉积,而是“给我一个垂直向量”意义上的一致性。

    注意,三维欧几里得空间在叉积运算下是闭合的——也就是说,两个三维向量的叉积返回另一个三维向量。上述两种二维实现在某种程度上都与之不一致。

    希望这有帮助…

        2
  •  49
  •   Tom    7 年前

    简而言之: 这是一个数学黑客的速记法。

    详细解释:

    在二维空间中,不能用向量做叉积。操作没有在那里定义。

    然而,假设二维矢量通过将其Z坐标设置为零扩展到三维,则评估两个矢量的交叉积通常很有趣。这与在xy平面上使用三维矢量相同。

    如果以这种方式扩展向量并计算这样一个扩展向量对的叉积,您会注意到只有z分量有一个有意义的值:x和y总是零。

    这就是为什么结果的z分量通常只是作为一个标量返回的原因。例如,该标量可用于在二维空间中查找三个点的缠绕。

    从纯数学的角度来看,二维空间中的叉积不存在,标量版本是hack,返回二维矢量的二维叉积根本没有意义。

        3
  •  12
  •   Alnitak    16 年前

    交叉积的另一个有用特性是,它的大小与两个向量之间的角度的正弦有关:

    | A x B=A。②B。正弦(θ)

    正弦(theta)=A x B/(A)。(b)

    因此,在上面的实现1中,如果 a b 预先知道是单位向量,那么函数的结果就是sine()值。

        4
  •  4
  •   Bill Burdick    9 年前

    实施1是 垂直点乘 两个向量中的一个。我所知道的最好的二维图形参考是 Graphics Gems 系列。如果你在做刮痕二维工作,它是 真的? 有这些书很重要。第四卷有一篇文章叫做“perp-dot产品的乐趣”,它有很多用途。

    一个主要用途 垂直点乘 是为了得到比例 sin 两个向量之间的角度,就像 点积 返回缩放的 cos 角度的当然你可以用 点积 垂直点乘 一起确定两个向量之间的角度。

    Here 是一个帖子 here 是Wolfram数学世界文章。

        5
  •  3
  •   Olai    16 年前

    我在计算中使用了二维叉积,来找到一个物体在一个力矢量作用下,相对于其质心的任意点上的新的正确旋转。(标量z 1。)

        6
  •  1
  •   Bram    6 年前

    一个有用的二维向量运算是一个返回标量的叉积。我用它来看看多边形中的两条连续边是向左弯曲还是向右弯曲。

    Chipmunk2D 来源:

    /// 2D vector cross product analog.
    /// The cross product of 2D vectors results in a 3D vector with only a z component.
    /// This function returns the magnitude of the z value.
    static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
    {
            return v1.x*v2.y - v1.y*v2.x;
    }