RTCD

RTCD - 3.1 A math and geometry primer - matrix摘录

Real-Time Collision Detection 阅读笔记。

3.1.6 行列式预判

判断2D三角形的方向

已知三角形的三个顶点,(A = (a_x,a_y)), (B = (b_x, b_y)), (C = (c_x,c_y)),定义ORIENTED2D(A,B,C)如下:

[ORIENT2D(A,B,C) = igg | egin{array}{l} a_x & a_y & 1 \ b_x & b_y & 1 \ c_x & c_y & 1 end{array} igg | = igg | egin{array}{l} a_x - c_x & a_y - c_y \ b_x - c_x & b_y - c_y end{array} igg | ]

  • 如果ORIENT2D(A,B,C) > 0,那么C点位于有向线段的左边;三角形ABC,是逆时针排序;
  • 如果ORIENT2D(A,B,C) < 0,那么C点位于有向线段的右边;三角形ABC,是顺时针排序;
  • 如果ORIENT2D(A,B,C) = 0,那么三个点共线。

因此可以通过上面矩阵的方式定义一条通过AB点的直线,如下:

[L(x,y) = igg | egin{array}{l} a_x & a_y & 1 \ b_x & b_y & 1 \ x & y & 1 end{array} igg | ]

判断一个点和3D三角形的关系

已知三角形的三个点,(A=(a_x,a_y,a_z)), (B = (b_x, b_y, b_z)), (C=(c_x, c_y, c_z)),和一个单独的点(D = (d_x, d_y, d_z)), 定义ORIENT3D(A,B,C,D)如下:

[ORIENT3D(A,B,C,D)= left[ egin{array}{cccc} a_x & a_y & a_z & 1 \ b_x & b_y & b_z & 1 \ c_x & c_y & c_z & 1 \ d_x & d_y & d_z & 1 end{array} ight] = left[ egin{array}{ccc} a_x - d_x & a_y - d_y & a_z - d_z \ b_x - d_x & b_y - d_y & b_z - d_z \ c_x - d_x & c_y - d_y & c_z - d_z end{array} ight] \ = (A - D)cdot ((B-D) imes (C-D)) ]

  • 如果ORIENT3D(A,B,C,D) < 0,那么从D点看过去,三角形ABC是逆时针排序;
  • 如果ORIENT3D(A,B,C,D) > 0,那么从D点看过去,三角形ABC是顺时针排序;
  • 如果ORIENT3D(A,B,C,D) = 0,那么四个点共面。

上面的形式可以定义一个经过ABC三点的平面方程,如下:

[P(x,y,z) = left[ egin{array}{cccc} a_x & a_y & a_z & 1 \ b_x & b_y & b_z & 1 \ c_x & c_y & c_z & 1 \ x & y & z & 1 end{array} ight] ]

判断一个点和三角形外接圆之间的关系

已知三角形的三个顶点,(A = (a_x,a_y)), (B = (b_x, b_y)), (C = (c_x,c_y)),和另一个点(D=(d_x,d_y))。定义INCIRCLE2D(A,B,C,D)如下:

[INCIRCLE2D(A,B,C,D) = left[ egin{array}{cccc} a_x & a_y & a_x^2 + a_y^2 & 1 \ b_x & b_y & b_x^2 + b_y^2 & 1 \ c_x & c_y & c_x^2 + c_y^2 & 1 \ d_x & d_y & d_x^2 + d_y^2 & 1 end{array} ight] \ = left[ egin{array}{cccc} a_x - d_x & a_y - d_y & (a_x - d_x)^2 + (a_y - d_y)^2 \ b_x - d_x & b_y - d_y & (b_x - d_x)^2 + (b_y - d_y)^2 \ c_x - d_x & c_y - d_y & (c_x - d_x)^2 + (c_y - d_y)^2 end{array} ight] ]

假设ABC为逆时针顺序排列,即ORIENT2D(A,B,C) > 0

  • 如果INCIRC LE2D(A,B,C,D) > 0,D位于三角形外接圆内部;
  • 如果INCIRC LE2D(A,B,C,D) < 0,D位于三角形外接圆外部;
  • 如果INCIRC LE2D(A,B,C,D) = 0,D位于三角形外接圆上。

同理可的ORIENT2D(A,B,C) < 0时的情况。

判断一个点和三棱锥外接球的关系

已知三棱锥的四个点,(A=(a_x,a_y,a_z)), (B = (b_x, b_y, b_z)), (C=(c_x, c_y, c_z))(D = (d_x, d_y, d_z)), 和一个单独的点(E = (e_x,e_y,e_z))。定义INSPHERE(A,B,C,D)如下:

[INSPHERE(A,B,C,D,E) = left[ egin{array}{ccccc} a_x & a_y & a_z & a_x^2 + a_y^2 + a_z^2 & 1 \ b_x & b_y & b_z & b_x^2 + b_y^2 + b_z^2 & 1 \ c_x & c_y & c_z & c_x^2 + c_y^2 + c_z^2 & 1 \ d_x & d_y & d_z & d_x^2 + d_y^2 + d_z^2 & 1 \ e_x & e_y & e_z & e_x^2 + e_y^2 + e_z^2 & 1 end{array} ight] \ = left[ egin{array}{cccc} a_x - e_x & a_y - e_y & a_z - e_z & (a_x - e_x)^2 + (a_y - e_y)^2 + (a_z - e_z)^2 \ b_x - e_x & b_y - e_y & b_z - e_z & (b_x - e_x)^2 + (b_y - e_y)^2 + (b_z - e_z)^2 \ c_x - e_x & c_y - e_y & c_z - e_z & (c_x - e_x)^2 + (c_y - e_y)^2 + (c_z - e_z)^2 \ d_x - e_x & d_y - e_y & d_z - e_z & (d_x - e_x)^2 + (d_y - e_y)^2 + (d_z - e_z)^2 end{array} ight] ]

如果ORIENT3D(A,B,C,D) > 0

  • 如果INSPHERE(A,B,C,D,E) > 0,E位于球的内部;
  • 如果INSPHERE(A,B,C,D,E) < 0,E位于球的外部;
  • 如果INSPHERE(A,B,C,D,E) = 0,E位于球面上。
原文地址:https://www.cnblogs.com/grass-and-moon/p/13277367.html