void MeshDenoisingBase::getFaceArea(TriMesh &mesh, std::vector<double> &area) { area.resize(mesh.n_faces()); for(TriMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); f_it++) { std::vector<TriMesh::Point> point; point.resize(3); int index = 0; for(TriMesh::FaceVertexIter fv_it = mesh.fv_iter(*f_it); fv_it.is_valid(); fv_it++) { point[index] = mesh.point(*fv_it); index++; } TriMesh::Point edge1 = point[1] - point[0]; TriMesh::Point edge2 = point[1] - point[2]; double S = 0.5 * (edge1 % edge2).length(); area[(*f_it).idx()] = S; } }
bool computeNormals(TriMesh mesh) { OpenMesh::FPropHandleT<TriMesh::Point> trueNormals; OpenMesh::FPropHandleT<TriMesh::Point> approxNormals; mesh.add_property(trueNormals); mesh.add_property(approxNormals); TriMesh::FaceIter f_it, f_end(mesh.faces_end()); double valence; TriMesh::FaceVertexIter fv_it; for (f_it=mesh.faces_begin(); f_it!=f_end; ++f_it) { mesh.property(trueNormals,f_it).vectorize(0.0f); valence = 0; for (fv_it=mesh.fv_iter( f_it ); fv_it; ++fv_it) { mesh.property(approxNormals,fv_it) += mesh.point( fv_it ); ++valence; } mesh.property(approxNormals,f_it) /= valence; } return true; } // bool computeNormals(TriMesh mesh)