vtk学习笔记 --- 判断三角形相交
在使用三角网连接矿体的时候,需要判断当前连接的三角形和已经连接的三角形是否相交,所以,就需要进行三角形相交判断。
?
看了一些算法的文章,两个三角形相交的判断规则大体如下:
?
假设这两个三角形为A(a1,a2,a3),B(b1,b2,b3),三角形A所在的平面为PA,法向量为NA,三角形B所在的平面为PB,法向量为NB。
?
1、将三角形A的所有顶点投影到平面PB上,投影得到的点为proja1,proja2,proja3
?
2、计算三角形A的所有顶点到平面PB的有符号距离:
|a1| = |a1-proja1|
|a2| = |a2-proja2|
|a3| = |a3-proja3|
其中,符号取决于 顶点与投影点构成的向量与平面PB法向量的方向是否一致,如果一致,则大于0,不一致则小于0
?
3、根据有符号距离来判断三角形相交情况:
? ? a、如果三个有符号距离的符号一致(都大于0或者都小于0),说明两个三角形不相交
? ? b、如果一个符号距离为0,另外两个符号距离乘积大于0,则说明两个三角形相交于一个顶点
? ? c、 如果一个符号距离为0,另外两个符号距离乘积小于0,则说明符号距离为0的顶点位于平面PB内,而另外两个顶点位于平面PB两侧,需要计算交线来判断是否相交。
? ? d、如果一个符号距离和另外两个符号距离的符号相反,说明一个顶点位于平面PB的一侧,两外两个顶点位于平面PB的另外一侧,需要计算交线来判断是否相交。
?
4、根据上面的符号距离,来计算三角形A与平面PB的交点,然后得到两个三角形与对应平面的交线,最后通过判断交线是否相交或者重合来判断三角形是否相交。
?
具体的C++代码如下:
?
?
?
?
备注:最后在判断两个三角形的交线是否相交时,采用的是判断两个交线之间的距离,如果距离为0,则说明相交,隐约的觉得这种办法不够好,但一时也找不到更好的判断方法,后面继续完善!