CGAL的多面体凸分解

2024-01-31 08:12
文章标签 分解 多面体 cgal

本文主要是介绍CGAL的多面体凸分解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、介绍

        对于许多非凸多面体的应用,有高效的解决方案,这些解决方案首先将多面体分解为凸块。例如,可以通过将两个多面体分解为凸块来计算两个多面体的Minkowski和,然后计算凸块的配对Minkowski和,并将配对和结合起来。

        虽然将多面体分解成尽可能少的部分是可取的,但这个问题是NP-hard的。我们的实现将Nef多面体N分解为O(r^2)个凸块,其中r是与多面体内部成大于180度的角的两个相邻面的边数。这些边也被称为反射边。O(r^2)个凸块的上界是最坏情况下的最优解。

 

基于垂直面的插入进行垂直分解(从顶部看)。左图:非凸多面体。中图:非垂直反射边已解决。右图:垂直反射边已解决。子体积是凸的。

        我们的分解分为两个步骤。在第一步中,通过插入垂直面来解析每个非垂直反射边e。在第二步中,我们对垂直反射边做同样的处理。上图说明了这两个步骤。

        目前,我们的实现仅限于对有界多面体的分解。我们计划扩展到无界多面体。 

2、接口和使用

        Nef_polyhedron_3的实例代表三维空间到顶点、边、面和体积的细分。其中一些项目形成了多面体(已选择),而其他项目则表示多面体外围的体积或空洞(未选择)。例如,单位立方体是点集[0,1]3。表示单位立方体的最小细分有8个顶点,12条边,6个面和2个体积。由顶点、边和面围成的体积是立方体的内部,因此已选择。立方体外的体积不属于它,因此未选择。顶点、边和面(也称为边界项)是分隔两个体积所必需的,但也有助于表示拓扑属性。对于封闭的单位立方体,边界项是多面体的部分,因此已选择,但对于开放单位立方体[0,1)3,它们未被选择。每个项目都有自己的选择标记,这允许在布尔和拓扑操作下正确表示Nef多面体。

        通常,Nef_polyhedron_3的实例不包含任何冗余项。但是,convex_decomposition_3()通过选定的面将给定Nef_polyhedron_3的选定体积进行细分。因此,这些额外的面是冗余的,即它们的插入改变了多面体的表示形式,但不影响多面体本身。

        当convex_decomposition_3()解决所有反射边时,已选择的子体积变得凸起。每个子体积由一个单独的体积项表示,因此可以像第Shells部分的描述那样单独遍历。另一种访问凸块的方法是将它们转换为单独的Nef多面体,如以下示例代码所示。

        注意,由于对有界多面体的限制,扩展核的使用是不必要的,而且代价高昂。因此,我们不支持在凸分解中使用扩展核。

3、其他

        CGAL的Nef_polyhedron_3Polyhedron_3都是表示三维形状的数据结构,但它们在某些方面存在显著差异。

        Nef_polyhedron_3Nef_polyhedron_3是CGAL库中表示非扩展Nef三维多面体的类。Nef多面体是封闭的,无空洞的多面体,其所有顶点、边和面都位于多面体的边界上。Nef多面体满足一些特定的性质,例如它们是不可压缩的,即不可能通过连续变形(例如挤压或拉伸)来改变其形状而不破坏它。Nef_polyhedron_3特别适用于处理那些需要考虑到拓扑和几何信息的情况,例如布尔运算、碰撞检测等。

        Polyhedron_3Polyhedron_3是表示任意三维多面体的类。它允许多面体有孔洞,即可以有内部的顶点、边和面。与Nef_polyhedron_3相比,Polyhedron_3提供了更一般的多面体表示。它对于需要表示更广泛类型对象的情况更为合适,如模拟、几何建模等。由于其更一般的性质,与Nef_polyhedron_3相比,Polyhedron_3在某些操作上可能效率较低。

        总结:如果你需要处理封闭、无空洞的多面体,并关心其拓扑性质,那么Nef_polyhedron_3可能是一个更好的选择。如果你需要处理更一般的多面体,或者需要表示有孔洞的多面体,那么Polyhedron_3可能更适合你的需求。

CGAL 5.6 - Convex Decomposition of Polyhedra: User Manual

这篇关于CGAL的多面体凸分解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/663106

相关文章

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言         学习了特征值分解和奇异值分解相关知识,发现其可以用于图片压缩,但网上没有找到相应代码,本文在学习了之后编写出了图片压缩的代码,发现奇异值分

连分数因子分解法——C语言实现

参考网址:连分数分解法寻找整数的因子(Python)-CSDN博客 大数运算:C语言实现 大数运算 加减乘除模运算 超详细_64编程 加减乘除取模 复杂运算-CSDN博客 ‌连分数因子分解法‌是一种用于大整数因子分解的算法,它是计算数论中的一个重要方法。连分数因子分解法通过寻找x2≡y2 (mod p)x2≡y2 (mod p)的形式来分解N。具体来说,这种方法涉及到计算N的简单连分数展开,并

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

《机器学习》 基于SVD的矩阵分解 推导、案例实现

目录 一、SVD奇异值分解 1、什么是SVD 2、SVD的应用         1)数据降维         2)推荐算法         3)自然语言处理 3、核心         1)什么是酉矩阵         2)什么是对角矩阵 4、分解过程 二、推导 1、如何求解这三个矩阵         1)已知:          2)根据酉矩阵的特点即可得出:

学习CGAL:配置QT支持

发现问题 在之前的博客《学习CGAL:编译第一个工程》中,我成功生成了工程并编译,也貌似成功让CGAL的算法执行了。不过,我在执行工程中的draw_triangulation_2项目时,好像并没有达到期望的效果: 看起来这个程序应该能“画”出来什么东西,然而现在失败了。我想,这是因为CGAL本身只是包含算法的,要想可视化必须额外做些事情。 回头看官方文档可以发现,其实它已经提示了:很多CGA

学习CGAL:编译第一个工程

前言 CGAL对现在的我来说是个新的东西,我对他的用法用途都一无所知。但从他的名字:The Computational Geometry Algorithms Library看起来,应该是和图形学算法相关的,因此我有很强的兴趣。 首先,我想跟着官方指引下载安装,并尝试运行起来第一个范例。 1.安装boost CGAL强依赖于 Boost ,二进制库可以在SourceForge中找到。boos

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

等式(数论/唯一分解定理)

链接: https://www.nowcoder.com/acm/contest/90/F 来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数。(x、y、n均为正整数) 输入描述: 在第一行输入一个正整数T。接下来有T行,每行输入一个正整数n,请求出符合该方程要求的解数。(1<=n<=1e9) 输出描述: 输出符合该方程要求的解数。

【SGU】113. Nearly prime numbers 合数分解

传送门:【SGU】113. Nearly prime numbers 题目分析:O(sqrt(N))。。 代码如下: #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;#define rep( i , a , b ) for

基于Python的机器学习系列(23):奇异值分解(SVD)

在本篇中,我们将介绍如何利用奇异值分解(SVD)进行降维。SVD 是一种强大的矩阵分解方法,可以帮助我们提取数据中的重要特征,广泛应用于数据分析、图像处理等领域。 问题定义         在数据分析中,特别是当数据维度很高时,我们经常需要减少数据的维度以便于处理和可视化。奇异值分解(SVD)提供了一种有效的方法来实现这一目标。SVD 通过将原始数据矩阵分解成三个矩阵的乘积,从