计算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中,如果a
和b
预先知道是单位vector,那么该函数的结果就是正弦()值。
我在我的计算中使用了二维交叉乘积,以便为相对于质量中心的任意点处的力vector所作用的对象find新的正确旋转。 (标量Z一)
实现1是这两个向量的perp点乘积 。 我知道的2Dgraphics的最好的参考是杰出的graphicsgem系列。 如果你从事二维的工作,这些书是非常重要的。 第四卷有一篇名为“Perp Dot产品的乐趣”的文章,其中有很多用处。
perp dot产品的一个主要用途是获得两个vector之间angular度的缩放sin
,就像点积返回缩放的angular度cos
。 当然你可以使用点积和点积来确定两个向量之间的angular度。
这里有一篇文章, 这里是Wolfram Math World的文章。