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

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) = \bigg | \begin{array}{l} a_x & a_y & 1 \\ b_x & b_y & 1 \\ c_x & c_y & 1 \end{array} \bigg | = \bigg | \begin{array}{l} a_x - c_x & a_y - c_y \\ b_x - c_x & b_y - c_y \end{array} \bigg | \]

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

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

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

判断一个点和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[ \begin{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} \right] = \left[ \begin{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} \right] \\ = (A - D)\cdot ((B-D)\times (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[ \begin{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} \right] \]

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

已知三角形的三个顶点,\(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[ \begin{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} \right] \\ = \left[ \begin{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} \right] \]

假设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[ \begin{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} \right] \\ = \left[ \begin{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} \right] \]

如果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位于球面上。
posted @ 2020-07-10 06:55  grassofsky  阅读(463)  评论(0编辑  收藏  举报