2015-01-20 1 views
1

Я пытаюсь написать метод bool intersect(const Ray& ray, Intersection& intersection), который возвращает true, когда пересечение находится внутри треугольника.Внутри-вне теста треугольника

Что я сделал до сих пор, это проверка наличия точек на плоскости, созданных двумя векторами треугольника.

Проблема теперь, чтобы проверить, если точка находится внутри Triangle.I использовать барицентрическую Координату

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 заданных векторов?

+1

Что вам нужно? Барицентр? Какие барицентрические координаты? Или как проверить, пересекает ли луч выпуклый многоугольник? В последнем случае см. [Этот другой вопрос] (http://stackoverflow.com/questions/4497841/optimal-algorithm-if-line-intersects-convex-polygon). Помните, что выпуклый многоугольник с тремя вершинами всегда является треугольником! Таким образом, вы можете просто прочитать ответы на этот вопрос с помощью 'n = 3' – Cimbali

ответ

2

Предполагая vec_normal_triangle вектор вычисляется как AB.cross(AC) нормированной (другими словами, треугольник нормаль), вы должны разделить alpha и beta на areaABC, чтобы получить барицентрические координаты точки intersecton.

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

yep вы правы, это должно быть intersection.pos. – greedsin

+0

@lolio Помог ли этот ответ решить вашу проблему? Если да, рассмотрите [принятие] (http://stackoverflow.com/help/accepted-answer). – GoBusto