2013-07-11 77 views
0

我找到了一个不错的算法来检查三/三路口,但我想它,如果他们只是在沿着边缘或边缘(无重叠)某点相遇失败。基本上要重叠,而且触摸不够。三角三角重叠(但不是边缘)

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

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

ex。应该失败

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); 
+0

请注意,“触摸边缘”的数字稳定性较差。 –

回答

1

一个简洁的解决方案和临时解决方案让人想起:)。特设的只是增加了额外的测试来识别边缘重叠。整齐的一个直接计算的重叠面积和说,三角形相交如果面积> 0


更合适的区域 - 的重叠的方法:萨瑟兰-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)。如果两个点都只在其中一个点上,那么它们只会重叠一个边。