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; }
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; }