- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
很简单:我想创建一个四面体网格并向其中添加几个特征。
作为输入,获取可在 CGAL-4.11/examples/Mesh_3/data
中找到的文件 cube.off
。我想添加的特征(只是立方体的十二条边)保存在 cube.edges
中:
2 -1 -1 -1 -1 1 -1
2 -1 -1 -1 1 -1 -1
2 -1 -1 -1 -1 -1 1
2 -1 1 -1 1 1 -1
2 -1 1 -1 -1 1 1
2 1 1 -1 1 -1 -1
2 1 1 -1 1 1 1
2 1 -1 -1 1 -1 1
2 -1 -1 1 -1 1 1
2 -1 -1 1 1 -1 1
2 -1 1 1 1 1 1
2 1 1 1 1 -1 1
代码的MWE:
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>
#include <CGAL/Polyhedral_complex_mesh_domain_3.h>
#include <CGAL/make_mesh_3.h>
// From CGAL-4.11/examples/Mesh_3 but for simplicity copied to the current folder.
#include "read_polylines.h"
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Mesh_polyhedron_3<K>::type Polyhedron;
typedef CGAL::Polyhedral_complex_mesh_domain_3<K> Mesh_domain;
typedef CGAL::Sequential_tag Concurrency_tag;
typedef CGAL::Mesh_triangulation_3<Mesh_domain,CGAL::Default,Concurrency_tag>::type Tr;
typedef CGAL::Mesh_complex_3_in_triangulation_3<
Tr,Mesh_domain::Corner_index,Mesh_domain::Curve_segment_index> C3t3;
typedef CGAL::Mesh_criteria_3<Tr> Mesh_criteria;
typedef K::Point_3 Point;
typedef std::vector<std::vector<Point> > Polylines;
int main()
{
// Read the (one) patch.
std::vector<Polyhedron> patches(1);
std::ifstream input("cube.off");
input >> patches[0];
const std::pair<int, int> incident_subdomains[] = { std::make_pair(1,0) };
Mesh_domain domain(patches.begin(), patches.end(), incident_subdomains, incident_subdomains+1);
// Read the features.
std::string feature_edges="cube.edges";
Polylines polylines;
read_polylines<Point>(feature_edges.c_str(), polylines);
domain.add_features(polylines.begin(), polylines.end());
// Create the mesh.
Mesh_criteria criteria(CGAL::parameters::edge_size = 0.25);
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);
// Write it (if it hasn't crashed before).
std::ofstream medit_file("out.mesh");
c3t3.output_to_medit(medit_file, false, true);
}
这(当使用选项 -DCGAL_MESH_3_VERBOSE
编译时)崩溃并显示以下错误消息:
Start volume scan...Scanning triangulation for bad cells (sequential)... terminate called after throwing an instance of 'CGAL::Assertion_exception'
what(): CGAL ERROR: assertion violation!
Expr: patch_id > 0 && std::size_t(patch_id) < patch_id_to_polyhedron_id.size()
File: /yatmp/scr1/ya10813/cgal-install/include/CGAL/Polyhedral_complex_mesh_domain_3.h
Line: 457
Aborted
我错过了什么?它必须是非常基本的东西。 CGAL 是一个非常可靠的库,可以很好地处理复杂数据;我不相信一个有 12 条边的立方体足以阻止它。
当我将行 domain.add_features(polylines.begin(), polylines.end());
替换为 domain.detect_features();
时,程序正确终止。令人困惑的部分是,检测到的特征完全是我要添加的特征(我知道这是因为我在 Mesh_domain_with_polyline_features_3
中创建了一个函数,它为我打印了边缘;如果需要,我可以在这里分享)。
当我使用 Polyhedral_mesh_domain_with_features_3
而不是 Polyhedral_complex_mesh_domain_3
时,程序正确终止。这些特征似乎保留在生成的几何体中。然而,它只是一个补丁(out.mesh
中的所有三角形都有相同的最后一个数字,而在这种情况下我希望它们的数字为 0 到 11)。 编辑:要实现这一点,必须使用 detect_features();
而不是 add_features(...);
或拆分域到补丁中,让 CGAL 从中创建复合体。感谢@lrineau 的澄清。
我还尝试先将域拆分为几个补丁。然而,随后补丁的边界发生了变化。 编辑:保留它们的一种方法是将补丁边界添加为特征。
反转表面的方向(并交换 incident_subdomains
中的 0
和 1
):没有可见的变化。
更改 cube.edges
中特征线的顺序:无明显变化。
与旧版 Boost 的链接:无明显变化。
最佳答案
类(class)Polyhedral_complex_mesh_domain_3
是一年前新增的类in CGAL-4.11 .你遇到的问题是没有调用domain.detect_features()
就从来没有测试过,而且代码有一个bug:数据成员patch_id_to_polyhedron_id
只填入了检测特征()
。这解释了为什么当您调用 detect_features()
而不是 add_features(..)
时它会起作用。
编辑:我今天修复了那个错误,请参阅 PR #3393 of CGAL .修复将在未来的错误修复版本 CGAL-4.12.2 和 CGAL-4.13.1 中。
关于c++ - CGAL:添加功能失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52726224/
我想知道是否有办法让我选择CGAL中使用的浮点位宽。 例如下面的代码只是直接从CGAL手册中拷贝过来的一个凸包例子: #include #include #include typedef CGA
我正在创建一个网格实用程序库,我想包含的功能之一是能够拆分网格的不相交分区。为此,我正在尝试编写一个接受 CGAL::Surface_mesh 的方法。并返回 std::vector ,其中每个元素都
在 CGAL 中有一个任意的多面体(可以是凸面、凹面,甚至是有孔的)如何对它的面进行三角剖分,以便我可以创建 OpenGL 缓冲区进行渲染? 我已经看到convex_hull_3()返回一个具有三角面
我想检查一个点是否位于带孔的多边形内部或外部。具体来说,我感兴趣的是给定点是否位于带孔多边形的“填充区域”内;如果该点位于孔内,我会认为它位于带孔的多边形之外。 我知道有一个 CGAL 函数 chec
假设我有一个非简单的多边形, CGAL 如何帮助我将其划分为一组简单的多边形? 例如,给定一个由一系列 2D 点表示的多边形: (1, 1) (1, -1) (-1, 1) (-1, -1) 我想获得
我正在尝试使用 CGAL 执行一些简单的 2D CSG 操作。这是两个多边形相交的示例。 实际问题是在生成的多边形中追踪每个线段的原点(用颜色标记)。 我想知道这是否可能,也许对 CGAL 本身进行一
我从 CGAL 开始。我想做的是创建坐标为数字 ~ 2^51 的点。 typedef CGAL::Exact_predicates_exact_constructions_kernel K; type
我从 CGAL 开始。我想做的是创建坐标为数字 ~ 2^51 的点。 typedef CGAL::Exact_predicates_exact_constructions_kernel K; type
我是 CGAL 库的新手。但是,我认为这是一个非常适合我想做的事情的包。 我有一组表示 3D 表面的点(如图 1 所示)。 我想在这个表面上安装一个 3d 三角剖分。曲面不是封闭的,因此不占据体积。
我开始学习如何处理复杂与简单的多边形,确定点是否在多边形内部/外部等(例如http://geomalgorithms.com/a09-_intersect-3.html和相关页面)。我希望找到一个 R
这是论坛上的常见问题,但我找不到解决方案。 Windows 10 64 位、CGAL 4.11、Cmake 3.9.2、Boost 1.65.1、Qt5 for MSVS 2017、libQGLVie
我发现 CGAL 示例无法在 Mac OS X 10.9 (Mavericks) 下编译。您可以成功编译主要的 CGAL 4.3 库并链接它,但是当使用某些类型的库时,我会收到如下所示的错误。 具体来
我是 CGAL 的新手,我在 Ubuntu 16.04 上使用 CGAL 4.7-4。我正在尝试编译并运行一个非常简单的 .cpp。这是代码: #include #include int main
在 CGAL 手册中,它说 here : Scattered data interpolation solves the following problem: given measures of a
我刚刚开始在飞机上使用Nef多面体-下面的简单程序创建了一个半平面,由y=0行定义,然后由CGAL Explorer探索该半平面。 #include #include #include #inc
我正在使用 CGAL 进行几何处理。进行 delaunay 三角剖分后,我需要检查一个点是在 2D 网格内部还是外部: 最佳答案 如果你使用过CGAL的二维网格生成器,你可以: 首先,在三角剖分中定位
我一直在使用 LSCM 参数化器来展开网格。我想获得一个具有精确测量值的二维平面模型,这样如果您 Papercut ,就可以将其物理地包裹回原始模型。 似乎 SMP::parameterize() 正
大家好堆垛机, 我想编写一个函数,循环遍历 CGAL 常规 3D 三角剖分的所有有限边,并计算共享该边的所有面(面)对之间的角度。在引用指南中,我找到了一个名为 incident_facets 的方法
如果我在多边形的 2 个顶点之间有一个线段,是否可以使用 CGAL 扩展该线段直到它到达多边形边界? (如果至少一个顶点是反射顶点,就会发生这种情况)。 最佳答案 您可以通过mySegment.sup
我目前正在学习使用 CGAL 执行 3D 三角剖分,到目前为止,我已经通过插入和三角剖分 4 个顶点设法创建了一个正四面体。但是当我尝试遍历四面体的边缘并获得与该边缘对应的顶点时,我将原点作为顶点或先
我是一名优秀的程序员,十分优秀!