//转换obj_to_polyhedron;
Polyhedron save_obj_to_polyhedron(GLMmodel* m){
GLMtriangle* triangles = m->triangles;
GLfloat* vertices = m->vertices;
for_delegate del;
for(int i = 1;i<=m->numvertices;i++){
Point_3 temp(vertices[3*i],vertices[3*i+1],vertices[3*i+2]);
Point_3 newp = new_view_point(temp);//note:obj各点坐标也变化了;
Point p(newp.hx(),newp.hy(),newp.hz());
del.pointlist.push_back(p);
}
for(int i = 0;i<m->numtriangles;i++){
std::vector<int> face;
face.push_back(triangles[i].vindices[0]-1);
face.push_back(triangles[i].vindices[1]-1);
face.push_back(triangles[i].vindices[2]-1);
//printf("%d,%d,%d\n",triangles[i].vindices[0],triangles[i].vindices[1],triangles[i].vindices[2]);
del.facelist.push_back(face);
}
BuildPolyhedron<HalfedgeDS> builder(del);
Polyhedron p;
p.delegate(builder);
return p;
}
//定义要用于动态新增polyhedron点和面的结构;
struct for_delegate{
std::vector<Point> pointlist;//点;
std::vector<std::vector<int>> facelist;//面,保存面的点的索引;
};
struct poly_and_segnum{
Polyhedron p;
int segnum;//该polyhedron对应的分解后的标记值;
};
// A modifier creating a triangle with the incremental builder.
template <class HDS>
class BuildPolyhedron : public CGAL::Modifier_base<HDS> {
public:
typedef typename HDS::Vertex::Point Point;
for_delegate del;
BuildPolyhedron(for_delegate dele) {
del = dele;
}
void operator()(HDS& hds) {
// Postcondition: `hds' is a valid polyhedral surface.
CGAL::Polyhedron_incremental_builder_3<HDS> B(hds, true);
B.begin_surface(del.pointlist.size(), del.facelist.size());
/*printf("pointlist.size():");
printf("%d\n",del.pointlist.size());
printf("facelist.size():");
printf("%d\n",del.facelist.size());*/
for(unsigned i = 0 ; i < del.pointlist.size() ; i++ ) {
HDS::Vertex_handle vh = B.add_vertex(del.pointlist[i]);
//fout <<"point: ";
//fout <<del.pointlist[i]<<"\n";
}
// triangles
for ( unsigned i = 0 ; i < del.facelist.size() ; i++ ) {
HDS::Face_handle fh = B.begin_facet();
for(int j = 0;j<del.facelist[i].size();j++){
B.add_vertex_to_facet(del.facelist[i][j]);
//fout <<del.facelist[i][j]<<" ";
}
B.end_facet();
//fout <<"\n";
}
B.end_surface();
}
};
此处obj的是用的glm来处理保存的