基础知识

如何判断一个点在三角形(矩形、扇形)内

判断点在三角形内

重心法

重心法

面积法

  • 如图:S▲ABP + S▲APC + S▲BPC = S▲ABC
  • 利用叉乘求出各三角形面积即可(叉积的绝对值就是A和B为两边所形成的平行四边形的面积)

叉乘法

  • 首先看一下这个问题,如何判断某两个点在某条直线的同一侧

判断两点是否在同一侧

  • 根据向量的叉乘以及右手螺旋定则,AB x AM 的方向为向外指出屏幕,AB x AN 也是向外指出屏幕,但 AB x AO 的方向是向内指向屏幕,因此 M、N 在直线 AB 的同侧,M、O在直线AB的另一侧。
  • 实际计算时,只需要考虑叉积的数值正负。假设以上各点坐标为A(0,0), B(4,0), M(1,2), N(3,4), O(3,-4), 则:
    1. AB x AM = (4, 0) x (1, 2) = 4 · 2 - 0 · 1 = 8
    2. AB x AN = (4, 0) x (3, 4) = 4 · 4 – 0 · 3 = 16
    3. AB x AO = (4, 0) x (3, -4) = 4 · -4 – 0 · 3 = –16
  • 由上面的数值可知,可以根据数值的正负判断叉乘后向量的方向。
  • 回到原来的问题上。
  • 沿逆时针方向,三角形两两顶点构成三个向量,比如AB,BC,CA,分别用这三个向量与起点和P的交点构成的向量求叉乘,如ABxAP, BCxBP, CAxCP
  • 由右手定则,如果三个结果都是正的,说明这个点都在向量的左边,可以推导得出这个点在三角形内。否则只要有一个是负数,就说明在右边,在三角形外了。

如何判断一条射线是否与一个三角形相交

  • 传统方法
    1. 首先判断射线是否与三角形所在的平面相交,如果相交求出交点,进而判断交点是否在三角形内;
    2. 如果不相交或者交点不在三角形之内,则射线一定不与三角形相交。

      平面方程

      点法式

      • 已知平面上某个点坐标(维数 ≥ 3)及该平面的法向量,则该平面方程为:
      • A(x - x0) + B(y - y0) + C(z - z0) = 0
      • 例如:某平面有一点为 u(1, 1, 2),及该平面的法向量 n = (-1, -2, 1)
      • 设:x0 = 1,y0 = 1,z0 = 2
      • 则有:-1(x - 1) + -2(y - 1) + 1(z - 2) = 0
      • 化简后:-x - 2y + z + 1 = 0,即为平面方程

      一般式

      已知平面两点

      • 求该平面的方程,平面方程为:
      • Ax + By + Cz + D = 0
      • 例如:某平面有两点分别为 u(1, 1, 2), v(-1, -2, -3),求该平面的方程
      • 将两点视作两个向量, 两个向量做叉乘,求得垂直于两个向量所在平面的法向量
      • 第一步:u x v,求法向量
      • 第二步:将法向量代入A,B,C
        平面两点

      已知平面三点

      • 求该平面的方程,平面方程为:
      • Ax + By + Cz + D = 0
      • A = (y2 - y1) · (z3 - z1) - (z2 - z1) · (y3 - y1)
      • B = (x3 - x1) · (z2 - z1) - (x2 - x1) · (z3 - z1)
      • C = (x2 - x1) · (y3 - y1) - (x3 - x1) · (y2 - y1)
      • D = -(A · x1 + B · y1 + C · z1)
      • 例:某平面有三点分别为 u(1, 1, 2), v(-1, -2, -3), w(0, 1, -1),求该平面的方程
      • 求解后得:A = 9, B = -1, C = -3, D = -2
      • 平面方程为:9x - y - 3z - 2 = 0
        平面三点
  • Moller-Trumbore 算法

如何判断两个三角形是否相交

  • 如果两个三角形相交,必定至少其中一个三角形的一条边穿过了另一个三角形的内部;
  • 把边当作光线去跟另一个三角形求交。如果三条边只要有一条边跟三角形有交点,即可判断两三角形相交,当然关键是要判断计算出来的 t 是否合理,是否位于边长范围之内。

如何判断点是否在扇形里

判断点是否在扇形里

如何判断一条射线是否与一个圆相交

射线是否穿过圆
射线是否穿过圆