三角形三角形重叠(但不是边缘)

时间:2013-07-11 23:02:09

标签: c++ math geometry intersection

我找到了一个很好的算法来检查三/三交叉点,但如果它们只是在边缘或边缘的一个点(没有重叠)相遇,我希望它失败。基本上想要重叠,触摸是不够的。

任何人都知道如何调整它?

http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/code/opttritri.txt

离。应该失败

float a1[3] = { 0, 0, 0 }; 
float a2[3] = { 2, 0, 0 }; 
float a3[3] = { 0, 1, 0 }; 
float b1[3] = { 0, 0, 0 }; 
float b2[3] = { 2, 0, 0 }; 
float b3[3] = { 0, -1, 0 }; 

bool inters = NoDivTriTriIsect(a1, a2, a3, b1, b2, b3);

1 个答案:

答案 0 :(得分:1)

我想到了一个简洁的解决方案和一个特殊的解决方案:)。 ad-hoc只是添加了额外的测试来识别仅边缘重叠。整齐的直接计算重叠的区域,并且如果区域> 0

则表示三角形相交

更整洁的重叠区域方法:Sutherland-Hodgman算法产生三角形 - 三角形重叠的多边形。然后只计算多边形区域(How do I calculate the area of a 2d polygon?) (https://math.stackexchange.com/questions/154628/find-the-area-of-overlap-of-two-triangles


如果您更喜欢通过过滤案例的临时解决方案:首先通过将边缘参数化为线条来查找重叠边框,并查找具有相同参数的线条。然后检查最短边缘起点上方和下方的点是否在两个三角形中。 (http://www.blackpawn.com/texts/pointinpoly/default.html)。如果两个点只在其中一个点中,那么它们只会被边缘重叠。