Exemplo n.º 1
0
bool Bezier::checkForProblems() const {
	MathVector<float,3> corners[4];
	corners[0] = points[0][0];
	corners[1] = points[0][3];
	corners[2] = points[3][3];
	corners[3] = points[3][0];

	bool problem = false;

	for (int i = 0; i < 4; ++i) {
		MathVector<float, 3> leg1(corners[(i+1)%4] - corners[i]);
		MathVector<float, 3> leg2(corners[(i+2)%4] - corners[i]);
		MathVector<float, 3> leg3(corners[(i+3)%4] - corners[i]);

		MathVector<float, 3> dir1 = leg1.cross(leg2);
		MathVector<float, 3> dir2 = leg1.cross(leg3);
		MathVector<float, 3> dir3 = leg2.cross(leg3);

		if (dir1.dot(dir2) < -0.0001) problem = true;
		if (dir1.dot(dir3) < -0.0001) problem = true;
		if (dir3.dot(dir2) < -0.0001) problem = true;
	}

	return problem;
}
Exemplo n.º 2
0
bool BEZIER::CheckForProblems() const
{
	//MATHVECTOR<float,3> fl (points[0][0]), fr(points[0][3]), br(points[3][3]), bl(points[3][0]);
	
	MATHVECTOR<float,3> corners[4];
	corners[0] = points[0][0];
	corners[1] = points[0][3];
	corners[2] = points[3][3];
	corners[3] = points[3][0];
	
	bool problem = false;
	
	for (int i = 0; i < 4; i++)
	{
		MATHVECTOR<float,3> leg1(corners[(i+1)%4] - corners[i]);
		MATHVECTOR<float,3> leg2(corners[(i+2)%4] - corners[i]);
		MATHVECTOR<float,3> leg3(corners[(i+3)%4] - corners[i]);
		
		MATHVECTOR<float,3> dir1 = leg1.cross(leg2);
		MATHVECTOR<float,3> dir2 = leg1.cross(leg3);
		MATHVECTOR<float,3> dir3 = leg2.cross(leg3);
		
		if (dir1.dot(dir2) < -0.0001)
			problem = true;
		if (dir1.dot(dir3) < -0.0001)
			problem = true;
		if (dir3.dot(dir2) < -0.0001)
			problem = true;
		
		/*if (problem)
		{
			std::cout << *this;
			std::cout << "i: " << i << ", " << (i+1)%4 << ", " << (i+2)%4 << std::endl;
			std::cout << corners[0] << std::endl;
			std::cout << corners[1] << std::endl;
			std::cout << corners[2] << std::endl;
			std::cout << corners[3] << std::endl;
			std::cout << leg1 << std::endl;
			std::cout << leg2 << std::endl;
			std::cout << dir1 << std::endl;
			std::cout << dir1.dot(dir2) << ", " <<dir1.dot(dir3) << ", " << dir3.dot(dir2) <<std::endl;
		}*/
	}
	
	//if (problem) cout << "Degenerate bezier patch detected" << endl;
	
	return problem;
}