CGAL的3D Alpha Shapes

        假设我们给定一个二维或三维的点集S,我们希望得到类似“这些点形成的形状”的东西。这是一个相当模糊的概念,可能有许多可能的解释,阿尔法形状就是其中之一。阿尔法形状可用于从密集的无组织数据点集进行形状重建。事实上,阿尔法形状是由一个边界划分的,该边界是原始形状的线性近似。

        正如Edelsbrunner和Mücke的论文中所提到的,我们可以直观地将α形状想象成以下形状。想象一个巨大的冰淇淋块占据了空间R3,并将点作为“硬”巧克力块。使用其中一个球形冰淇淋勺,我们挖出了冰淇淋块的所有部分,我们可以在不碰到巧克力块的情况下挖出冰淇淋块的所有部分,从而甚至可以在内部挖出孔(例如,通过从外面移动勺子无法到达的部分)。我们最终会得到一个由帽、弧和点界定的(不一定是凸的)物体。如果我们现在将所有“圆形”面拉直为三角形和线段,我们就可以直观地描述所谓的S的α形状。上图提供了二维过程的一个例子(我们的冰淇淋勺只是一个圆)。

        α 形状取决于一个参数 α,之后它们被命名。 在上面的冰淇淋类比中,α 是雕刻勺的平方半径。 一个非常小的值将允许我们吃掉所有的冰淇淋,除了巧克力点本身。 因此,我们已经看到 α 形状在 α→0 时退化为点集 S。 另一方面,α 的巨大值将阻止我们甚至在两点之间移动勺子,因为它太大,我们永远不会用勺子舀起位于 S 的凸包内部的冰淇淋。 因此,α 形状在 α→∞ 时变成 S 的凸包。

        CGAL提供了2D和3D的Alpha图形。GUDHI库提供了一个dD Alpha复合体。

1、定义

        我们区分两种α形状。基本的alpha形状基于Delaunay三角剖分。加权阿尔法形状是基于它的推广,即正三角剖分(参见Section regular Triangulations),用加权点的幂代替欧氏距离。
让我们考虑Delaunay三角剖分的基本情况。

        我们首先定义了点集S的阿尔法复形。阿尔法复形是Delaunay三角测量的一个子复形。对于给定的α值,α复形包括Delaunay三角测量中的所有单形,这些单形具有平方半径等于或小于α的空外接球。这里的“空”意味着开球不包括S的任何点。阿尔法形状就是阿尔法复形的单形所覆盖的域。

        一般来说,阿尔法复形是一种不连续的非纯复形,这特别意味着阿尔法复形可能具有奇异面。对于0≤k≤d−1,如果α复形的k-单纯形不是该复形的(k+1)-单纯形的一个方面,则称其为奇异的。

        CGAL提供两种阿尔法形状。在一般模式中,阿尔法形状严格对应于上述定义。正则化模式提供阿尔法形状的正则化版本。它对应于阿尔法复形的正则化版本所覆盖的域,其中奇异面被去除。

        一般和正则阿尔法形状的比较。左:一些点取在圆环体的表面上,三个点取在离圆环体表面相对较远的地方;中间:一般的阿尔法形状(对于足够大的阿尔法值)包含三个孤立点的奇异三角形面;右:正则化版本(对于相同的alpha值)不包含任何奇异方面。 

        一组点S的α形状形成了一个离散族,即使它们是为所有实数α定义的。整个α形状族可以通过S的底层三角剖分来表示。在这种表示中,底层三角剖分的每个k-simplex与一个区间相关联,该区间指定了k-simplex属于α复体的α值。基于这一事实,α形状族可以高效且相对容易地计算。此外,我们可以选择最佳α值来获得一个包含所有数据点并且具有小于给定数量的连通分量的α形状。此外,α值允许对一组点的三角剖面的面进行过滤。在这种过滤中,三角剖面的面以α值的升序输出,这些α值出现在α复体中。在α值相等的情况下,首先输出低维面。

        在加权α形状的情况下,定义是模拟的。输入集现在是一组加权点(可以看作球体),底层三角剖分是这个集合的规则三角剖分。两个球体或两个加权点,中心C1、C2和半径r1、r2,如果C1C22=r21+r22,则称为正交,如果C1C22<r21+r22,则称为次正交。对于给定的α值,加权α复形由规则三角剖分的单形形成,使得有一个球体与单形的顶点相关的加权点正交,并与所有其他输入加权点次正交。然后,α形状被定义为α复形覆盖的域,通常有规则版本。

2、功能

2.1、Alpha形状族

        类Alpha_shape_3<Dt,ExactAlphaComparisonTag>表示给定点集的整个alpha形状家族。该类包括该集合的基础三角剖分Dt,并将该三角剖分的每个k面与一个区间相关联,该区间指定该面属于alpha复体的α值。第二个模板参数ExactAlphaComparisonTag是一个标记,当设置为CGAL标准库中的Tag_true时,会触发alpha值之间的精确比较。

        该类提供设置和获取当前α值的函数,以及枚举α值(alpha形状变化的位置)的迭代器。

        此外,该类具有一个过滤成员函数,该函数给定一个以Object为值类型的输出迭代器,当alpha增加时,根据alpha复合体中出现的顺序输出三角形的面。

        最后,它提供了一个函数来确定最小值α,使得alpha形状满足以下两个属性:

        所有数据点要么在边界上,要么在alpha形状正则化版本的内部(没有奇异面)。

        组件的数量等于或小于给定的数量。

        当前的实现是静态的,也就是说在构造后,点不能被插入或删除。

2.2、 Alpha Shape for a Fixed Alpha

        给定alpha值,类Fixed_alpha_shape_3<Dt>表示给定点集的一个alpha形状。该类包括集合的基础三角测量Dt,并将分类类型关联到该三角剖分的每个k面。此类是动态的,即在可以插入或删除其构造点之后。

2.3、分类和迭代

        这两个类都提供了成员函数,用于将三角形的不同面相对于α形状分类为EXTERIOR、SINGULAR、REGULAR或INTERIOR(给定)α值。α复形边界上的k面被称为:REGULAR,如果它是α复形的子面,α复形是α复形(k+1)面的子面,否则是SINGULAR。不在α复形边界上的α复形的k面被称为INTERIOR。二维图示见图。

         这些类还提供输出迭代器,用于为给定的alpha值获取不同类型(EXTERIOR、SINGLUAL、REGULAR或INTERIOR)的顶点、边、面和单元。

2.4、输入和输出

        可以使用运算符<<将3D alpha形状导出到std::ostream,有关更多信息,请参阅类alpha_shape_3的文档。 

3、概念与模型

        我们目前没有为基础三角剖分类型指定概念。适用于alpha形状族的模型是类Delaunay_triangulation_3和Periodic_3_Delanay_trianglation_3的实例化(请参见周期性alpha形状的示例)。适用于固定alpha形状的模型是类Delaunay_triangulation_3的实例。适用于加权阿尔法形状的模型是类Regular_triangulation_3和Periodic_3_Regular _trianguulation_3的实例化。三角剖分需要一个几何特征类和一个三角剖分数据结构作为模板参数。

3.1、 Alpha Shapes

        对于类Alpha_shape_3<Dt,ExactAlphaComparisonTag>,特征类的要求在非加权情况下的概念AlphaShape Traits_3和加权情况下的概念WeightedAlphaShape Traits_3中进行了描述。所有CGAL内核都是这两个概念的模型。

        三角剖分的三角剖分数据结构必须是概念 TriangulationDataStructure_3 的模型,其顶点和单元类是概念 AlphaShapeVertex_3 和 AlphaShapeCell_3 的模型。类 Alpha_shape_vertex_base_3<Gt> 和 Alpha_shape_cell_base_3<Gt> 是这些概念的模型,可用于所有类型的 alpha 形状,只要适当地选择模板参数 Vb 和 Fb,正如我们将在下一节中看到的那样。

3.2、固定的Alpha形状

        对于类 Fixed_alpha_shape_3<Dt>,特征类的要求在非加权情况下的概念 FixedAlphaShape Traits_3 和加权情况下的概念 FixedWeightedAlphaShape Traits_3 中进行了描述。所有 Ridge 核都是这两个概念的模型。三角剖分的三角剖分数据结构必须是概念 TriangulationDataStructure_3 的模型,其顶点和单元类是概念 FixedAlphaShapeVertex_3 和 FixedAlphaShapeCell_3 的模型。该软件包分别提供了模型 Fixed_alpha_shape_vertex_base_3<Gt> 和 Fixed_alpha_shape_cell_base_3<Gt>。

3.3、三角剖分的数据结构

        当使用加权或周期三角剖分作为基础三角剖分时,需要额外的要求:

        使用加权三角剖分(Regular_triangulation_3 或 Periodic_3_regular_triangulation_3)时,顶点和单元类必须分别是 AlphaShapeVertex_3 和 RegularTriangulationVertexBase_3 的模型,以及 AlphaShapeCell_3 和 RegularTriangulationCellBase_3 的模型。

        使用周期三角剖分(Periodic_3_Delaunay_triangulation_3 或 Periodic_3_regular_triangulation_3)时,顶点和单元类必须分别是 AlphaShapeVertex_3 和 Periodic_3TriangulationDSVertexBase_3 的模型,以及 AlphaShapeCell_3 和 Periodic_3TriangulationDSCellBase_3 的模型

4、Alpha_shape_3与Fixed_Alpha_shape_3

        类Alpha_shape_3<Dt,ExactAlphaComparisonTag>表示给定点集的整个alpha形状家族,而类Fixed_alpha_shape_3<Dt>仅表示一个alpha形状(对于固定的alpha)。

        在使用相同的内核时,Fixed_alpha_shape_3<Dt>是更轻量级的版本。因此,当需要一个特定值的alpha的alpha形状时,它自然更加高效。

        此外,请注意,类Alpha_shape_3<Dt,ExactAlphaComparisonTag>需要构造(简单x的平方半径),而类Fixed_alpha_shape_3<Dt>仅使用谓词。这意味着使用Alpha_shape_3<Dt,ExactAlphaComparisonTag>进行认证的构造(一个或多个alpha形状)需要具有精确谓词和精确构造的内核(或将ExactAlphaComparisonTag设置为Tag_true),而使用具有精确谓词的内核对于Fixed_alpha_shape_3<Dt>就足够了。

        这使得Fixed_alpha_shape_3<Dt>在这种设置下更加高效。此外,请注意,固定版本是两个中唯一支持逐点插入和删除的版本。

        我们给出在计算具有4251个原子的蛋白质(作为一组加权点)的alpha形状时花费的时间(使用gcc 4.3在Linux上,带有-O3和-DNDEBUG标志,在2.27GHz Intel(R) Xeon(R) E5520 CPU上):

        使用Exact_predicates_inexact_constructions_kernel,构建常规三角剖分需要0.09s,然后使用类Fixed_alpha_shape_3<Dt>需要0.05s,而使用类Alpha_shape_3<Dt,ExactAlphaComparisonTag>(如果ExactAlphaComparisonTag为Tag_false)需要0.35s(使用Tag_true为0.70s)。

        使用Exact_predicates_exact_constructions_kernel,构建常规三角剖分需要0.19s,然后使用类Alpha_shape_3<Dt,ExactAlphaComparisonTag>需要0.90s。

5、其他

        当许多点以阿尔法形状输入时,例如超过10000个,使用Delaunay三角剖分和Fast_location策略作为基础三角剖分可能会有回报,以加快点位置查询。

        CGAL::Alpha_shape_3 是CGAL库中的一个类,用于构建和操作α形状。α形状是一种将三维空间中的点云数据转换为多面体的数据结构,可用于进行形状分析、表面重建等任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年最新版的linux运维面试题(二)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 11. LVS三种负载均衡模式的比较 12…

需求分析工程师岗位的职责描述(合集)

需求分析工程师岗位的职责描述1 职责&#xff1a; 1&#xff0c;负责需求调研&#xff0c;对需求进行分析&#xff0c;编写解决方案、需求规格说明书等 2&#xff0c;根据需求制作原型&#xff0c;并负责原型展示以及客户沟通等工作 3&#xff0c;负责向技术团队精确地传达业务…

数据挖掘-11-利用python进行信用卡欺诈检测(包含数据代码)

文章目录 0. 数据代码下载1. 项目介绍1.1 背景描述1.2 常见信用卡欺诈使用的情况有&#xff1a;1.3 数据描述a. 数据集内容b. 属性描述c. 注意 2. 提出问题3. 数据预处理3.1 加载数据3.2 查看数据类型&#xff0c;是否需要做数据转换处理3.3 对数据进行简单的统计&#xff0c;检…

跨平台Markdown编辑软件Typora mac功能介绍

Typora mac是一款跨平台的Markdown编辑器&#xff0c;支持Windows、MacOS和Linux操作系统。它具有实时预览功能&#xff0c;能够自动将Markdown文本转换为漂亮的排版效果&#xff0c;让用户专注于写作内容而不必关心格式调整。Typora Mac版除了支持常见的Markdown语法外&#x…

线程的同步与互斥

抢票的例子 竞争过程 进程A被切走 进程B被切走 结论&#xff1a; 互斥 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); mutex: 指向要初始化的互斥锁的指针。attr: 用于设置互斥锁属性的指针&#xff0c;通常可以传入 NULL 以使用默认属性…

react 路由v6

这里是区别&#xff1a;V5 vs V6 这里是官网&#xff1a;可以查看更多高级属性 一、基本使用&#xff1a; 1、配置文件 src/routes/index import React from "react";const Home React.lazy(() > import("../Pages/Home")); const About React.laz…

Spring之国际化:i18n

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【强化学习】PPO:近端策略优化算法

近端策略优化算法 《Proximal Policy Optimization Algorithms》 论文地址&#xff1a;https://arxiv.org/pdf/1707.06347.pdf 一、 置信域方法(Trust Region Methods) ​ 设 π θ o l d \pi_{\theta_{old}} πθold​​是先前参数为 θ o l d \theta_{old} θold​的策略网…

Java@RequestParam注解和@RequestBody注解接收参数

目录 Java后端接收数据 第一章、后端不写任何注解情况下接收参数1.1&#xff09;后端不写注解postman发出get请求1.2&#xff09;后端不写注解postman发出post请求 第二章、后端写RequestParam注解接收参数2.1&#xff09;postman发出post请求2.2&#xff09;postman发出get请求…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

【计算机网络】网络层——IP协议

目录 一. 基本概念 二. 协议报文格式 三. 网段划分 1. 第一次划分 2. CIDR方案 3. 特殊的IP地址 四. IP地址不足 1. 私有IP和公网IP 2. DHCP协议 3. 路由器 4. NAT技术 内网穿透(NAT穿透) 五. 路由转发 路由表生成算法 结束语 一. 基本概念 IP指网络互连协议…

android内存管理机制概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…

Linux与Bash 编程——Linux文件处理命令-L1

目录&#xff1a; linux系统与shell环境准备 Linux系统简介操作系统简史Linux的发行版&#xff1a;Linux与Windows比较&#xff1a;Linux安装安装包下载Linux的访问方式远程登录方式远程登录软件&#xff1a;mobaxterm的使用&#xff1a;使用电脑命令行连接&#xff1a;sshd的…

一篇讲透:箭头函数、普通函数有什么区别

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是箭头函数 箭头函数和普通函数的区别 更简洁的语法 箭头函数…

10-让Java性能提升的JIT深度剖析

文章目录 JVM的语言无关性解释执行与JITC1、C2与Graal编译器C1编译器C2编译器 分层编译(了解即可)热点代码热点探测方法调用计数器回边计数器 编译优化技术方法内联锁消除标量替换逃逸分析技术逃逸分析的原理逃逸分析 JVM的语言无关性 跨语言&#xff08;语言无关性&#xff0…

OpenHarmony之内核层解析~

OpenHarmony简介 技术架构 OpenHarmony整体遵从分层设计&#xff0c;从下向上依次为&#xff1a;内核层、系统服务层、框架层和应用层。系统功能按照“系统 > 子系统 > 组件”逐级展开&#xff0c;在多设备部署场景下&#xff0c;支持根据实际需求裁剪某些非必要的组件…

平衡二叉树的构建(递归

目录 1.概念&#xff1a;2.特点&#xff1a;3.构建方法&#xff1a;4.代码&#xff1a;小结&#xff1a; 1.概念&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;也称为AVL树&#xff0c;是一种二叉树&#xff0c;它满足每个节点的左子树和右…

BDD - Python Behave Runner Script

BDD - Python Behave Runner Script 引言Runner Scriptsubprocess.run 调用 Behave 命令行调用 Behave 提供的 API behave_main 引言 通过终端命令执行 Behave 测试用例&#xff0c;有时 IDE 重启了&#xff0c;还得重新敲一遍命令&#xff0c;很是麻烦&#xff0c;说实话我都…

单例模式(C++实现)

RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别 线程安全与STL与其他锁

Hadoop入门学习笔记——四、MapReduce的框架配置和YARN的部署

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 四、MapReduce的框架配置和YARN的部署4.1. 配置MapReduce…