is

by Edwin on December 22nd, 2009
No notes
Syntax: C++
Show lines - Hide lines - Show in textbox - Download
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;
	}
 
}

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS