2

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

但是,我不知道两个二维向量之间存在的叉积怎么可能导致二维向量。这对我来说没有意义。这也出现在多边形和线之间相交的一些示例中,在精美的“实时碰撞检测”一书中 - 代码中甚至出现了二维向量之间的标量三元组(例如,参见第 189 页)。

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

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

有谁知道我应该如何从两个二维向量的叉积中得到这些二维向量?如果要提供代码,我可以处理 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);
....
4

1 回答 1

1

对于您链接的页面,他们似乎在谈论3d 空间中的三角形:

因为三角形可以在 3d 空间中以任何方式定向,...

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

如果你取 [BA] 和 [pA] 的叉积,你会得到一个指向屏幕外的向量。

他们的代码也是正确的,对于 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 情况下工作。

于 2015-09-30T08:04:26.597 回答