2015-01-20 4 views
1

교차점이 삼각형 안에있을 때 true를 반환하는 bool intersect(const Ray& ray, Intersection& intersection) 메서드를 작성하려고합니다.삼각형의 내부 - 외부 테스트

내가 지금까지 한 것은 삼각형의 2 개의 벡터에 의해 생성 된 평면상의 점이 있는지 확인하는 것입니다.

문제는의 삼각가

Vec3 AB = b_-a_; 
Vec3 AC = c_-a_; 
double areaABC = vec_normal_triangle.dot(AB.cross(AC)); 

Vec3 PB = b_-intersection.pos; 
Vec3 PC = c_-intersection.pos; 
double alpha = vec_normal_triangle.dot(PB.cross(PC)); 

Vec3 PA = a_-position.pos; 
double beta = vec_normal_triangle.dot(PC.cross(PA)); 
double gamma = 1-alpha-beta; 

if((beta+gamma) < 1 && beta > 0 && gamma > 0) { 
    return true; 
} 

좌표

을 무게 중심 내부에서 포인트가 있는지 확인하기 위해 지금 실제로 무작위 포인트에 대한 그조차 삼각형. 누군가가 나를 설명하거나 3 개의 주어진 벡터에 대해 중심 좌표를 계산하는 방법을 알고 있습니까? vec_normal_triangle 가정

+1

무엇을 원하십니까? barycenter? 중심 좌표는 무엇입니까? 또는 광선이 볼록한 다각형과 교차하는지 테스트하는 방법? 후자의 경우 [이 다른 질문] (http://stackoverflow.com/questions/4497841/optimal-algorithm-if-line-intersects-convex-polygon)을 참조하십시오. 꼭지점이 3 개인 볼록한 다각형은 항상 삼각형임을 기억하십시오! 그래서 당신은 그 질문의 답을'n = 3'으로 읽을 수 있습니다 – Cimbali

답변

2

은 (즉, 삼각형의 정상이), 당신은 intersecton 포인트의 무게 중심 좌표를 얻을 수 areaABC에 의해 alphabeta를 분할해야 정상화 AB.cross(AC)으로 계산 된 벡터이다.

double alpha = vec_normal_triangle.dot(PB.cross(PC))/areaABC; 

double beta = vec_normal_triangle.dot(PC.cross(PA))/areaABC; 

alpha 정상화와 beta 그래서 당신 gamma의 계산과 1 개 메이크업 감각에 대한 비교.

나는 또한 제안하고 싶습니다. 재 계산을 피하고 코드를 조금 깔끔하게 만들려면 테스트를 다음으로 대체하십시오.

if(alpha > 0 && beta > 0 && gamma > 0) { 
    return true; 
} 

그것을 제외하고, 내가 먼저 intersection.pos 다음 position.pos를 사용하는 것을 알 수있다. 이것은 의도적입니까? 내 생각 엔 두 번 모두 intersection.pos을 사용해야한다는 것입니다.

+0

네가 맞다. 이것은 intersection.pos가되어야한다. – greedsin

+0

@lolio이 답변으로 문제가 해결 되었습니까? 그렇다면 [accepting] (http://stackoverflow.com/help/accepted-answer)을 고려하십시오. – GoBusto