思路
先用vector模拟队列采用bfs方法来遍历所有的面,并对如果没有遍历过的面的公共边进行标记,将高亮设为false。剪枝则是反复遍历点的边,如果为高亮且这个点的高亮边只有一条,那么就将这条边的高亮设为false。直到没有点的高亮边的数量为1。
#include <iostream>
#include <OpenMesh/Core/IO/MeshIO.hh>
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
#include <OpenMesh/Core/Utils/Property.hh>
#include <OpenMesh/Core/System/config.h>
#include <OpenMesh/Core/Mesh/Status.hh>
using namespace std;
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
struct MyTraits : public OpenMesh::DefaultTraits
{
VertexTraits
{
int some_additional_index;
};
};
vector<int>save_point[20000];
vector<int>mark_point;
map<int, int>do_mark_map;
map<int, int>read_mark;
map<int, int>mark_dd;
map<int, int>point_size;
map<int, map<int, int>>save_edge;
vector<MyMesh::FaceHandle>f_vector;
int get_s=0;
void find_path(int from,int last){
if (mark_dd[from]){ get_s++; return; }
for (int ii = 0; ii < save_point[from].size(); ii++){
int yy = save_point[from][ii];
if (yy!=last){
mark_dd[yy] = 1;
find_path(yy,from);
}
}
}
int main()
{
MyMesh mesh;
OpenMesh::FPropHandleT<bool> fprop_bool;
OpenMesh::EPropHandleT<bool> highlight;
mesh.add_property(fprop_bool);
mesh.add_property(highlight, "highlight");
//unsigned int point_size = mesh.n_vertices();
int num_v = mesh.n_vertices();
if (!OpenMesh::IO::read_mesh(mesh, "meshes/cat.off")){
cerr << "can't open the file." << endl;
exit(1);
}
for (MyMesh::EdgeIter e_it = mesh.edges_begin(); e_it != mesh.edges_end(); ++e_it){
mesh.property(highlight, *e_it) = true;
mesh.property(highlight).set_persistent(true);
}
MyMesh::FaceIter f_it = mesh.faces_begin();
f_vector.push_back(*f_it);
vector<MyMesh::FaceHandle>::iterator f_vector_begin;
int begin = 0;
while (begin!=f_vector.size()){
MyMesh::FaceHandle f_handle=f_vector[begin];
for (auto it = mesh.fh_begin(f_handle); it != mesh.fh_end(f_handle); ++it){
MyMesh::HalfedgeHandle halfedge_op_it = mesh.opposite_halfedge_handle(*it);
MyMesh::Halfedge hh = mesh.halfedge(halfedge_op_it);
MyMesh::FaceHandle f_op_it = mesh.face_handle(halfedge_op_it);
if (!mesh.property(fprop_bool, f_op_it)){
mesh.property(fprop_bool, f_op_it) = true;
f_vector.push_back(f_op_it);
mesh.property(highlight, mesh.edge_handle(halfedge_op_it)) = false;
}
}
begin++;
}
bool mark;
while (1){
mark = false;
for (auto v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it){
int number = 0;
for (auto ve_it = mesh.ve_begin(*v_it); ve_it != mesh.ve_end(*v_it); ++ve_it){
if (mesh.property(highlight, *ve_it)){
number++;
}
}
if (number == 1){
mark = true;
for (auto ve_it = mesh.ve_begin(*v_it); ve_it != mesh.ve_end(*v_it); ++ve_it){
mesh.property(highlight, *ve_it) = false;
}
}
}
if (!mark)break;
}
mesh.property(highlight).set_persistent(true);
std::cout << mesh.n_edges() <<" "<< mesh.n_vertices()<<endl;
std::cout << endl;
try {
if (!OpenMesh::IO::write_mesh(mesh, "meshes/cat3.om")) {
std::cerr << "Cannot write mesh to file 'output.off'" << std::endl;
return 1;
}
}
catch (std::exception& x)
{
std::cerr << x.what() << std::endl;
return 1;
}
std::cin.get();
return 0;
}