此代码如何从两个二维向量的叉积中检索二维向量?

How can this code retrieve a 2D vector from a cross-product of two 2D vectors?

我迷路了。我一直在尝试在以下位置实施此代码:http://www.blackpawn.com/texts/pointinpoly/default.html

但是,我不知道两个 2D 向量之间存在的叉积怎么可能也产生 2D 向量。这对我来说没有意义。这也出现在多边形和线之间的一些交叉示例中,在精美的书中 "Realtime Collision Detection" - 代码中甚至出现了二维向量之间的标量三元组(例如,参见第 189 页)。

问题是,据我所知,两个二维向量的伪叉积只能得到一个标量(v1.xv2.y -v1.yv2.x) 或最多在 3D 向量中,如果添加两个零,因为该标量表示 Z 维度。但它如何产生二维向量?

我不是第一个问这个问题的人,巧合的是,当我尝试使用相同的代码示例时:Cross product of 2 2D vectors但是,很容易看出,答案、更新后的原始问题和如果我敢这么说的话,该线程中的评论最终变得一团糟。

有谁知道我应该如何从两个二维向量的叉积中得到这些二维向量?如果要提供代码,我可以处理C#,JavaScript和一些C++。

编辑 - 这是我上面提到的书中的一段代码:

int IntersectLineQuad(Point p, Point q, Point a, Point b, Point c, Point d,     Point &r)
{
Vector pq = q - p;
Vector pa = a - p;
Vector pb = b - p;
Vector pc = c - p;
// Determine which triangle to test against by testing against diagonal     first
Vector m = Cross(pc, pq);
float v = Dot(pa, m); // ScalarTriple(pq, pa, pc);
if (v >= 0.0f) {
   // Test intersection against triangle abc
   float u = -Dot(pb, m); // ScalarTriple(pq, pc, pb);
   if (u < 0.0f) return 0;
   float w = ScalarTriple(pq, pb, pa);
....

对于the page you linked,好像他们说的是三角形in a 3d space:

Because the triangle can be oriented in any way in 3d-space, ...

因此他们谈论的所有向量都是 3d 向量,所有的文本和代码都非常有意义。请注意,如果您将叉积视为指向屏幕外的 3d 向量,即使对于 2d 向量,一切也都是有意义的。他们也在页面上提到了它:

If you take the cross product of [B-A] and [p-A], you'll get a vector pointing out of the screen.

他们的代码对于 2d 和 3d 情况也是正确的:

function SameSide(p1,p2, a,b)
    cp1 = CrossProduct(b-a, p1-a)
    cp2 = CrossProduct(b-a, p2-a)
    if DotProduct(cp1, cp2) >= 0 then return true
    else return false

对于 2d,cp1cp2 都是指向屏幕外的向量,(3d) 点积正是您需要检查的;仅检查相应 Z 分量的乘积是相同的。如果一切都是 3d,这也是正确的。 (虽然我会简单地写 return DotProduct(cp1, cp2) >= 0。)

对于int IntersectLineQuad(),我可以猜到情况是一样的:Quad,不管它是什么,都是一个3d对象,以及VectorPoint 在代码中。但是,如果您添加有关此功能应该做什么的更多详细信息,这将有所帮助。

事实上,很明显,2d 中陈述的任何问题都可以扩展到 3d,因此任何在 3d 中有效的方法也适用于 2d 情况,你只需要想象第三个轴指向出屏幕。所以我认为这是一种完全用 3d 术语描述 2d 问题的有效(尽管令人困惑)技术。您可能自己做了一些额外的工作,因为在这种方法中某些值将始终为零,但反过来(几乎)相同的代码也适用于一般的 3d 情况。