zoukankan      html  css  js  c++  java
  • 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位于球面上。
  • 相关阅读:
    java TreeSet的排序之定制排序
    java TreeSet的排序之自然排序
    java TreeSet
    java Set接口(元素不可以重复)
    poj 3735 Training little cats(构造矩阵)
    进程创建/退出父子关系的调整
    安装R语言的包的方法
    项目搭建之路(上)
    为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
    机器学习之梯度下降法
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/13277367.html
Copyright © 2011-2022 走看看