![]() |
怕考试的签字笔 · 分子对接-openbabel介绍 - 简书· 1 年前 · |
![]() |
热心肠的茶叶 · VS中编译时出现“无法将文件...,对路径. ...· 1 年前 · |
![]() |
想表白的打火机 · 在Chrome中使用WebRTC ...· 1 年前 · |
CGAL(Computational Geometry Algorithms Library)是一个强大的几何算法库,提供了多种几何处理功能,包括网格重构、布尔运算、三角剖分等。
isotropic_remeshing
是 CGAL 中用于各向同性网格重构的功能,可以用来对网格进行均匀化处理。
在进行网格重构时,有时需要保持某些约束,例如边界或特征边。CGAL 提供了相应的功能来处理这些约束。以下是如何使用 CGAL 的
isotropic_remeshing
进行约束求精的详细步骤。
首先,确保你已经安装了 CGAL。你可以通过以下方式安装:
sudo apt-get install libcgal-dev
你可以从 CGAL 官方网站 下载源码并进行编译安装。
创建一个 CMake 项目来使用 CGAL。以下是一个基本的
CMakeLists.txt
文件:
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)
以下是一个示例程序,演示如何使用
isotropic_remeshing
进行约束求精。
main.cpp
#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;
}
在项目目录下创建一个
build
目录并编译项目:
mkdir build
cd build
cmake ..
make
运行生成的可执行文件,并提供一个输入的 OFF 格式的网格文件:
./isotropic_remeshing ../input.off
PMP::IO::read_polygon_mesh
读取输入的 OFF 文件,并检查网格是否为三角网格。
is_constrained_map
,并标记所有边界边为约束边。
PMP::isotropic_remeshing
进行网格重构,指定目标边长和迭代次数,并传递约束边映射。
![]() |
怕考试的签字笔 · 分子对接-openbabel介绍 - 简书 1 年前 |