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.mzph.cn/news/237571.shtml

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

相关文章

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成

一、插件 Settings... 1.1 File -- Settings 1.2 Settings -- Plugins 1.2.1 搜索框&#xff0c;也可以直接搜索 1.3 Plugins -- 【输入 & 搜索】mybatis 1.3.1 插件不同功能介绍 1.3.2 翻译如下 1.4 选中 Update&#xff0c;更新下 1.4.1 更新中 1.4.2 Restart IDE 1…

ARM GIC(一) cortex-A 处理器中断简介

对于ARM的处理器&#xff0c;中断给处理器提供了触觉&#xff0c;使处理器能够感知到外界的变化&#xff0c;从而实时的处理。本系列博文&#xff0c;是以ARM cortex-A系列处理器&#xff0c;来介绍ARM的soc中&#xff0c;中断的处理。 ARM cortex-A系列处理器&#xff0c;提供…

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

CentOS 7 Tomcat服务的安装

前提 安装ava https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mirr…

【单调栈】LeetCode2334:元素值大于变化阈值的子数组

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个整数数组 nums 和一个整数 threshold 。 找到长度为 k 的 nums 子数组&#xff0c;满足数组中 每个 元素都 大于 threshold / k 。 请你返回满足要求的 任意 子数组的 大小 。如果没有这…

STM32CubeMX驱动ST7789

环境 1、单片机:STM32F103C8T6 2、开发平台&#xff1a;STM32CUBEMXkeil mdk 3、屏幕&#xff1a;ST7789&#xff0c;分辨率240*240 STM32配置 1、使用硬件SPI1驱动屏幕。配置如下&#xff1a; 2、屏幕控制引脚配置&#xff1a; 注意&#xff1a;只配置了DC,RST,CS这3个控…

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

背景 在上一篇文章中&#xff0c;我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next&#xff0c;以及各个互联网厂商开展鸿蒙应用开发的消息。其中&#xff0c;Taro作为一个重要的前端开发框架&#xff0c;也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将…

Hive执行计划

Hive提供了explain命令来展示一个查询的执行计划&#xff0c;这个执行计划对于我们了解底层原理&#xff0c;Hive 调优&#xff0c;排查数据倾斜等很有帮助。 使用语法如下&#xff1a; explain query;在 hive cli 中输入以下命令(hive 2.3.7)&#xff1a; explain select s…

前后端实现解析用户请求ip地址

前言 在我的软件系统中,如果希望安全系数高一些的话,往往会有用户登陆行为表来记录用户登陆行为,保障用户账号安全,比如记录登陆地址,每次登陆时候读取数据最近几次登陆地点,进行账号安全验证 假如以下是我的用户登陆行为表 实现获取用户登陆地址的方法有很多种,比如通过前端整…

使用pytest+selenium+allure实现web页面自动化测试

测试文件 base 基本方法data 测试数据page web页面相关操作image 测试截图log 日志文件report 测试报告文件temp 临时文件tool 文件读取&#xff0c;发邮件文件TestCases 测试用例 在page下的__init__.py文件下配置 import os import time from selenium.webdriver.common.by…

伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei

打开题目 代码审计 第一层绕过 if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){ echo "<br><h1>".file_get_contents($text,r)."</h1></br>"; 要求我们get传参的text内容必须为w…

案例109:基于微信小程序的高校寻物平台

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

[XR806开发板试用] XR806——基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

数据仓库-数据治理小厂实践

一、简介 数据治理贯穿数仓中数据的整个生命周期&#xff0c;从数据的产生、加载、清洗、计算&#xff0c;再到数据展示、应用&#xff0c;每个阶段都需要对数据进行治理&#xff0c;像有些比较大的企业都是有自己的数据治理平台或者会开发一些便捷的平台&#xff0c;对于没有平…

鸿蒙-HarmonyOS之初见

鸿蒙初识&#xff0c;此事能成&#xff01;&#xff01; 自己安装工具、配置环境并运行成功&#xff0c;流程记录。 一、首先官网下载开发工具 官网地址&#xff1a;https://developer.huawei.com/consumer/cn/ 当前最新的版本3.1 &#xff0c;windows和Mac&#xff0c;Mac又…

js中的Array.from()和Array.of()方法的用法详情

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续…

VScode安装C/C++编译器步骤

一、安装C/C插件 二、安装 MinGW-w64 工具链 使用国内源 git clone https://gitee.com/cuihongxi/ubuntu2-mac.git 下载后进入到VScode文件夹下&#xff0c;点击msys2-x86_64-20231026.exe进行安装 完成后&#xff0c;确保选中“立即运行 MSYS2”框&#xff0c;然后选择“完…

stable diffusion工作原理

目录 序言stable diffusion能做什么扩散模型正向扩散逆向扩散 如何训练逆向扩散 Stable Diffusion模型潜在扩散模型变分自动编码器图像分辨率图像放大为什么潜在空间可能存在&#xff1f;在潜在空间中的逆向扩散什么是 VAE 文件&#xff1f; 条件化(conditioning)文本条件化&am…

深信服技术认证“SCSA-S”划重点:命令执行漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

Python算法例21 交错正负数

1. 问题描述 给出一个含有正整数和负整数的数组&#xff0c;将其重新排列成一个正负数交错的数组。 2. 问题示例 给出数组[-1&#xff0c;-2&#xff0c;-3&#xff0c;4&#xff0c;5&#xff0c;6]&#xff0c;重新排序之后&#xff0c;变成[-1&#xff0c;5&#xff0c;-…