is
No notes
Syntax:
C++
bool Triangle::ComputeIntersection( const SRay& ray, SVec3& result ) { SVec3 isPoint; if(!_plane.FindIntersecion( ray, isPoint )) { return false; } int withAxis = _p1.HigherCoefficient(); // uwaga pierwszy najważniejszy. SVec2 projP1 = _p1.ProjectOn2D( withAxis ); SVec2 projP2 = _p2.ProjectOn2D( withAxis ); SVec2 projP3 = _p3.ProjectOn2D( withAxis ); SVec2 projIsPoint = isPoint.ProjectOn2D( withAxis ); // Tworzymy wektory pomiedzy wierzcholkami trojkata a punktem przeciecia. // otrzymujemy w ten sposob podzial trojkata na 3 trojkaty. // Jezeli suma katów małych trojkątów minus suma konta pelnego jest rowna 180 stopni to mamy do czynienia // z punktem w srodku trojkata. Mozna to uproscic i sumopwac kąty malych trojaktatow poza kątem przy // punkcie przeciecia SVec2 vecA = projP2 - projP1; SVec2 vecB = projP2 - projP3; SVec2 vecC = projP3 - projP1; SVec2 miniP1 = projIsPoint - projP1; SVec2 miniP2 = projIsPoint - projP2; SVec2 miniP3 = projIsPoint - projP3; float angles = vecA.AngleBetweenVectors( miniP1 ) + vecC.AngleBetweenVectors( miniP1 ) + vecB.AngleBetweenVectors( miniP3 ) + ( -vecC ).AngleBetweenVectors( miniP3 ) + ( -vecA ).AngleBetweenVectors( miniP2 ) + ( -vecB ).AngleBetweenVectors( miniP2 ); if( abs(angles - 180.0f) < EPSILON ) { result = isPoint; return true; } else { return false; } }