2014-07-10 185 views
1

我是一个具有基本C++经验的新CGAL用户,试图找到一组点的3D Alpha形状。我正在使用ex_alpha_shapes_3示例代码,然后使用saving CGAL alpha shape surface mesh中的说明来显示结果。一切似乎正常工作,但是当我尝试通过与在CGAL和可视化中创建3D Alpha形状

Alpha_shape_3 as(lp.begin(),lp.end(),1, Alpha_shape_3::GENERAL); 

假设第三可变替换

Alpha_shape_3 as(lp.begin(),lp.end()); 

改变的α的值是阿尔法的值(= 1)和改变该值每次都没有获得结果的变化。

更具体地说,在我的一组粒子中,有些与大多数是分离的,我想用分开的体积(类似于Figure 41.1)使用凹形或alpha形状来表示它们。目前我得到的结果(使用Tecplot进行可视化)是: enter image description here 正如您所看到的,分离的粒子与其他粒子相连。最后,我也附上我的代码。我希望在这个问题上有任何帮助。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
    #include <CGAL/Delaunay_triangulation_3.h> 
    #include <CGAL/Alpha_shape_3.h> 

    #include <iostream> 
    #include <fstream> 
    #include <list> 
    #include <cassert> 

    typedef CGAL::Exact_predicates_inexact_constructions_kernel Gt; 

    typedef CGAL::Alpha_shape_vertex_base_3<Gt>   Vb; 
    typedef CGAL::Alpha_shape_cell_base_3<Gt>   Fb; 
    typedef CGAL::Triangulation_data_structure_3<Vb,Fb> Tds; 
    typedef CGAL::Delaunay_triangulation_3<Gt,Tds>  Triangulation_3; 
    typedef CGAL::Alpha_shape_3<Triangulation_3>   Alpha_shape_3; 

    typedef Gt::Point_3         Point; 
    typedef Alpha_shape_3::Alpha_iterator    Alpha_iterator; 

    using namespace std; 

    int main() 
    { 
     std::list<Point> lp; 

     //read input 
     std::ifstream is("./data/finalwater4.dat"); 
     int n; 
     is >> n; 
     std::cout << "Reading " << n << " points " << std::endl; 
     Point p; 
     for(; n>0 ; n--) { 
     is >> p; 
     lp.push_back(p); 
     } 

     // compute alpha shape 
    // Alpha_shape_3 as(lp.begin(),lp.end()); 
     Alpha_shape_3 as(lp.begin(),lp.end(),0.001, Alpha_shape_3::GENERAL); 

     // find optimal alpha value 
     Alpha_iterator opt = as.find_optimal_alpha(1); 
     std::cout << "Optimal alpha value to get one connected component is " 
      << *opt << std::endl; 
     as.set_alpha(*opt); 
     assert(as.number_of_solid_components() == 1); 

     /// the rest of the code, prepares the output to be written into a file 

     /// collect all regular facets (fetch regular facets from as and inserts in facets) 
     std::vector<Alpha_shape_3::Facet> facets; 
     as.get_alpha_shape_facets(std::back_inserter(facets), Alpha_shape_3::REGULAR); 

     std::stringstream pts; 
     std::stringstream ind; 

     std::size_t nbf=facets.size(); 
     for (std::size_t i=0;i<nbf;++i) 
     { 
     //To have a consistent orientation of the facet, always consider an exterior cell 
     if (as.classify(facets[i].first)!=Alpha_shape_3::EXTERIOR) 
      facets[i]=as.mirror_facet(facets[i]); 
     CGAL_assertion( as.classify(facets[i].first)==Alpha_shape_3::EXTERIOR ); 

     int indices[3]={ 
      (facets[i].second+1)%4, 
      (facets[i].second+2)%4, 
      (facets[i].second+3)%4, 
     }; 

     /// according to the encoding of vertex indices, this is needed to get 
     /// a consistent orienation 
     if (facets[i].second%2==0) std::swap(indices[0], indices[1]); 


     pts << 
     facets[i].first->vertex(indices[0])->point() << "\n" << 
     facets[i].first->vertex(indices[1])->point() << "\n" << 
     facets[i].first->vertex(indices[2])->point() << "\n"; 
     ind << 3*i+1 << " " << 3*i+2 << " " << 3*i+3 << "\n"; 
     } 

     ofstream myfile; 
     myfile.open ("output.dat"); 
     myfile << "variables = x, y, z\n"; 
     myfile << "zone n="<< 3*nbf << " , e=" << nbf << " , f=fepoint, et=triangle\n"; 
     myfile << pts.str(); 
     myfile << ind.str(); 
     myfile.close(); 

     return 0; 
    } 

回答

2

如果你想过滤的东西出来,你需要采取阿尔法形状值小于as.find_optimal_alpha(1)返回的一个。我建议运行阿尔法形状的演示,其中包含一个滑块,该滑块将根据alpha的值显示阿尔法形状。输入文件应该带有.pts扩展名,并且必须包含点数,然后是点的坐标。

+0

非常感谢您的回复。我刚刚删除了“找到最佳阿尔法值”部分,现在它工作:) – Vahid