Я работаю с библиотекой OpenMesh в C ++. У меня есть функция, которая должна возвращать, является ли ребро вогнутым или выпуклым.
bool isConcave(HalfedgeHandle initial, Mesh & mesh){
FaceHandle face1 = mesh.face_handle(initial);
FaceHandle face2 = mesh.face_handle(mesh.opposite_halfedge_handle(initial));
long double angle = angleBetweenVectors(mesh.calc_face_normal(face1), mesh.calc_face_normal(face2));
if (angle >= (M_PI/2)){
cout << "Convex " << (angle * RADIANS_TO_DEGREES) << "\n";
return false;}
else{
cout << "Concave " << (angle * RADIANS_TO_DEGREES) << "\n";
return true;}}
где функция angleBetweenVectors (Vec3f, Vec3f) реализована как
return acosl(dot(vec1, vec2) / (vec1.norm() * vec2.norm()));
Но когда я запускаю это по различным краям куба, встроенного в руководство в OpenMesh у меня есть выходные данные «Вогнутых 0» и «Выпуклых 90», когда все ребра должны быть выпуклыми 90. Почему мой вывод неправильный?
Ну, на случай, если кто-то еще захочет узнать, так как я понял проблему …
Куб представляет собой треугольную сетку. Поэтому каждая грань куба фактически разбита на две треугольные грани. Таким образом, некоторые грани являются технически параллельными, давая угол между этими гранями равным 0 градусов.