OpenMesh::FaceHandle faceClosestToPoint(TriMesh& mesh, OpenMesh::Vec3f& P) { // return a handle to the face that is closes to a give point. // distance is measured as sum of Euclidean distances from the 3 vertices to the point. vector<MyREAL> dist(mesh.n_vertices()); unsigned int i = 0; TriMesh::VertexIter v_it, v_end(mesh.vertices_end()); for (v_it = mesh.vertices_begin(); v_it!=v_end; ++v_it) { dist[v_it->idx()]=(P-mesh.point(v_it)).length(); } TriMesh::FaceIter f_it, f_end(mesh.faces_end()); TriMesh::ConstFaceVertexIter cfvIt; double d, mind=10000000000; OpenMesh::FaceHandle mindHandle; for (f_it = mesh.faces_begin(); f_it!=f_end; ++f_it) { cfvIt = mesh.cfv_iter(f_it); d = dist[ cfvIt.handle().idx()]; d += dist[ (++cfvIt).handle().idx()]; d += dist[ (++cfvIt).handle().idx()]; if (d<mind) { mind = d; mindHandle = f_it.handle(); } } //for (f_it = mesh.faces_begin(); f_it!=f_end; ++f_it) return mindHandle ; } // OpenMesh::FaceHandle faceClosestToPoint(TriMesh& mesh, OpenMesh::Vec3f& P)
void analyzeTriangle(OpenMesh::FaceHandle & _fh, TriMesh& mesh) { OpenMesh::Vec3f pointA , pointB , pointC; TriMesh::ConstFaceVertexIter cfvIt; cfvIt = mesh.cfv_iter(_fh); pointA = mesh.point(cfvIt.handle()); pointB = mesh.point((++cfvIt).handle()); pointC = mesh.point((++cfvIt).handle()); // cout<<perimeter(pointA, pointB, pointC) << " "<< area(pointA, pointB, pointC)<<endl; cout<<volume(pointA, pointB, pointC)<<endl; // volume of the tetrahedron with vertices A, B, C and the origin (0,0,0) //cout<<pointA<<endl; }
double meshVolume(TriMesh& mesh) { mesh.request_face_normals(); mesh.update_normals(); double vol = 0; double surf = 0; //iterate through all faces; TriMesh::FaceIter f_it, f_end(mesh.faces_end()); OpenMesh::Vec3f pointA , pointB , pointC; TriMesh::ConstFaceVertexIter cfvIt; for (f_it = mesh.faces_begin(); f_it!=f_end; ++f_it) { cfvIt = mesh.cfv_iter(f_it); pointA = mesh.point(cfvIt.handle()); pointB = mesh.point((++cfvIt).handle()); pointC = mesh.point((++cfvIt).handle()); surf += area(pointA, pointB, pointC); vol += volume(pointA, pointB, pointC); } return vol; } // double meshVolume(TriMesh& mesh)