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,一经查实,立即删除!

相关文章

Go和Java实现命令模式

Go和Java实现命令模式 下面通过一个烧烤的例子来说明命令模式的使用。 1、命令模式 命令模式是一种数据驱动的设计模式&#xff0c;它属于行为型模式。请求以命令的形式包裹在对象中&#xff0c;并传给调用对象。调 用对象寻找可以处理该命令的合适的对象&#xff0c;并把该…

在 MyBatis 中<应该怎么写

在 MyBatis 中&#xff0c;< 符号在 XML 配置文件中是一个特殊字符&#xff0c;用于标记 XML 标签的开始。因此&#xff0c;如果你在 MyBatis 的 if 标签中直接使用 < 符号&#xff0c;它会被解析为 XML 标签的开始&#xff0c;从而导致解析错误。 为了避免这个问题&…

用户管理第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…

C++ 类的析构函数和构造函数

构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。主要用来在创建对象时初始化对象即为对象成员变量赋初始值。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。构造函数可用…

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

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

[node] Node.js的路由

[node] Node.js的路由 路由 & 路由解析路由信息的整合URL信息路由处理逻辑路由逻辑与URL信息的整合路由的使用 路由 & 路由解析 路由需要提供请求的 URL 和其他需要的 GET/POST 参数&#xff0c;随后路由需要根据这些数据来执行相应的代码。 因此&#xff0c;根据 HT…

Android 13 - Media框架(25)- OMXNodeInstance(二)

上一节我们了解了 OMXNodeInstance 的创建过程&#xff0c;以及 IOmx 服务和 OMXNodeInstance、OMX组件之间的联系。这一节我们将一起了解 ACodec 是如何通过 OMXNodeInstance 这个中间层进行端口定义设置&#xff0c;以及端口Buffer分配的。 OMXNodeInstance 的代码还是比较长…

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 。 请你返回满足要求的 任意 子数组的 大小 。如果没有这…

记录Ubuntu20.04安装mujoco与安装mujoco_py并测试时提示Cython.Compiler.Errors.CompileError的解决方案

安装mujoco可以参考如下来链接&#xff1a; Ubuntu20.04安装mujoco&#xff1a; https://blog.csdn.net/qq_47997583/article/details/125400418 安装mujoco_py并测试时提示Cython.Compiler.Errors.CompileError&#xff1a; https://blog.csdn.net/m0_38122847/article/de…

Git 合并两个项目

前言 在 Git 中合并两个项目的代码需要一些步骤&#xff0c;尤其是如果这两个项目有不同的版本历史或者是独立的 Git 仓库。以下是一般的步骤&#xff1a; 克隆第一个项目&#xff1a; 在你的本地机器上克隆第一个项目的 Git 仓库。 git clone <URL_of_first_project>…

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…

【Java之数据结构与算法】

选择排序 package Code01;public class Code01_SelectionSort {public static void selectionSort(int[] arr) {if(arrnull||arr.length<2) {return;}for(int i0;i<arr.length;i) {int minIndex i;for(int ji1;j<arr.length;j) {minIndex arr[minIndex] > arr[j…

前后端实现解析用户请求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…

python算法例22 下一个更大的数

1. 问题描述 给定一个环形数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;为每个元素打印下一个更大的元素。数字x的下一个更大的数&#xff0c;是遍历数组的过程中出现的第一个更大的数字&#xff0c;这意味着可以循环搜索以查找其下一…

伪协议和反序列化 [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…