104

来自维基百科:

叉积是在三维欧几里得空间中对两个向量进行二元运算,产生另一个向量,该向量垂直于包含两个输入向量的平面。

鉴于定义仅在三个(或七个、一和零)维度中定义,如何计算两个二维向量的叉积?

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

实现 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 类并且不知道使用哪种方法。

4

6 回答 6

122

实现 1 返回将由输入向量的常规 3D 叉积产生的向量的大小,将其 Z 值隐式设为 0(即将 2D 空间视为 3D 空间中的平面)。3D 叉积将垂直于该平面,因此具有 0 个 X 和 Y 分量(因此返回的标量是 3D 叉积向量的 Z 值)。

请注意,由 3D 叉积产生的向量的大小也等于两个向量之间的平行四边形的面积,这为实现 1 提供了另一个目的。另外,这个区域是有符号的,可以用来判断从V1旋转到V2是逆时针方向还是顺时针方向。还应注意,实现 1 是由这两个向量构建的 2x2 矩阵的行列式。

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

请注意,3D 欧几里得空间在叉积运算下是封闭的——也就是说,两个 3D 向量的叉积返回另一个 3D 向量。上述两种 2D 实现方式都与此不一致。

希望这可以帮助...

于 2008-10-28T16:39:04.160 回答
78

简而言之:这是数学黑客的简写符号。

长解释:

您不能在 2D 空间中对向量进行叉积。那里没有定义操作。

然而,假设 2D 向量通过将其 z 坐标设置为零来扩展为 3D,则评估两个向量的叉积通常很有趣。这与在 xy 平面上使用 3D 矢量相同。

如果您以这种方式扩展向量并计算这种扩展向量对的叉积,您会注意到只有 z 分量具有有意义的值:x 和 y 将始终为零。

这就是为什么结果的 z 分量通常简单地作为标量返回的原因。例如,此标量可用于查找 2D 空间中三个点的绕组。

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

于 2008-10-28T16:40:55.560 回答
12

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

| 斧头 | = |一个| . |b| . 正弦(θ)

或者

正弦(θ) = | 斧头 | / (|a| . |b|)

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

于 2008-10-28T16:58:27.290 回答
6

实现 1 是两个向量的perp 点积。我所知道的关于 2D 图形的最佳参考是出色的Graphics Gems系列。如果您正在从事 2D 临时工作,那么拥有这些书籍非常重要。第 IV 卷有一篇名为“Perp Dot 产品的乐趣”的文章,其中介绍了它的很多用途。

perp 点积的一个主要用途是获得sin两个向量之间角度的缩放,就像点积返回cos角度的缩放一样。当然,您可以同时使用点积perp 点积来确定两个向量之间的角度。

是关于它的帖子,这Wolfram Math World 文章。

于 2015-03-15T12:13:45.707 回答
4

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

来自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;
}
于 2018-06-05T15:33:46.843 回答
3

我在计算中使用 2d 叉积来找到对象的新正确旋转,该对象在相对于其质心的任意点处受到力矢量的作用。(标量 Z 一。)

于 2009-02-09T11:09:25.067 回答