这段代码如何从两个2D向量的交叉积中检索2D向量?

时间:2015-09-30 07:10:09

标签: c++ vector geometry 2d cross-product

我迷失了。我一直在尝试在http://www.blackpawn.com/texts/pointinpoly/default.html

上实现此代码

然而,我不知道在两个2D矢量之间存在的交叉积可能如何也可能导致2D矢量。这对我来说没有意义。这也出现在多边形和线条之间的交叉的一些例子中,在精美的书“实时碰撞检测”中 - 其中甚至2D矢量之间的标量三元组出现在代码中(例如,参见第189页)。

问题在于,就我所能想到的而言,两个2D向量的伪交叉产品只能产生一个标量(v1.x v2.y-v1.y v2.x)或至多在3D矢量中添加两个零,因为该标量代表Z维度。但是如何才能产生2D矢量呢?

我不是第一个问这个问题的人,而且恰巧是在尝试使用相同的代码示例时:Cross product of 2 2D vectors但是,可以很容易地看到答案,更新时的原始问题以及如果我敢这么说的话,那个帖子最终会变得一团糟。

有谁知道我应该如何从两个2D矢量的交叉积中得到这些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);
....

1 个答案:

答案 0 :(得分:1)

对于the page you linked,似乎他们在3d空间中讨论了一个三角形

  

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

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

  

如果你选择[B-A]和[p-A]的叉积,你会得到一个指向屏幕的矢量。

他们的代码也是正确的,包括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情况。