2D中的三乘积以构建垂直线



我一直在遵循本教程的碰撞检测,其中它使用2D三重产品来构造垂直线。使用vector a c 0 c 1 和vector b c 0 到原始。主张是 a,b,a 的三级产品垂直于 a ,并且在原点的方向上。我不明白为什么这有效或如何在2D中使用跨产品。

我看了实现,我绝对不会称其为三重产品。通常的三重产品使用跨产品,然后使用点产品,而这是连续的两个跨产品,其中3D矢量是通过将零添加到2D向量来构建的。那会发生什么?

a×b =(ax,ay,0(×(bx,by,0(=(0,0,ax∙by -ay ay bx(
…×a =(ax∙by -ay∙bx(∙(ay,-ax,0(

因此,结果是(Ay,--ax(的一些倍数。这确保了这确实垂直于A。因此,对于A和B不平行,一个方向将给出一个方向,另一个方向将给出另一个符号。使用实验来决定哪个是哪个是您不想更深入的思考。

作为旁注,我不会这样做。相反,我将依靠经典的方向谓词。但是我还没有阅读所有这些文章,所以也许有一个理由不这样做。如果您想了解更多,请观察确定性

|Ax Bx Cx|
|Ay By Cy|
| 1  1  1|

(顺便说一句,如果用1而不是0增强,则等于三乘积(a×b(∙C,等于两倍的三角形面积,由a,b形成的三角形区域,C。所以标志告诉您上述三角的方向。您可以使用此此类要计算符号OAB,OBC,OCA。如果他们都同意,原点被包含。请注意,诸如行列式| OAB |之类的事情= ax∙by -ay∙bx 非常易于计算。

var oab = Math.sign(a.x*b.y - a.y*b.x);
var obc = Math.sign(b.x*c.y - b.y*c.x);
var oca = Math.sign(c.x*a.y - c.y*a.x);
if (Math.abs(oab + obc + oca) == 3) {
  return "contains origin";
}
if (oab * obc * oca == 0) {
  return "origin is on the boundary";
}
var abc = Math.sign(a.x*b.y + b.x*c.y + c.x*a.y -
                    a.x*c.y - b.x*a.y - c.x*b.y);
if (oab != abc) {
  return "outside line ab";
} else if (obc != abc) {
  return "outside line bc";
} else {
  return "outside line ac";
}

最新更新