如何确定边缘在 3d 中是凹的还是凸的?
How to determine if an edge is concave or convex in 3d?
我正在使用 C++ 中的 OpenMesh 库。我有一个函数,它应该 return 无论边是凹的还是凸的。
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 上 tutorial 中构建的立方体的各个边缘上时,我有 "Concave 0" 和 "Convex 90," 的输出,当所有边缘应该是凸90。为什么我的输出不正确?
好吧,以防万一其他人想知道,因为我意识到了这个问题...
立方体是三角形网格。因此,立方体的每个面实际上都分成两个三角形面。因此,一些面在技术上是平行的,这些面之间的角度为 0 度。
我正在使用 C++ 中的 OpenMesh 库。我有一个函数,它应该 return 无论边是凹的还是凸的。
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 上 tutorial 中构建的立方体的各个边缘上时,我有 "Concave 0" 和 "Convex 90," 的输出,当所有边缘应该是凸90。为什么我的输出不正确?
好吧,以防万一其他人想知道,因为我意识到了这个问题...
立方体是三角形网格。因此,立方体的每个面实际上都分成两个三角形面。因此,一些面在技术上是平行的,这些面之间的角度为 0 度。