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