计算2Dvector的交叉产品

从维基百科:

叉积是在三维欧几里得空间中的两个向量上的二元运算,其导致与包含两个input向量的平面垂直的另一向量。

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

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

实现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(vY, -vX); } 

为什么不同的实现? 我将使用什么标量实现? 我会用什么vector实现?

我问的原因是我自己写了一个Vector2D类,不知道要使用哪种方法。

实现1返回由input向量的规则三维交叉乘积产生的向量的量值,将其Z值隐含地作为0(即,将2D空间视为3D空间中的平面)。 3D交叉乘积将垂直于该平面,因此具有0个X和Y分量(因此返回的标量是3D交叉乘积vector的Z值)。

请注意,由3D叉积得到的vector的大小也等于两个vector之间的平行四边形的面积 ,这给实现1另外一个目的。 另外,这个区域是有符号的,可以用来确定从V1到V2的旋转是逆时针还是顺时针方向。 还应该注意的是,实现1是由这两个向量构build的2x2matrix的行列式。

实现2返回垂直于仍然在同一2D平面中的inputvector的vector。 不是古典意义上的交叉产品,而是“给我一个垂直向量”的意义。

请注意,在交叉乘积运算下,3D欧几里德空间是闭合的 – 也就是说,两个3Dvector的叉积返回另一个3Dvector。 上述的两个2D实现都与这种或那种方式不一致。

希望这可以帮助…

简而言之:这是一个math黑客的简写符号。

长解释:

您不能在二维空间中使用vector进行交叉产品。 这里没有定义操作。

然而,假设通过将它们的z坐标设置为零来将2Dvector扩展到3D,评估两个vector的叉积通常是有趣的。 这与在xy平面上使用3Dvector一样。

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

这就是为什么结果的z分量常常简单地作为标量返回的原因。 这个标量例如可以用来find二维空间中三个点的缠绕。

从纯粹的mathangular度来看,二维空间中的交叉积不存在,标量版本是黑客,并且返回二维向量的二维交叉积是毫无意义的。

叉积的另一个有用的性质是它的幅度与两个vector之间angular度的正弦值有关:

| axb | = | a | 。 | B | 。 正弦(THETA)

要么

正弦(θ)= | axb | /(| a |。| b |)

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

我在我的计算中使用了二维交叉乘积,以便为相对于质量中心的任意点处的力vector所作用的对象find新的正确旋转。 (标量Z一)

实现1是这两个向量的perp点乘积 。 我知道的2Dgraphics的最好的参考是杰出的graphicsgem系列。 如果你从事二维的工作,这些书是非常重要的。 第四卷有一篇名为“Perp Dot产品的乐趣”的文章,其中有很多用处。

perp dot产品的一个主要用途是获得两个vector之间angular度的缩放sin ,就像点积返回缩放的angular度cos 。 当然你可以使用点积点积来确定两个向量之间的angular度。

这里有一篇文章, 这里是Wolfram Math World的文章。