c++ - 此代码如何从两个二维 vector 的叉积中检索二维 vector ?

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

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

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

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

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

有谁知道我应该如何从两个二维 vector 的叉积中得到这些二维 vector ?如果要提供代码,我可以处理 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 ,他们似乎在谈论 3d 空间中的三角形:

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

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

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

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

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

关于c++ - 此代码如何从两个二维 vector 的叉积中检索二维 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859987/

相关文章:

c++ - 位模式匹配和替换

c++ - 可调用类成员检测器惯用法和 C++11 final

c++ - C++ 类的全局实例

java - 为什么 Vector 会出现 ConcurrentModificationException?

c++ - 计算 3D 平面的斜率

访问使用 OpenCV 的 C++ 共享库的 Java 程序

c++ - 我的 bad_alloc 从哪里来?

C++ - 在映射或 vector 中插入时出现段错误

geometry - 检查一个圆是否完全包含在其他圆的区域中的算法

objective-c - 计算 union 2 MKPolygons