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

xiaoxiao2021-02-28  49

常见几何计算 基础计算 向量点乘向量叉乘 点和线之间计算 点是否在直线上点是否在线段上点是否在三角形内部点到直线的距离直线之间的距离点到线段的距离点到三角形距离

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

常见几何计算

基础计算

向量点乘

向量点乘: ab=|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=(aybzazby)i+(azbxaxbz)j+(axbyaybx)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=(axbyaybx)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 θ

点是否在线段上

判断点是否在直线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×CAAB d = C B × C A ∣ A B ∣ 注:叉乘的结果是平行四边形的面积,除以一条边,即可得到高,即点到直线的距离

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

d=Ax0+By0+CA2+B2 d = ∣ A x 0 + B y 0 + C ∣ A 2 + B 2

直线之间的距离

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

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

d=C2C1A2+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+t21 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地址

如有错误,欢迎指正~

转载请注明原文地址: https://www.6miu.com/read-2628031.html

最新回复(0)