在做毕设过程中,进行三角网格处理的时候经常会遇到例如点与线段最短距离,点与三角形最短距离等计算,在这里汇总下,如遇到新的会不断更新。
常见几何计算
基础计算
向量点乘
向量点乘:
a→⋅b→=|a||b|cosθ
a
→
⋅
b
→
=
|
a
|
|
b
|
c
o
s
θ
。
用途:向量点乘常用于判断向量是否垂直【垂直向量点乘为0】,向量的夹角大小。
几何意义:点乘以后是一个值,值的大小为向量模相乘再乘以
cos
c
o
s
值。
代数计算:
(x1,y1,z1)⋅(x2,y2,z2)=x1x2+y1y2+z1z2
(
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|sinθ
|
a
→
×
b
→
|
=
|
a
|
|
b
|
s
i
n
θ
即:
|c|=|a×b|=|a||b|sin<a,b>
|
c
|
=
|
a
×
b
|
=
|
a
|
|
b
|
s
i
n
<
a
,
b
>
用途:向量叉乘常用于计算法线,计算体积面积等。
几何意义:叉乘得到的是一个向量,向量积的方向与这两个向量所在平面垂直,且遵守右手定则。
代数计算:
假设
a→=(ax,ay,az),b→=(bx,by,bz)
a
→
=
(
a
x
,
a
y
,
a
z
)
,
b
→
=
(
b
x
,
b
y
,
b
z
)
,则:
a→×b→=(aybz−azby)i+(azbx−axbz)j+(axby−aybx)k
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
转化为三阶行列式:
二维情况:
二维的简化情况:
点和线之间计算
点是否在直线上
直线的两点为AB,判定点是C,只需要计算三角形ABC的面积,面积为0,代表三点在同一条线上。使用叉乘: a→×b→=|a||b|sinθ a → × b → = | a | | b | s i n θ
点是否在线段上
- 判断点是否在直线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,得到点到直线距离。
d=CB×CA∣AB∣ d = C B × C A ∣ A B ∣
注:叉乘的结果是平行四边形的面积,除以一条边,即可得到高,即点到直线的距离解析做法
其中 Ax0+By0+C=0 A x 0 + B y 0 + C = 0 是直线方程:
d=∣Ax0+By0+C∣A2+B2−−−−−−−√ d = ∣ A x 0 + B y 0 + C ∣ A 2 + B 2
直线之间的距离
几何做法
在一条直线上选取一个点,在另外一条直线选取两点,转化为计算点到直线距离。解析做法
只有两条直线相互平行,才有距离,因此解析方程的AB相同:
d=∣C2−C1∣A2+B2−−−−−−−√ d = ∣ C 2 − C 1 ∣ A 2 + B 2
点到线段的距离
- 首先判断线段两点是否重合,如果重合,转化为点到点距离;
- 判断点是否在直线上,如果在直线上:进一步判断是否在线段内,如果在,距离为0;否则计算到两个顶点的距离,取较小值。
- 计算AC,BC的夹角,如果都为锐角,则最短距离即为点到直线距离。
- 否则,计算到两点的最近距离。
点到三角形距离
题设:P和三角形ABC
1. 判断三角形三个点是否重合,重合转为点到点距离;
2. 判断三角形是否有两点重合,重合转为点到线段距离;
3. 判断三角形是否构成:是否三点共线,如果共线计算点到两条线段AB
和AC
的最短距离就可以。
3. 三角形内任意一点可以表示为:
T=A+t1AB−→−+t2AC−→−
T
=
A
+
t
1
A
B
→
+
t
2
A
C
→
,
t1,t2
t
1
,
t
2
为0~1
之间而且
t1+t2≤1
t
1
+
t
2
≤
1
4. 则对于PT
垂直于AB
和AC
可以得到两个方程,解方程可以得到
t1,t2
t
1
,
t
2
5. 根据
t1,t2
t
1
,
t
2
计算出垂足点,并判断是否在三角形内,如果在内,则距离即为PT
6. 否则,计算垂足点到三角形三条边的最短距离d
,点到三角形最短距离:sqrt(d^2 + PT^2)
完整的代码见github地址
如有错误,欢迎指正~