首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用CGAL isotropic_remeshing进行约束求精

CGAL(Computational Geometry Algorithms Library)是一个强大的几何算法库,提供了多种几何处理功能,包括网格重构、布尔运算、三角剖分等。isotropic_remeshing 是 CGAL 中用于各向同性网格重构的功能,可以用来对网格进行均匀化处理。

在进行网格重构时,有时需要保持某些约束,例如边界或特征边。CGAL 提供了相应的功能来处理这些约束。以下是如何使用 CGAL 的 isotropic_remeshing 进行约束求精的详细步骤。

1. 安装 CGAL

首先,确保你已经安装了 CGAL。你可以通过以下方式安装:

使用包管理器(例如在 Ubuntu 上)

代码语言:javascript
复制
sudo apt-get install libcgal-dev

从源码安装

你可以从 CGAL 官方网站 下载源码并进行编译安装。

2. 准备你的 CMake 项目

创建一个 CMake 项目来使用 CGAL。以下是一个基本的 CMakeLists.txt 文件:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.1)
project(IsotropicRemeshing)

find_package(CGAL REQUIRED)

add_executable(isotropic_remeshing main.cpp)
target_link_libraries(isotropic_remeshing CGAL::CGAL)

3. 编写主程序

以下是一个示例程序,演示如何使用 isotropic_remeshing 进行约束求精。

main.cpp

代码语言:javascript
复制
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/remesh.h>
#include <CGAL/Polygon_mesh_processing/IO/polygon_mesh_io.h>

namespace PMP = CGAL::Polygon_mesh_processing;

typedef CGAL::Simple_cartesian<double> Kernel;
typedef Kernel::Point_3 Point;
typedef CGAL::Surface_mesh<Point> Mesh;
typedef boost::graph_traits<Mesh>::vertex_descriptor vertex_descriptor;
typedef boost::graph_traits<Mesh>::halfedge_descriptor halfedge_descriptor;
typedef boost::graph_traits<Mesh>::edge_descriptor edge_descriptor;

int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cerr << "Usage: " << argv[0] << " input.off" << std::endl;
        return EXIT_FAILURE;
    }

    Mesh mesh;
    if (!PMP::IO::read_polygon_mesh(argv[1], mesh) || !CGAL::is_triangle_mesh(mesh)) {
        std::cerr << "Invalid input mesh." << std::endl;
        return EXIT_FAILURE;
    }

    // 标记要保留的边(例如边界边)
    Mesh::Property_map<edge_descriptor, bool> is_constrained_map =
        mesh.add_property_map<edge_descriptor, bool>("e:is_constrained", false).first;

    for (edge_descriptor e : edges(mesh)) {
        if (CGAL::is_border(e, mesh)) {
            is_constrained_map[e] = true;
        }
    }

    // 进行各向同性网格重构
    double target_edge_length = 0.1;
    unsigned int nb_iter = 3;
    PMP::isotropic_remeshing(
        faces(mesh),
        target_edge_length,
        mesh,
        PMP::parameters::number_of_iterations(nb_iter)
                        .edge_is_constrained_map(is_constrained_map)
    );

    // 输出重构后的网格
    PMP::IO::write_polygon_mesh("output.off", mesh, CGAL::parameters::stream_precision(17));

    return EXIT_SUCCESS;
}

4. 编译和运行

编译

在项目目录下创建一个 build 目录并编译项目:

代码语言:javascript
复制
mkdir build
cd build
cmake ..
make

运行

运行生成的可执行文件,并提供一个输入的 OFF 格式的网格文件:

代码语言:javascript
复制
./isotropic_remeshing ../input.off

5. 解释代码

  • 读取网格:使用 PMP::IO::read_polygon_mesh 读取输入的 OFF 文件,并检查网格是否为三角网格。
  • 标记约束边:创建一个属性映射 is_constrained_map,并标记所有边界边为约束边。
  • 进行各向同性网格重构:调用 PMP::isotropic_remeshing 进行网格重构,指定目标边长和迭代次数,并传递约束边映射。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

格网DEM生成不规则三角网TIN

参考文献一中提到了一种约束: ? 可以看到这类似于图像处理中的滤波操作,通过比较每个高程点与周围的平均高差,如果大于一个阈值,则为重要点,否则为不重要点。...其中的关键点就是空间点与直线的距离,具体算法可参看这篇文章《空间点与直线距离算法》。 3️⃣TIN构建 经过保留重要点法过滤之后,剩下的点就要进行构网了。...Delaunay三角网的构建算法也挺复杂,不过可以通过计算几何算法库CGAL来构建。 查阅CGAL的文档,发现CGAL居然已经有了GIS专题,里面有许多与地形处理相关的示例。...CGAL/Delaunay_triangulation_2.h> #include #include <CGAL...imgHeight; yi++) { for (int xi = 0; xi < imgWidth; xi++) { //将四个角点的约束加入

1.9K40
  • 【C# 基础讲】使用async和await进行异步编程

    在C#中,使用async和await关键字进行异步编程是一种强大的工具,可以在不阻塞主线程的情况下执行耗时操作,提高程序的并发性和响应性。...await只能在async方法内部使用。 1.2 Task和Task 在异步编程中,经常使用Task和Task来表示异步操作的结果。...使用场景 异步编程适用于以下场景: IO密集型操作:如文件读写、网络请求、数据库查询等,这些操作通常会导致线程阻塞,使用异步编程可以提高效率。...3.3 避免阻塞 在异步方法内部,不要使用阻塞的同步方法,这会导致整个异步操作的效果减弱。应该尽量使用支持异步操作的方法。 4....总结 使用async和await进行异步编程是C#中提高程序并发性和响应性的重要方法之一。通过将耗时的操作异步执行,可以使程序在等待操作完成时继续执行其他任务,从而提高程序的性能。

    1.3K20

    CGAL功能大纲

    CGAL功能大纲 Computational Geometry Algorithms Library,CGAL,计算几何算法库。使用C++语言编写的,提供高效、可控的算法库。...这些功能需要对数据进行计算,这将推动创建一个新的内核概念,扩展CGAL内核概念,该概念仅限于FieldNumberType中的对象和功能。...这可以用于单个折线,也可以用于约束三角剖分中的一组折线约束。简化过程可以通过权重进行控制功能。...该包还提供了一个2D网格生成器,用于细化三角形和约束边,直到满足用户定义的三角形大小和形状标准。生成的网格可以使用Lloyd算法进行优化,该算法也在这个包中提供。...然后可以使用CGAL表面网格生成器从这个函数中提取等值面。

    1.1K10

    【C++】开源:CGAL计算几何库配置使用

    它是一个功能强大、可靠、高效且易于使用的库。...2.2D 和 3D 三角剖分:CGAL 实现了多种高质量的、高效的三角剖分算法。它支持 Delaunay 三角剖分、Voronoi 图计算、网格重构、约束三角剖分等操作。...5.多边形和非封闭曲线处理:CGAL 支持进行多边形布尔运算、多边形修复、多边形拟合、轮廓计算等操作。它还提供了对非封闭曲线的操作和处理。...CGAL 使用 C++ 编写,具有良好的可扩展性和可移植性。它还与其他库和工具集成,在计算机图形学、计算机辅助设计、计算机辅助制造、机器人学、仿真和科学计算等领域得到了广泛应用。 2....使用说明 下面进行使用分析: 计算点集的凸包算法示例: #include #include #include <CGAL/Exact_predicates_inexact_constructions_kernel.h

    32510

    CGAL的安装与使用

    CGAL (Computational Geometry Algorithms Library) CGAL是一套开源的C++算法库,提供了计算几何相关的数据结构和算法,诸如三角剖分(2D约束三角剖分及二维和三维...CGAL CGAL系大名鼎鼎的计算几何算法库,采用C++语言,代码中大量使用模板,相对比较难读。可以支持float, double, CORE的高精度或者gmp等任意精度库。...安装CGAL 在Windows下,建议采用Setup.exe进行安装,因为可以设定自动下载依赖库gmp, mpfr。...安装时会自动勾选,添加CGAL_DIR用户变量至CGAL安装目录,还有 CGAL/auxiliary/gmp/lib 至PATH路径;这个也可以不勾选,但对后面使用时稍有不便。...CGAL使用 CGAL从版本4.9开始支持仅以头文件使用,但是虽然仅作为头文件使用,仍然需要运行CMake产生一些配置文件。

    58430

    SaccadeNet:使用角点特征进行two-stage预测框调 | CVPR 2020

    SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的调,整体思想类似于two-stage目标检测算法,将第二阶段的预测框调用的区域特征转化为点特征...此外,论文的源码提供在此模块额外预测中心点的偏移值,针对下采样造成的不对齐问题,该偏移值同样使用L1回归损失进行训练,这个是默认开启的。...,整个模块使用L1损失进行训练。...同样地,该分支基于focal loss和高斯热图进行训练,该分支是类不可知的。此模块可迭代进行多次调,类似Cascade R-CNN那样,论文在实验部分也进行了对比。...Conclusion ***   SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的调,整体思想类似于two-stage目标检测算法,第二阶段的预测框调用的区域特征转化为点特征

    19320

    SaccadeNet:使用角点特征进行two-stage预测框调 | CVPR 2020

    SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的调,整体思想类似于two-stage目标检测算法,将第二阶段的预测框调用的区域特征转化为点特征...此外,论文的源码提供在此模块额外预测中心点的偏移值,针对下采样造成的不对齐问题,该偏移值同样使用L1回归损失进行训练,这个是默认开启的。...,整个模块使用L1损失进行训练。...同样地,该分支基于focal loss和高斯热图进行训练,该分支是类不可知的。此模块可迭代进行多次调,类似Cascade R-CNN那样,论文在实验部分也进行了对比。...Conclusion   SaccadeNet基于中心点特征进行初步的目标定位,然后利用初步预测框的角点特征以及中心点特征进行预测框的调,整体思想类似于two-stage目标检测算法,第二阶段的预测框调用的区域特征转化为点特征

    22320

    CGAL使用心得 转

    很快的我发现,CGAL里的ARRANGEMENT能够实现类似需求的功能,就这样,我开始慢慢的对ARRANGEMENT进行研究。但研究CGAL的应用,不可能不学习CGAL的基本结构。...CGAL将核心中定义的CURVE转换成X_monotone_curve_2的过程是由make_x_objects完成的,所以,我在这里进行了改动,在转换过程中,将附加的值的信息给考虑上了。...中我们不会进行射影几何的计算.我们使用齐次坐标是为了避免除法运算,而增加的这个坐标是作为公共分母. 2.1 通过参数化实现泛型 几乎所有的核心对象(已经对应的函数)都是由模板来实现的.而模板参数是用用户来选择从而决定核心对象的表现形式...如果出现新建点的情况,比如两条直线的交点,笛卡儿坐标中的计算经常出现除法.因此使用笛卡儿坐标的时候需要FieldNumberType.相对的,转换到齐次坐标的时候也一样.double是一个不精确的FieldNumberType....你可以把任何RingNumberType传给Quotient配接器来得到一个FieldNumberType从而可以在笛卡儿坐标系中进行运算.一般来说使用RingNumberType进行齐次坐标运算是比较合适的

    87830

    简单例子code

    CGAL有神秘的面纱,让我不断想看清其真面目。开始吧! 1 Three Points and One Segment 第一个例子是创建3个点和一条线段,并且在其上进行一些操作。...如果你需要使数被全精度解析,你可以使用精确断言和精确构建的CGAL kernel。...它的输出是输入的一个子集,这个算法只进行坐标比较和位置测试。 由于高精度的计算需要消耗比普通计算多的资源,内存、时间等,所以使用时需要考虑。...泛型编程需要使用抽象元语对算法进行抽象,而在实现中将元语变为实际的类型和算法。那么convex hull算法需要哪些元语(primitive)呢?...int _tmain(int argc, _TCHAR* argv[]) { //return 0; mpz_t t; //mpz_t 为GMP内置大数类型 mpz_init(t); //大数t使用前要进行初始化

    30030

    CGAL 计算两个凸多边形相交的面积

    我正在使用 CGAL 计算两个凸多边形相交的面积。在对 this 的接受答案中发布了执行此操作的简短演示代码。问题。...但是,当我修改该代码以使用我感兴趣的多边形时,CGALCGAL::intersection() 例程的深处抛出运行时异常。...这是一个简短的示例代码,它是从上面链接的 SO 问题中复制粘贴的,除了它使用我自己的多边形并打印一些关于每个多边形的诊断信息以表明它们是凸面的并使用 CCW 绕组订单。...最佳答案 我可以重现此错误(在带有 clang++ 的 MacOS 上使用 CGAL 4.9)。据我了解,这种类型的未捕获异常不应该发生,换句话说,您发现了 CGAL 中的错误。...根据 sloriot 的评论进行编辑。

    38140

    CGAL的编译以及在VS中的使用

    CGAL的编译以及在VS中的使用 在被CGAL长久的折磨了两三周 在学习过程中有好几次库都出现了问题 所以打算重新更换一下版本 CGAL可以说是学习这么久以来见过最离谱(ex)的环境配置,期间出了好几次问题...:https://www.boost.org/ 这里我下载的是1_71_0 其次注意VS版本的问题 这里我使用的是vs2015 VS2015选择XX.Y=14.0 VS2017选择14.1 VS2019...选择14.2 然后无脑傻瓜操作进行安装 (建议整个配置里的所有文件都放在一个文件夹里) 接下来设置环境变量 ○ BOOST_LIBRARYDIR = D:\local\boost_1_71_0\lib64...如果是新版本的话 会不生成bin文件 目前原因未知 这里我下载的版本是4.13.2 还有一个点是 如果是exe文件进行安装 极大可能在自动配置环境变量后会出现应用奔溃的情况 建议还是手动配置 PATH..._2设置为启动项 点击运行 在VS中使用CGAL库 CMake build 如图继续进行Configue和Generate操作 然后检查一下CGAL文件夹目录中是否有build文件夹 接下来打开生成的

    57620

    CGAL_空间搜索与排序】3D快速交和距离计算

    1 介绍 AABB树提供了一个静态的数据结构和算法,能够对有限3D几何对象集合进行高效的相交和距离查询。...而通过AABB tree进行相交和距离查询时,返回值中就包含了相交对象/最近点和相交图元id/最近图元id。 左图为表面三角网格模型,右图为其构建的AABB树。...< std::endl; } return EXIT_SUCCESS; } 下面例子先读取一个闭合的多面体表面,然后以每个face的重心为起始点和垂直于face向模型内部的方向作射线,进行一个...query); std::cout << "squared distance: " << sqd << std::endl; return EXIT_SUCCESS; } 上面这个例子中,首先使用...polyhedron1构建tree,然后使用insert()函数将polyhedron2的faces作为primitives插入到tree中。

    47220

    点集合的三角剖分

    进行构建Delaunay三角网,其实相当简短: typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::...Delaunay dt(vertexList.begin(), vertexList.end()); //... } CGAL大量应用了C++的模板(泛型)技术,因而使用的接口比较抽象可能难以理解,...学过任何一门编程语言的都知道,浮点型数值的相等判断不能直接使用相等运算符;正确的做法是使用两者相减的绝对值与容差进行判断,因为计算机表达的浮点型是个近似值。...predicates(谓词)表示一个操作;(constructions)构造意味着会有新的数值对象作为结果,如果算法是一个不进行构造的算法中,就可以使用精确谓词但不精确构造的内核。...每个Kernel中都有定义好的Traits类型,这里使用的就是typedef CGAL::Projection_traits_xy_3 Gt;,使用点的xy值参与构网计算。

    26340
    领券