节能CGAL字母形状的表面网格 [英] saving CGAL alpha shape surface mesh

查看:245
本文介绍了节能CGAL字母形状的表面网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从来没有使用CGAL,并已经得到几乎没有C / C ++的经验。但是,随着 谷歌我已经然而设法编译示例Alpha_shapes_3 (\ CGAL-4.1-β1\例子\ Alpha_shapes_3)在Windows 7 64位机器上使用 Visual Studio 2010中。

I have never used CGAL and have got almost no C/C++ experience. But following Google I have however managed to compile the example "Alpha_shapes_3" (\CGAL-4.1-beta1\examples\Alpha_shapes_3) on a Windows 7 64bit machine using visual studio 2010.

现在,如果我们查看源$ C ​​$ C为纲ex_alpha_shapes_3我们 注意到叫做bunny_1000的数据文件是红,其中三维点 集群所在。 现在的问题是我怎么能更改源$ C ​​$ C使得α后 形状计算对于给定的点,阿尔法形状的表面网格是 保存/写在一个外部文件。它可以是简单的多边形的列表和 它们各自的三维顶点。我想这些多边形将被定义 阿尔法形状的曲面网格。如果我能做到,我能看到的输出 在外部工具阿尔法形状生成程序我所熟悉的。

Now if we check the source code for the program "ex_alpha_shapes_3" we notice that a data file called "bunny_1000" is red where the 3d point cluster resides. Now my question is how can I change the source code so that after the alpha shape is computed for the given points, surface mesh of the alpha shape is saved/wrote in an external file. It can be simply the list of polygons and their respective 3D vertices. I guess these polygons will be defining the surface mesh of the alpha shape. If I can do that I can see the output of the alpha shape generation program in an external tool I am familiar with.

我知道这是很简单,但我不知道这与我 CGAL有限的知识。

I know this is very straightforward but I could not figure this out with my limited knowledge of CGAL.

我知道你gueys有code,但我再次粘贴完成。

I know you gueys have the code but I am pasting it again for completion.

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

#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;

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

  //read input
  std::ifstream is("./data/bunny_1000");
  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());
  std::cout << "Alpha shape computed in REGULARIZED mode by default"
            << std::endl;

  // 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);
  return 0;
} 

在我在网上搜索了很多之后,可能需要使用像

After searching a lot in the internet I found that probably we need to use something like

std::list<Facet> facets;
alpha_shape.get_alpha_shape_facets
(
  std::back_inserter(facets),Alpha_shape::REGULAR
);

但是,我还是完全无能如何使用这个在上面的code!

But I am still completely clueless how to use this in the above code!

推荐答案

作为记录<一个href="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/TriangulationDS_3_ref/Concept_TriangulationDataStructure_3.html#Typedef_Facet"相对=nofollow>此处,一个方面是一对(Cell_handle C,int i)以定义为小面在C相反索引i的顶点。 在此页面,你有怎样的说明小区的顶点指数

As documented here, a facet is a pair (Cell_handle c,int i) defined as the facet in c opposite to the vertex of index i. On this page, you have the description of how the vertex indices of a cell are.

在以下code样品,我补充说,通过复制顶点打印在 COUT 断开文件较小的输出。做一些清洁,您可以使用的std ::地图&LT; Alpha_shape_3 :: Vertex_handle,INT&GT; 联想到每个顶点的唯一索引或添加信息像顶点在<一个href="http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Triangulation_3/Chapter_main.html#Subsection_39.5.3"相对=nofollow>的范例。

In the following code sample, I added a small output that prints an OFF file on cout by duplicating the vertices. To do something clean, you can either use a std::map<Alpha_shape_3::Vertex_handle,int> to associate a unique index per vertex or add an info to the vertices like in those examples.

/// collect all regular 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 " << 3*i << " " << 3*i+1 << " " << 3*i+2 << "\n";
}

std::cout << "OFF "<< 3*nbf << " " << nbf << " 0\n";
std::cout << pts.str();
std::cout << ind.str();

这篇关于节能CGAL字母形状的表面网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆