在做毕设过程中,进行三角网格处理的时候经常会遇到例如点与线段最短距离,点与三角形最短距离等计算,在这里汇总下,如遇到新的会不断更新。
常见几何计算
基础计算
向量点乘
向量点乘:
。
用途:向量点乘常用于判断向量是否垂直【垂直向量点乘为0】,向量的夹角大小。
几何意义:点乘以后是一个值,值的大小为向量模相乘再乘以
值。
代数计算:
向量叉乘
向量叉乘:
即:
用途:向量叉乘常用于计算法线,计算体积面积等。
几何意义:叉乘得到的是一个向量,向量积的方向与这两个向量所在平面垂直,且遵守右手定则。
代数计算:
假设
,则:
转化为三阶行列式:
二维情况:
二维的简化情况:
点和线之间计算
点是否在直线上
直线的两点为AB,判定点是C,只需要计算三角形ABC的面积,面积为0,代表三点在同一条线上。使用叉乘:
点是否在线段上
- 判断点是否在直线AB上,判断过程同上。
- 点C需要在以AB为对角线的矩形内,这限制在AB线段内。【C的每一维坐标必须在AB之间】
点是否在三角形内部
面积法
三角形三个点ABC和点P。计算ABC面积,ABP面积,ACP面积,BCP面积,如果后三个面积相加等于ABC面积,说明在三角形内部。退化到二维:叉乘方向
如果点在三角形内部,则按照逆时针,满足P
在三条边的左边,可以根据叉乘方向判断,AB
和PA
叉乘,如果三个叉乘方向都相同,说明在三角形内部。
点到直线的距离
几何做法
假设给出三个点,A,B和C,求点C到点A、B定出的直线间距离。首先计算向量CB和向量CA的叉乘,底边AB,得到点到直线距离。
注:叉乘的结果是平行四边形的面积,除以一条边,即可得到高,即点到直线的距离解析做法
其中 是直线方程:
直线之间的距离
几何做法
在一条直线上选取一个点,在另外一条直线选取两点,转化为计算点到直线距离。解析做法
只有两条直线相互平行,才有距离,因此解析方程的AB相同:
点到线段的距离
- 首先判断线段两点是否重合,如果重合,转化为点到点距离;
- 判断点是否在直线上,如果在直线上:进一步判断是否在线段内,如果在,距离为0;否则计算到两个顶点的距离,取较小值。
- 计算AC,BC的夹角,如果都为锐角,则最短距离即为点到直线距离。
- 否则,计算到两点的最近距离。
点到三角形距离
题设:P和三角形ABC
1. 判断三角形三个点是否重合,重合转为点到点距离;
2. 判断三角形是否有两点重合,重合转为点到线段距离;
3. 判断三角形是否构成:是否三点共线,如果共线计算点到两条线段AB
和AC
的最短距离就可以。
3. 三角形内任意一点可以表示为:
,
为0~1
之间而且
4. 则对于PT
垂直于AB
和AC
可以得到两个方程,解方程可以得到
5. 根据
计算出垂足点,并判断是否在三角形内,如果在内,则距离即为PT
6. 否则,计算垂足点到三角形三条边的最短距离d
,点到三角形最短距离:sqrt(d^2 + PT^2)
完整的代码见github地址
如有错误,欢迎指正~