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位于球面上。