表面参数化

2024-04-27

我正在尝试在表面网格上获取参数化表面(从 STL 格式文件中读取)。我阅读了 CGAL 示例目录提供的一些有关参数化的示例。我知道应该提供接缝线才能在任意表面上获得参数化表面。但我还是不明白如何制作接缝线。下面是我到目前为止的代码。总而言之,我想知道的是,

1)当使用CGAL::Parameterization_mesh_feature_extractor时,如何获取特征曲线上的顶点并与顶点制作接缝线?

2)CGAL是否提供了一种获取给定曲面和切割平面的相交曲线的方法,以便我可以在给定曲面的一部分上获得参数化曲面?

#include <cstdio>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <fstream>
#include <CGAL/IO/io.h>
#include <CGAL/IO/STL_reader.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/polygon_soup_to_polyhedron_3.h>
#include <CGAL/Parameterization_polyhedron_adaptor_3.h>
#include <CGAL/Parameterization_mesh_patch_3.h>
#include <CGAL/parameterize.h>


int main(int argc, char* argv[]) {
  clock_t time1, time2;
  double read_time, write_time, build_time;
  if(argc == 1) {
    std::cout << "Please, give me a filename" << std::endl;
   return 0;
  }

  std::ifstream infile(argv[1]);

  if(infile.bad()) {
    std::cout << "Infile not found or file corrupt" << std::endl;
    return 1;
  }

  std::vector<CGAL::cpp11::array<double, 3> > points;
  std::vector<CGAL::cpp11::array<int, 3> > triangles;

  time1 = clock();
  if (!CGAL::read_STL(infile, points, triangles)) {
    std::cerr << "Error: invalid STL file" << std::endl;
    return 0;
  }
  time2 = clock();
  read_time = float(time2 - time1) / CLOCKS_PER_SEC;
  fprintf(stdout, "Read time  : %5.2f sec\n", read_time);

  // Write polyhedron in Tecplot format
  std::ofstream ofs("mesh.dat");
  CGAL::set_ascii_mode(ofs);
  time1 = clock();
  ofs << "TITLE=\"\"" << std::endl;
  ofs << "VARIABLES=\"X\" \"Y\" \"Z\"" << std::endl;
  ofs << "ZONE T=\"None\" N=" << points.size() << " E=" << triangles.size() << " F=FEPOINT ET=TRIANGLE" << std::endl; 

  ofs.setf(std::ios::fixed);
  ofs.precision(6);
  for(std::vector<CGAL::cpp11::array<double, 3> >::iterator i = points.begin(); i != points.end(); ++i) {
    ofs << (*i)[0] << " " << (*i)[1] << " " << (*i)[2] << std::endl;
  }

  for(std::vector<CGAL::cpp11::array<int, 3> >::iterator i = triangles.begin(); i != triangles.end(); ++i) {
    ofs << (*i)[0]+1 << " " << (*i)[1]+1 << " " << (*i)[2]+1 << std::endl;
  }
  time2 = clock();
  write_time = float(time2 - time1) / CLOCKS_PER_SEC;
  fprintf(stdout, "Write time : %5.2f sec\n", write_time);



  // build mesh

  typedef CGAL::Simple_cartesian<double>      Kernel;
  typedef CGAL::Polyhedron_3<Kernel>          Polyhedron;

  Polyhedron mesh;

  time1 = clock();
  try{
  // Try building a polyhedron
    CGAL::polygon_soup_to_polyhedron_3(mesh, points, triangles);

    if(! mesh.is_valid() || mesh.empty()){
      std::cerr << "Error: Invalid polyhedron" << std::endl;
    }
  }
  catch(...){}
  time2 = clock();
  build_time= float(time2 - time1) / CLOCKS_PER_SEC;
  fprintf(stdout, "Build time : %5.2f sec\n", build_time);


  // parameterization
  typedef CGAL::Parameterization_polyhedron_adaptor_3<Polyhedron> Parameterization_polyhedron_adaptor;
  // Type describing a border or seam as a vertex list
  typedef std::list<Parameterization_polyhedron_adaptor::Vertex_handle> Seam;

  //Create a second adaptor that virtually "cuts" the mesh following the 'seam' path
  typedef CGAL::Parameterization_mesh_patch_3<Parameterization_polyhedron_adaptor> Mesh_patch_polyhedron; 

  Parameterization_polyhedron_adaptor mesh_adaptor(mesh);


  ////////////////////// cut graph ////////////////////////////////
  typedef CGAL::Parameterization_mesh_feature_extractor<Parameterization_polyhedron_adaptor>
      Mesh_feature_extractor;

  Seam seam;
  // Get reference to Polyhedron_3 mesh
  Polyhedron& mesh_ref = mesh_adaptor.get_adapted_mesh();

  // Extract mesh borders and compute genus
  Mesh_feature_extractor feature_extractor(mesh_adaptor);
  int nb_borders = feature_extractor.get_nb_borders();
  int genus = feature_extractor.get_genus(); // genus means a hole inside a surface

  std::cout << "# borders: " << nb_borders << " # holes: " << genus << std::endl;
  std::cout << feature_extractor.get_borders()[0] << std::endl;
  ///////////////////// end of cut graph //////////////////////////

  /*
  Mesh_patch_polyhedron mesh_patch(mesh_adaptor, seam.begin(), seam.end());

  if (!mesh_patch.is_valid())
  {
      std::cerr << "Input mesh not supported: non manifold shape or invalid cutting" << std::endl;
      return EXIT_FAILURE;
  }

  typedef CGAL::Parameterizer_traits_3<Mesh_patch_polyhedron> Parameterizer; // Type that defines the error codes
  Parameterizer::Error_code err = CGAL::parameterize(mesh_patch);

  switch(err) {
      case Parameterizer::OK: // Success
          break;
      case Parameterizer::ERROR_EMPTY_MESH: // Input mesh not supported
      case Parameterizer::ERROR_NON_TRIANGULAR_MESH:
      case Parameterizer::ERROR_NO_TOPOLOGICAL_DISC:
      case Parameterizer::ERROR_BORDER_TOO_SHORT:
          std::cerr << "Input mesh not supported: " << Parameterizer::get_error_message(err) << std::endl;
          return EXIT_FAILURE;
          break;
      default: // Error
          std::cerr << "Error: " << Parameterizer::get_error_message(err) << std::endl;
          return EXIT_FAILURE;
          break;
  };


  // Raw output: dump (u,v) pairs
  Polyhedron::Vertex_const_iterator pVertex;
  for (pVertex = mesh.vertices_begin(); pVertex != mesh.vertices_end(); pVertex++)
  {
      // (u,v) pair is stored in any halfedge
      double u = mesh_adaptor.info(pVertex->halfedge())->uv().x();
      double v = mesh_adaptor.info(pVertex->halfedge())->uv().y();
      std::cout << "(u,v) = (" << u << "," << v << ")" << std::endl;
  }
  */
  return 0;
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表面参数化 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • 从“(signed) -1”到“unsigned long”的转换是否标准化? [复制]

    这个问题在这里已经有答案了 In 这个答案 https stackoverflow com a 51234964 65863 你可以找到这条评论 https stackoverflow com questions 40608111 why
  • 将密钥添加到选定的密钥集中

    我正在编写一个 NIO 服务器 并希望响应用户请求 即将一些数据写入通道 Selector selector if selector selectNow 0 if key isReadable SocketChannel channel k
  • 按 HOME 按钮不会从配置活动返回小部件 ID

    Error appWidgetId EXTRA APPWIDGET ID was not returned from the widget configuration activity public class WidgetConfigur
  • 获取ListView可见项

    我有一个ListView其中可能包含很多项目 所以它是virtualized和回收物品 它不使用排序 我需要刷新一些值显示 但是当项目太多时 更新所有内容太慢 所以我想只刷新可见项目 我怎样才能获得当前显示的所有项目的列表 我试图调查Lis
  • PrimeFaces 5.2 及更高版本中图表扩展器属性的替代方案是什么

    我正在使用 primefaces 5 2 最新版本并尝试了折线图 它工作正常 我正在尝试更改折线图轴的颜色 背景 边框等 但扩展器属性在最新的 primefaces 版本中不起作用 我的 XHTML
  • 为什么图很大时x轴消失了

    我正在尝试使用加载大图JFreeChart 但是 当缓冲图像超过一定大小时 X 轴会出现问题 这些值在 X 轴上消失 这可以在图像的第三张图中看到 I would appreciate any help in fixing the prob
  • Java 方法存根

    这就是我必须做的 为下面的 main 调用的方法定义存根 每个存根应打印 FIXME Finish methodName 后跟换行符 并应返回 1 输出示例 FIXME Finish getUserNum FIXME Finish getU
  • 来自外部 .diff 文件的交互式补丁

    Linux 是否有命令或程序允许交互式地修补源代码 在屏幕上打印每个块并在将其应用到文件之前等待确认 就像是git add p 但是从另一个 diff 文件中进行更改 您始终可以在 shell ruby python 中编写脚本 逐行读取该
  • 使用 .load() 用图像填充 div 以方便使用 slider1.7

    所以我试图用外部 html 文件中的图像填充幻灯片 div 但问题似乎是新图像确实可以通过 load 拉取 但简单的滑块无法看到新图像 甚至只显示空白尽管在 div 中 有新的图像链接 在我的 html 中 我有这个
  • 进度条摆动效果

    摆动垂直进度条 我学会了如何构建一个整洁的 动态大小的垂直进度条 其中带有横栏这个问题 https stackoverflow com questions 22337851 css vertical progress bar noredir
  • PHP:如果我以非静态方式调用静态方法怎么办?

    我不是面向对象编程专业人士 我有一个愚蠢的问题 class test public static function doSomething arg foo I ate your arg return foo 那么正确的调用方式doSomet
  • 使用 WinAPI 在 C# 中隐藏任务栏窗口

    相信我 我用谷歌搜索过它 并期望它是一个相当容易找到的东西 事实证明并非如此 我有窗把手 但没有表格 我该怎么做 谢谢 声明这些 DllImport user32 dll SetLastError true static extern in
  • LogStash 无法从许可证中检索许可证信息。响应代码“401”通过 URL“http://elasticsearch:9200/_xpack”联系 Elasticsearch

    我正在努力让 Docker LogStash 连接到 Docker ElasticSearch 并启用 xpack 安全性 主要日志有 logstash 1 2020 05 20T22 41 03 950 WARN deprecation
  • 单向绑定

    我知道这个问题存在 但我在答案中找不到解决方案 我有一个表单 其中数据绑定到自定义类 以便在更改表单时 自定义类会收到通知 相反的情况永远不会发生 myForm DataBindings Add Items ItemsController
  • 同时安装多个自制公式

    您可以通过安装多个自制程序brew install package1 package2 但是 如果您有一个文本文件 其中包含您想要安装的所有软件包 你会怎么做 brew install lt packages txt不起作用 它给了我回应
  • 节点 aws-sdk s3 文件上传大小

    当使用 Node js 的 aws sdk npm 插件时 我可以使用以下代码上传 50kb 的 pdf 到 AWS s3 var params Bucket BUCKET Key pdf key Body file ContentType
  • 如何使 React Native Android 应用程序崩溃

    我正在研究react native firebase crashlytics 我正在使用 rnfirebase 入门套件 在那里 我们将 crashlytics 与该项目集成 现在 我想让我的应用程序崩溃以检查崩溃报告 You need t
  • Rails 3.1 与 3.0 AJAX 语法差异。 jQuery 中的等效语句?

    完成 使用 Rails 进行敏捷 Web 开发 第 4 版并点击开始 AJAX 部分 第 11 章迭代 F2 在示例代码中 使用 Rails 3 0 的书籍建议创建 app views line items create js rjs 文件
  • Python——“对象布局”

    有人可以描述以下异常吗 什么是 对象布局 以及它是如何定义的 谢谢 Traceback most recent call last File test gui py line 5 in
  • 表面参数化

    我正在尝试在表面网格上获取参数化表面 从 STL 格式文件中读取 我阅读了 CGAL 示例目录提供的一些有关参数化的示例 我知道应该提供接缝线才能在任意表面上获得参数化表面 但我还是不明白如何制作接缝线 下面是我到目前为止的代码 总而言之