图形学中常用计算几何总结

在做毕设过程中,进行三角网格处理的时候经常会遇到例如点与线段最短距离,点与三角形最短距离等计算,在这里汇总下,如遇到新的会不断更新。

常见几何计算

基础计算

向量点乘

向量点乘: a b = | a | | b | c o s θ
用途:向量点乘常用于判断向量是否垂直【垂直向量点乘为0】,向量的夹角大小。
几何意义:点乘以后是一个值,值的大小为向量模相乘再乘以 c o s 值。
代数计算: ( x 1 , y 1 , z 1 ) ( x 2 , y 2 , z 2 ) = x 1 x 2 + y 1 y 2 + z 1 z 2

向量叉乘

向量叉乘: | a × b | = | a | | b | s i n θ 即: | c | = | a × b | = | a | | b | s i n < a , b >
用途:向量叉乘常用于计算法线,计算体积面积等。
几何意义:叉乘得到的是一个向量,向量积的方向与这两个向量所在平面垂直,且遵守右手定则。
代数计算
假设 a = ( a x , a y , a z ) , b = ( b x , b y , b z ) ,则:
a × b = ( a y b z a z b y ) i + ( a z b x a x b z ) j + ( a x b y a y b x ) k
转化为三阶行列式:

| i j k a x a y a z b x b y b z |

二维情况:
二维的简化情况:
a × b = ( a x b y a y b x ) k

点和线之间计算

点是否在直线上

直线的两点为AB,判定点是C,只需要计算三角形ABC的面积,面积为0,代表三点在同一条线上。使用叉乘: a × b = | a | | b | s i n θ

点是否在线段上

  1. 判断点是否在直线AB上,判断过程同上。
  2. 点C需要在以AB为对角线的矩形内,这限制在AB线段内。【C的每一维坐标必须在AB之间】

点是否在三角形内部

  • 面积法
    三角形三个点ABC和点P。计算ABC面积,ABP面积,ACP面积,BCP面积,如果后三个面积相加等于ABC面积,说明在三角形内部。

  • 退化到二维:叉乘方向
    如果点在三角形内部,则按照逆时针,满足P在三条边的左边,可以根据叉乘方向判断,ABPA叉乘,如果三个叉乘方向都相同,说明在三角形内部。

点到直线的距离

  • 几何做法
    假设给出三个点,A,B和C,求点C到点A、B定出的直线间距离。首先计算向量CB和向量CA的叉乘,底边AB,得到点到直线距离。

    d = C B × C A A B

    注:叉乘的结果是平行四边形的面积,除以一条边,即可得到高,即点到直线的距离

  • 解析做法
    其中 A x 0 + B y 0 + C = 0 是直线方程:

    d = A x 0 + B y 0 + C A 2 + B 2

直线之间的距离

  • 几何做法
    在一条直线上选取一个点,在另外一条直线选取两点,转化为计算点到直线距离。

  • 解析做法
    只有两条直线相互平行,才有距离,因此解析方程的AB相同:

    d = C 2 C 1 A 2 + B 2

点到线段的距离

  1. 首先判断线段两点是否重合,如果重合,转化为点到点距离;
  2. 判断点是否在直线上,如果在直线上:进一步判断是否在线段内,如果在,距离为0;否则计算到两个顶点的距离,取较小值。
  3. 计算AC,BC的夹角,如果都为锐角,则最短距离即为点到直线距离。
  4. 否则,计算到两点的最近距离。

点到三角形距离

题设:P和三角形ABC
1. 判断三角形三个点是否重合,重合转为点到点距离;
2. 判断三角形是否有两点重合,重合转为点到线段距离;
3. 判断三角形是否构成:是否三点共线,如果共线计算点到两条线段ABAC的最短距离就可以。
3. 三角形内任意一点可以表示为: T = A + t 1 A B + t 2 A C t 1 , t 2 0~1之间而且 t 1 + t 2 1
4. 则对于PT垂直于ABAC可以得到两个方程,解方程可以得到 t 1 , t 2
5. 根据 t 1 , t 2 计算出垂足点,并判断是否在三角形内,如果在内,则距离即为PT
6. 否则,计算垂足点到三角形三条边的最短距离d,点到三角形最短距离:sqrt(d^2 + PT^2)

完整的代码见github地址

如有错误,欢迎指正~

猜你喜欢

转载自blog.csdn.net/hu694028833/article/details/80363012