首页 > 代码库 > 使用CGAL查找输入三角网格模型独立模型个数
使用CGAL查找输入三角网格模型独立模型个数
在对三角网格模型进行切分并且对切分模型三角化之后,可能会遇到分块数 > 2的情况,对于这种情况我们就需要得到各个分块的数量,并且将他们重组成独立的三角网格模型。
思路如下:
建立一个存放三角网格面的堆栈,遍历模型的所有的三角网格面,对每一个三角形都搜索与之相邻的三个三角形(每个边对应一个三角形),将这些三角形放入堆栈,直到堆栈为空表明已经找到属于同一个块的三角网格。再遍历以上过程,直到所有的三角网格都有属于自己的块。
在CGAL的Polyhedron_3.h头文件的Facet类里加入一个int型标志位mask,并且在构造器里将其初始化为0。接下来是具体的搜索过程,trilist是一个Facet_handle类型的堆栈。
int noc = 0; Facet_handle t , s; //所有的facet的mask都为0 for(Facet_iterator it = P1.facets_begin() , end = P1.facets_end() ; it != end;it++) { if(!it->mask) { noc ++ ; trilist.push(it); it->mask = noc ; while(trilist.size()) { t = trilist.top(); trilist.pop(); if((s=t->halfedge()->opposite()->facet()) != NULL && (!s->mask)) {trilist.push(s);s->mask=noc;} if((s=t->halfedge()->next()->opposite()->facet()) != NULL && (!s->mask)){trilist.push(s);s->mask=noc;} if((s=t->halfedge()->prev()->opposite()->facet()) != NULL && (!s->mask)){trilist.push(s);s->mask=noc;} } } //std::cout << "Mask of facet is "<< it->mask <<std::endl; } std::cout << "Number of components is "<< noc <<std::endl;
使用CGAL查找输入三角网格模型独立模型个数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。