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

C++ 这段代码如何从两个2D向量的叉积中检索2D向量?,c++,vector,geometry,2d,cross-product,C++,Vector,Geometry,2d,Cross Product,我迷路了。我一直在尝试在以下位置实现此代码: 然而,我不知道两个2D向量之间的叉积怎么可能也会产生2D向量。这对我来说毫无意义。这也出现在一些多边形和直线相交的例子中,在《实时碰撞检测》这本好书中,代码中甚至出现了二维向量之间的标量三元组(例如,参见第189页) 问题是,据我所知,两个二维向量的伪叉积只能产生一个标量(v1.xv2.y-v1.yv2.x),或者如果一个加上两个零,最多只能产生一个三维向量,因为该标量表示Z维。但它如何生成二维向量呢 我不是第一个问这个问题的人,巧合的是,当我尝试使

我迷路了。我一直在尝试在以下位置实现此代码:

然而,我不知道两个2D向量之间的叉积怎么可能也会产生2D向量。这对我来说毫无意义。这也出现在一些多边形和直线相交的例子中,在《实时碰撞检测》这本好书中,代码中甚至出现了二维向量之间的标量三元组(例如,参见第189页)

问题是,据我所知,两个二维向量的伪叉积只能产生一个标量(v1.xv2.y-v1.yv2.x),或者如果一个加上两个零,最多只能产生一个三维向量,因为该标量表示Z维。但它如何生成二维向量呢

我不是第一个问这个问题的人,巧合的是,当我尝试使用相同的代码示例时:但是,正如很容易看到的,答案、更新时的原始问题以及该线程中的注释最终变得相当混乱,如果我敢这么说的话

有人知道如何从两个二维向量的叉积中得到这些二维向量吗?如果要提供代码,我可以处理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);
....
int IntersectLineQuad(点p、点q、点a、点b、点c、点d、点r)
{
向量pq=q-p;
向量pa=a-p;
向量pb=b-p;
向量pc=c-p;
//通过先测试对角线来确定要测试的三角形
向量m=交叉(pc,pq);
浮点数v=点(pa,m);//标度数(pq,pa,pc);
如果(v>=0.0f){
//基于三角形abc的测试交点
浮点u=-Dot(pb,m);//ScalarTriple(pq,pc,pb);
如果(u<0.0f)返回0;
浮点数w=浮点数(pq、pb、pa);
....
例如,他们似乎在谈论3d空间中的三角形:

因为三角形可以在三维空间中以任何方式定向

因此,他们所谈论的所有向量都是3D向量,所有的文本和代码都是完全有意义的。注意,即使对于二维向量,所有的东西也都是有意义的,如果你把一个叉积看作是一个指向屏幕的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,无论是
cp1
还是
cp2
都是指向屏幕外的向量,(3d)点积正是您需要检查的;只检查相应Z组件的积是相同的。如果一切都是3d,这也是正确的。(尽管我只需编写
返回点积(cp1,cp2)>=0

对于
int IntersectLineQuad()
,我可以猜测情况是相同的:
Quad
,无论它是什么,都是一个3d对象,以及代码中的
向量和
点。但是,如果您添加更多关于此函数应该做什么的详细信息,这将有所帮助


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

您所说的是“同侧技术”,对吗?XY平面中两个3d向量的叉积是平行于Z轴的向量。两个2d向量的叉积2d是3d叉的Z分量,因此,这里提到的点积可以通过简单地乘以两个2d叉的值来获得(即,对平行于Z轴且彼此平行的3d叉进行点积).谢谢你的评论。所以,是的,这就是我想说的技巧。你说的是,点积只是2个2D向量的叉积所给出的两个标量的乘积?但是看看我刚才在原始问题中包含的书中的例子。在这个例子中,我应该把整个向量相乘2D向量pa由pc和pq的叉积产生的标量表示?@dbc注意,在提供的示例中,作者将2D向量pc和pq的叉积存储在一个名为“m”的向量中。如果我直接按照您的建议,简单地对两个2D向量之间的叉积进行常规计算,请将其保存在“m”中(将其声明为浮点)然后直接乘以“m”和向量“pa”,再乘以“v”不能像示例中那样是浮点。我使用您的原始问题撰写了我的评论,该问题没有基于链接算法的代码示例。更新中的代码示例似乎与该算法不一致——这是完全不同的。它似乎与3d向量而不是2d向量一起工作。感谢您的详细说明!因此,请不要这正是让我困惑的部分:“如果你取[B-A]和[p-A]的叉积,你会得到一个指向屏幕外的向量”。这只适用于二维环境,而不适用于三维环境。但无论如何,我认为你的观点很好,这是显而易见的,但我以前没有完全意识到。无论示例代码是关于三维线段/四边形交点的,我都可以使用相同的代码作为起点,但在Z轴上放零,然后再调用一些优化(即在2D情况下丢弃不必要的东西)