【发布时间】:2010-09-19 15:02:07
【问题描述】:
来自维基百科:
叉积是三维欧几里得空间中两个向量的二元运算,产生另一个向量,该向量垂直于包含两个输入向量的平面。
鉴于定义仅定义在三个 (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类,不知道用什么方法。
【问题讨论】:
-
实施 2 是错误的。您需要两个向量来形成叉积。
-
实现 2 将给定的向量 v 旋转 -90 度。在
x' = x cos θ - y sin θ和y' = x sin θ + y cos θ中替换-90。此实现的另一种变体是return Vector2D(-v.Y, v.X);,它会将 v 旋转 +90 度。 -
@legends2k:值得注意的是,实现 2 是 using the determinant to evaluate the cross product 的扩展:只需删除最后一行和最后一列。这样的扩展总是有
N-1操作数N维度。 -
实现 1 计算叉积的幅度。
-
@MateenUlhaq 之类的,它是“signed 幅度”
标签: language-agnostic math vector 2d