void MeshDenoisingViaL0Minimization::calculateAreaBasedEdgeOperator(TriMesh &mesh, std::vector<TriMesh::Point> &area_based_edge_operator, std::vector< std::vector<TriMesh::VertexHandle> > &edge_vertex_handle, std::vector< std::vector<double> > &coef) { std::vector<double> face_area; getFaceArea(mesh, face_area); area_based_edge_operator.resize((int)mesh.n_edges(), TriMesh::Point(0.0, 0.0, 0.0)); std::vector<double> temp_coef(4, 0.0); coef.resize(mesh.n_edges(), temp_coef); std::vector<TriMesh::VertexHandle> vertex_handle(4); edge_vertex_handle.resize(mesh.n_edges(), vertex_handle); for(TriMesh::EdgeIter e_it = mesh.edges_begin(); e_it != mesh.edges_end(); e_it++) { if(!mesh.is_boundary(*e_it)) { int index = e_it->idx(); double edge_length = mesh.calc_edge_length(*e_it); // get four vertices correspond to edge *e_it TriMesh::HalfedgeHandle he = mesh.halfedge_handle(*e_it, 0); TriMesh::VertexHandle v1 = mesh.from_vertex_handle(he); TriMesh::VertexHandle v3 = mesh.to_vertex_handle(he); TriMesh::HalfedgeHandle he_next = mesh.next_halfedge_handle(he); TriMesh::VertexHandle v4 = mesh.to_vertex_handle(he_next); TriMesh::HalfedgeHandle he_oppo = mesh.opposite_halfedge_handle(he); TriMesh::HalfedgeHandle he_oppo_next = mesh.next_halfedge_handle(he_oppo); TriMesh::VertexHandle v2 = mesh.to_vertex_handle(he_oppo_next); // two faces TriMesh::FaceHandle f1 = mesh.face_handle(he); TriMesh::FaceHandle f2 = mesh.face_handle(he_oppo); // the area of two faces correspond to edge *e_it double area134 = face_area[f1.idx()]; double area123 = face_area[f2.idx()]; double totalArea = area123 + area134; TriMesh::Point p1 = mesh.point(v1); TriMesh::Point p2 = mesh.point(v2); TriMesh::Point p3 = mesh.point(v3); TriMesh::Point p4 = mesh.point(v4); TriMesh::Point p12 = p1 - p2; TriMesh::Point p13 = p1 - p3; TriMesh::Point p14 = p1 - p4; TriMesh::Point p23 = p2 - p3; TriMesh::Point p34 = p3 - p4; // calc coefficient temp_coef[0] = (area123 * (p34 | p13) - area134 * (p13 | p23)) / (edge_length * edge_length * totalArea); temp_coef[1] = area134 / totalArea; temp_coef[2] = (-area123 * (p13 | p14) - area134 * (p12 | p13)) / (edge_length * edge_length * totalArea); temp_coef[3] = area123 / totalArea; coef[index] = temp_coef; vertex_handle[0] = v1; vertex_handle[1] = v2; vertex_handle[2] = v3; vertex_handle[3] = v4; edge_vertex_handle[index] = vertex_handle; // calc area-based edge operator TriMesh::Point pt = p1 * temp_coef[0] + p2 * temp_coef[1] + p3 * temp_coef[2] + p4 * temp_coef[3]; area_based_edge_operator[index] = pt; } } }