【问题标题】:Ellipsoid mesh generation in CGALCGAL中的椭球网格生成
【发布时间】:2018-07-12 14:11:10
【问题描述】:

我需要在 CGAL 中生成大量椭圆体网格。椭球的形状是相同的,它们的位置和方向不同。我正在寻找一种有效的方法,所以我认为我必须:

  • 使用 CGAL::make_surface_mesh 仅生成一个球形网格,并对其应用缩放变换以使其成为椭圆体,
  • 旋转并平移第一个椭圆体网格以创建其他网格。

我生成了以下球形网格:https://doc.cgal.org/latest/Surface_mesher/Surface_mesher_2mesh_an_implicit_function_8cpp-example.html

使用:

typedef CGAL::Cartesian<double> K;
typedef K::Vector_3 Vector3;
typedef CGAL::Aff_transformation_3<K> Trans3;

我已经使用 CGAL::Aff_transformation_3 编写了缩放、平移和旋转几何对象的仿射变换。例如缩放变换为:

K::RT M[9]={2.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0};        
Trans3 sca(M[0], M[1],M[2],M[3],M[4],M[5],M[6],M[7],M[8]);

我找不到将这些变换应用于从隐式函数生成的球面网格的方法。

我是否必须使用不同于 3D Surface Mesh Generation 的另一个库来生成表面网格?

什么是用于此目的的好包?

我认为使用 CGAL::make_surface_mesh 生成每个网格不是很有效,对吗?

谢谢

【问题讨论】:

  • 为什么不直接对椭球进行网格划分?
  • 或者你可以对operator()中的点应用逆变换
  • 谢谢,我已经编辑了这个问题来解释为什么我认为我不应该直接对每个椭圆体进行网格划分。
  • @sloriot ,你能解释一下为什么我应该使用逆变换,我该怎么做?我读过 vertices_begin() 迭代器在 SurfaceMeshComplex_2InTriangulation_3 doc.cgal.org/latest/Surface_mesher/… 中是不可变的
  • @Enrico 有人回答了您的问题,请您接受答案或在评论中提供反馈吗?

标签: c++ mesh cgal


【解决方案1】:

直接网格化:

double a=4,b=2,c=1; // the radii 

FT ellipsoid_function (Point_3 p) {
  const FT x2=(p.x()*p.x())/(a*a), y2=(p.y()*p.y())/(b*b), z2=(p.z()*p.z())/(c*c);
  return x2+y2+z2-1;
}

【讨论】:

  • 感谢您的回答,但我需要生成大量相同的椭球体,因此旋转和平移相同的网格更有效。我已经编辑了问题。
  • 您首先必须使用 CGAL::output_surface_facets_to_polyhedron 将其导出到 Polyhedron_3
  • 我仍然建议您在进行仿射变换之前先对轴对齐的椭球进行网格化,这样您的三角形会更好。
  • CGAL::output_surface_facets_to_polyhedron 被标记为已弃用,我已将其用作CGAL::output_surface_facets_to_polyhedron(c2t3,P); 并且编译器给了我:错误:'output_surface_facets_to_polyhedron' 不是'CGA​​L'的成员
  • 您没有包含标题(并且没有记录要包含哪个标题)。 #include 我还上传了一个完整版的程序到gist.github.com 它使用了废弃函数的替换,它使用了Surface_mesh而不是Polyhedron_3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多