我迷路了。我一直在尝试实现这个代码:http://www.blackpawn.com/texts/pointinpoly/default.html
然而,我不知道两个2D向量之间的叉乘如何可能也会产生一个2D向量。这对我来说没有意义。这也出现在一些多边形和直线相交的例子中,在一本好书"实时碰撞检测"中,二维矢量之间的标量三元组甚至出现在代码中(例如,参见第189页)。
问题是,据我所知,两个2D向量的伪叉乘只能产生一个标量(v1.xv2.y-v1.yv2.x),或者如果加两个零,最多只能产生一个3D向量,因为该标量代表Z维度。但它是如何得到二维矢量的呢?
我不是第一个问这个问题的人,巧合的是,当试图使用相同的代码示例时:2个2D向量的叉积然而,可以很容易地看到,答案,更新时的原始问题和该线程中的评论最终变得相当混乱,如果我敢这么说的话。
有人知道如何从两个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);
....
对于你链接的页面,他们似乎在谈论3d空间中的三角形:
因此他们讨论的所有向量都是3d向量,所有的文本和代码都很有意义。注意,即使是2d向量,如果你认为向量积是指向屏幕外的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的,这也是正确的。(虽然我会简单地写return DotProduct(cp1, cp2) >= 0
)
对于int IntersectLineQuad()
,我可以猜测情况是相同的:Quad
,不管它是什么,是一个3d对象,以及Vector
和Point
在代码中。但是,如果您添加更多关于该函数应该做什么的细节,将会有所帮助。
事实上,很明显,在2d中描述的任何问题都可以扩展到3d,所以任何在3d中有效的方法也将适用于2d情况,你只需要想象第三个轴指向屏幕外。所以我认为这是一种有效的(尽管令人困惑)技术,可以完全用3d的形式来描述2d问题。您可能需要做一些额外的工作,因为在这种方法中有些值总是为零,但反过来(几乎)相同的代码也将在一般的3d情况下工作。