在做毕设过程中,进行三角网格处理的时候经常会遇到例如点与线段最短距离,点与三角形最短距离等计算,在这里汇总下,如遇到新的会不断更新。
向量点乘: 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 转化为三阶行列式:
∣∣∣∣∣iaxbxjaybykazbz∣∣∣∣∣ | i j k a x a y a z b x b y b z | 二维情况: 二维的简化情况: a→×b→=(axby−aybx)k a → × b → = ( 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 θ
面积法 三角形三个点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题设: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地址
如有错误,欢迎指正~
