来自维基百科:
叉积是a中两个向量的二元运算三维欧几里得空间产生另一个向量,该向量垂直于包含两个输入向量的平面。
鉴于该定义仅定义为三个(或七、一和零 https://en.wikipedia.org/wiki/Seven-dimensional_cross_product#Consequences_of_the_defining_properties)维度,如何计算两个二维向量的叉积?
我见过两个实现。一个返回一个新向量(但只接受单个向量),另一个返回一个标量(但是两个向量之间的计算)。
实现 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类,并且不知道该使用哪种方法。
实现 1 返回由输入向量的常规 3D 叉积产生的向量的大小,将它们的 Z 值隐式地视为 0(即将 2D 空间视为 3D 空间中的平面)。 3D 叉积将垂直于该平面,因此具有 0 个 X 和 Y 分量(因此返回的标量是 3D 叉积向量的 Z 值)。
请注意,3D 叉积产生的向量的大小也等于area两个向量之间的平行四边形的形状,这为实现 1 提供了另一个目的。另外,这个区域是有符号的,可以用来判断从V1到V2的旋转是逆时针还是顺时针方向。还应该注意的是,实现 1 是从这两个向量构建的 2x2 矩阵的行列式。
实现 2 返回一个与输入向量垂直且仍在同一 2D 平面中的向量。不是经典意义上的叉积,但在“给我一个垂直向量”的意义上是一致的。
请注意,3D 欧几里得空间在叉积运算下是封闭的,即两个 3D 向量的叉积返回另一个 3D 向量。上述两种2D实现方式都与此不一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)