图形处理中关于三角形的相关基础知识

最近在看mesh网格参数化的相关论文,发现里面有一些基础的关于三角形的基础知识。所以整理一下防止以后再遇到又要一个个单独的找。

1.已知三角形三个顶点求三角形面积

先介绍一下三维中的两点之间距离之式,

和二维的几乎一样:

d = sqrt((x0-x1)^2 + (y0-y1)^2 + (z0-z1)^2) 

现在介绍叉乘,

叉乘在定义上有:两个向量进行叉乘得到的是一个向量,方向垂直于这两个向量构成的平面,大小等于这两个向量组成的平行四边形的面积。在直角座标系[O;i,j,k]中,i、、k分别为X轴、Y轴、Z轴上向量的单位向量。设P0(0,0,0),P1(x1,y1,z1),P2(x2,y2,z2)。因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记为P2。依定义有:

                  |i  j  k | 

P1×P2 = |x1 y1 z1| 

                |x2 y2 z2| 

展开,得到:上式

 = iy1z2 + jz1x2 + kx1y2 - ky1x2 - jx1z2 - iz1y2  

 = (y1z2 - y2z1)i + (x2z1 - x1z2)j + (x1y2 - x2y1)k 

按规定,有:单位向量的模为1。可得叉积的模为:|P1×P2| = y1z2 - y2z1 + x2z1 - x1z2 + x1y2 - x2y1 

 = (y1z2 + x2z1 + x1y2) - (y2z1 + x1z2 + x2y1) 

开始正式内容。我们设三角形的三个顶点为A(x0,y0,z0),B(x1,y1,z1),C(x2,y2,z2)。我们将三角形的两条边AB和AC看成是向量。然后,我们以A为原点,进行坐标平移,向量B(x1-x0,y1-y0,z1-z0),向量C(x2-x0,y2-y0,z2-z0)。①在三维的情况下,直接代入公式,可得向量B和向量C叉乘结果的模为:

|B×C| = ((y1-y0)*(z2-z0) + (z1-z0)*(x2-x0) + (x1-x0)*(y2-y0)) - ((y2-y0)*(z1-z0) + (z2-z0)*(x1-x0) + (x2-x0)*(y1-y0)) 

     |   1     1         1       | 

 = |x1-x0 y1-y0 z1-z0|

    |x2-x0 y2-y0 z2-z0| 

它的一半即为所要求的三角形面积S。

先介绍一下叉乘的概念,两个向量ab的叉乘写作a×b(有时也被写成ab ,避免和字母x混淆)。
向量积可以被定义为:
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。)
也可以这样定义(等效):
向量积|c|=|a×b|=|a| |b|sin<a,b>
c的长度在数值上等于以ab,夹角为θ组成的平行四边形的面积。
c的方向垂直于a与b所决定的平面,c的指向按右手定则从a转向b来确定。
*运算结果c是一个伪向量。这是因为在不同的坐标系中c可能不同。

坐标运算

   
=(
   
),
   
=(
   
)。i,j,k分别是X,Y,Z轴方向的单位向量,则:
a×b=(
   
-
   
) i+(
   
-
   
) j+(
   
-
   
) k,为了帮助记忆,利用三阶 行列式写成det
 

[O;i,j,k]中,ijk分别为X轴、Y轴、Z轴上向量的单位向量。P0(0,0,0)P1(x1,y1,z1)P2(x2,y2,z2)因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记P2。依定义有:在直角座标系[O;i,j,k]中,ijk分别为X轴、Y轴、Z轴上向量的单位向量。P0(0,0,0)P1(x1,y1,z1)P2(x2,y2,z2)因为是从原点出发,所以向量P0P1可简记为P1,向量P0P2可简记为P2。依定义有:

因此在三角形中假设三角形三个顶点坐标是A(a1,b1,c1),B(a2,b2.c2),C(a3.b3.c3).所以可以得到两个两个向量 AB=(a2-a1,b2-b1,c2-c1),AC(a3-a1,b3-b1,c3-c1). 按上面叉乘的结构我们计算AB×AC。可以得到一个(b2-b1)*(c3-c1)+(c2-c1)*(a3-a1)+(a2-a1)*(b3-b1)-(b3-b1)*(c2-c1)-(c3-c1)*(a2-a1)-(a3-a1)*(b2-b1).
因为这是一个平行四边形的面积。所以它的一半就是三角形的面积。
2 给定一点判断改点是否在这个三角形内
除了上述求面积以外,还有一种常用的就是判断一个点是否在一个三角形内。这种方法就多一些。
1,内角法。
把这个点的和三角形的三个顶点连接气起来然后判断三个夹角的和是不是180度。如果180度则说明是在三角形内部,否则在外面。

2 面积法
如上图所示把点连接起来然后按照上面求面积的方法求出。三个小三角形的面积。然后在求出大三角形的面积判断这两个面积是否一样。如果大小一样则说明点在三角形内。
3 向量法
这种方法也是比较简单的方法。我们可以观察上面点P可以发现它在直接BC的上方,在AB的右边,在AC的左边。
在上述的求面积中使用了叉乘的公式。我们可以发现。AB × AP = |AB| * |AP| * sin∠PAB P在AB的左边,则∠PAB在0°到180°之间   sin∠PAB > 0 P在AB右边时,则∠PAB在-180°到0°之间 sin∠PAB < 0 因此,我们只要用AB和AP的叉积的正负,就可以判断P和AB的相对位置(AP相对AB是顺时针还是逆时针旋转)。所以利用这个性质我们就可以判断点是否在三角形内。当然这要进行三次判断。
在求得向量以后判断三词。最后结果在同一个方向,即要是大于0所有都大于0这样就可以进行判断了。
4 叉乘法
沿着三角形的边按顺时针方向走,判断该点是否在每条边的右边(这可以通过叉乘判断),如果该点在每条边的右边,则在三角形内,否则在三角形外。这个算法只用到了三次叉乘,没有除法运算和三角函数、开根号等运算,所以效率很高,而且精度很高(没有浮点误差)。 

设三角形三点A(x1,y1)B(x2,y2)C(x3,y3),已知点M(x,y), 

1,先求出三个向量MA,MB,MC.  

2,计算MA X MB,MB X MC,MC X MA (X表叉乘) 

3,如果此三组的向量叉乘的结果都是同号的(或都正,或都负),即方向相同的,则说明点M在三角形每条边的同侧,即内部。否则必在外部! 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值