2013-07-11 3 views
0

삼각형/삼각형 교차점을 검사하는 멋진 알고리즘을 찾았지만 가장자리 또는 가장자리 (겹치지 않음)의 한 점에서만 만나는 경우 오류가 발생합니다. 기본적으로 겹치기를 원하고 터치만으로는 충분하지 않습니다.삼각형 삼각형 겹침 (그러나 가장자리가 아님)

누구나 조정 방법을 알고 계십니까?

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

"가장자리를 만지면"숫자 안정성이 좋지 않습니다. –

답변

1

깔끔한 솔루션과 임시 해결책이 떠오른다. :) ad-hoc은 엣지 - 오버랩을 식별하기위한 추가 테스트를 추가합니다. 깔끔한 하나 직접 겹치는 면적을 계산하고, 영역> 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). 두 점이 둘 중 하나에있는 경우 가장자리로 만 겹칩니다.