CGAL 5.6 - Halfedge Data Structures

news2024/11/18 11:20:46

Introduction 

半边数据结构(缩写为 HalfedgeDS,模板参数缩写为 HDS)是一种以边为中心的数据结构,能够维护顶点、边和面的入射信息,例如平面地图、多面体或其他嵌入任意维度的可定向二维曲面。每条边被分解成两个方向相反的半边。每个半边存储一个入射面和一个入射顶点。每个面和每个顶点都会存储一条入射半边。半边数据结构的简化变体可以省略其中一些信息,例如面中的半边指针或面的存储。

 

半边数据结构是一种组合数据结构,几何解释是由建立在半边数据结构之上的类添加的。这些类可能比直接使用半边数据结构更方便,因为半边数据结构只是一个实现层。请参见 "多面体表面 "一章中的 Polyhedron_3 类。

这里提供的数据结构也被称为 FE 结构 [9]、半边 [6]、[2] 或双连边列表 (DCEL) [3],尽管 DCEL [7] 的原始参考文献描述的是另一种数据结构。半边数据结构也可视为四边数据结构 [4] 的变种之一。一般来说,四边数据可以表示不可定向的 2-manifold,但这里的变体仅限于可定向的 2-manifold。关于这些不同数据结构的概述和比较,以及此处实现的设计的详尽描述,请参阅 [5]。

Software Design 

 

 图 26.1 以顶层的多面体_3 为例,说明了软件设计中三层的职责。项为实际存储的信息提供空间,即分别在顶点(Vertex)、半边(Halfedge)和面(Face)中使用成员变量和访问成员函数。半边需要提供对下一个半边和相对半边的引用。也可选择提供对上一个半边、入射顶点和入射面的引用。顶点和面可以是空的。也可以提供对入射半边的引用。半边数据结构和多面体都支持上述选项,例如,如果存在欧拉运算,欧拉运算会更新可选引用。此外,还可以用任意属性和成员函数扩展项类,这些属性和成员函数将通过继承的方式推广到多面体实际使用的类中。

顶点、半边和面作为 Items 类的局部类型传递给半边数据结构和多面体。为顶点、半边和面提供的实现满足要求中的强制部分。用户可将它们用作扩展的基类。此外,还提供了更丰富的实现作为默认设置;对于多面体,它们提供了所有可选的事件、顶点类型中的三维点和面型中的平面方程。

半边数据结构概念 HalfedgeDS 负责项目的存储组织。目前,我们提供了内部使用双向列表或向量的实现方式。HalfedgeDS 定义了属于项的句柄和迭代器。这些类型被推广到项目本身的声明中,并用于提供对事件项目的引用。类型的推广是通过项目类型的模板参数 Refs 来完成的。半边数据结构提供了插入和删除项、遍历所有项的成员函数,并提供了对项的访问权限。

HalfedgeDS 概念有两种不同的模型:HalfedgeDS_list 和 HalfedgeDS_vector,可能还会有更多。因此,我们将它们的接口保持在较小的范围内,并将常用功能分解成独立的辅助类 HalfedgeDS_decorator、HalfedgeDS_const_decorator 和 HalfedgeDS_items_decorator,图 26.1 中没有显示这些辅助类,但它们会被放在 HalfedgeDS 的边上,因为它们拓宽了接口,但并没有隐藏接口。这些辅助类包含的操作有助于实现下一层的操作,例如多面体。例如,它们添加了欧拉运算和部分运算,通过这些运算可以建立更多的欧拉运算,如在顶点的边环中插入一条边。此外,辅助类还包含自适应功能。例如,如果半边边没有提供 HalfedgeDSHalfedge::prev() 成员函数,那么辅助类的 HalfedgeDS_items_decorator::find_prev() 成员函数就会沿面的正方向搜索前一条半边边。但如果提供了 HalfedgeDSHalfedge::prev() 成员函数,HalfedgeDS_items_decorator::find_prev() 成员函数就会简单地调用它。这种区别在编译时通过一种叫做编译时标签的技术来解决,类似于 [8] 中的迭代器标签。 

 Polyhedron_3 是第三层示例,它通过添加几何解释、提供易于使用的高级函数界面并统一对下面的访问灵活性,使得使用更加方便。在这个示例中,面被重新命名为 "面"(facet),这在三维曲面中更为常见。该界面的设计旨在保护内部表示的完整性,用户不能直接写入存储在项中的句柄。Polyhedron_3 还添加了方便高效的循环器,用于访问顶点或面周围的循环边序列。为此,Polyhedron_3 从原有的项中派生出了新的顶点、半边和面。这些新项是 HalfedgeDS 中实际使用的项,从而保持了设计的类型结构的连贯性,特别是与之前的设计相比较。

Example Programs

3.1 The Default Halfedge Data Structure

下面的示例程序使用了默认的半边数据结构和装饰器类。默认的半边数据结构使用基于列表的表示法。定义了项的所有发生率和顶点的点类型。trivial traits 类提供了点的类型。程序将创建一个由两条半边、一个顶点和两个面组成的循环,并检查其有效性。

#include <CGAL/HalfedgeDS_default.h>
#include <CGAL/HalfedgeDS_decorator.h>
#include <cassert>
struct Traits { typedef int Point_2; };
typedef CGAL::HalfedgeDS_default<Traits> HDS;
typedef CGAL::HalfedgeDS_decorator<HDS> Decorator;
int main() {
    HDS hds;
    Decorator decorator(hds);
    decorator.create_loop();
    assert( decorator.is_valid());
    return 0;
}

 3.2 A Minimal Halfedge Data Structure

#include <CGAL/HalfedgeDS_min_items.h>
#include <CGAL/HalfedgeDS_default.h>
#include <CGAL/HalfedgeDS_decorator.h>
#include <cassert>

typedef CGAL::HalfedgeDS_default<int, CGAL::HalfedgeDS_min_items> HDS;
typedef CGAL::HalfedgeDS_decorator<HDS> Decorator;
int main() {
	HDS hds;
	Decorator decorator(hds);
	decorator.create_loop();
	assert(decorator.is_valid());
	return 0;
}

3.3 The Default with a Vector Instead of a List 

默认的半边数据结构内部使用一个列表和最大基类。这里我们将列表改为向量表示。同样,一个微不足道的特质类提供了用于点的类型。需要注意的是,对于矢量存储,半边数据结构的大小应事先预留,可以使用示例中的构造函数,也可以使用 reserve() 成员函数。以后可以通过进一步调用 reserve() 成员函数来调整数据结构的大小,但前提是数据结构处于一致状态,即有效状态。

#include <CGAL/HalfedgeDS_items_2.h>
#include <CGAL/HalfedgeDS_vector.h>
#include <CGAL/HalfedgeDS_decorator.h>
#include <cassert>

struct Traits {
	typedef int Point_2;
};
typedef CGAL::HalfedgeDS_vector< Traits, CGAL::HalfedgeDS_items_2> HDS;
typedef CGAL::HalfedgeDS_decorator<HDS> Decorator;
int main() {
	HDS hds(1, 2, 2);
	Decorator decorator(hds);
	decorator.create_loop();
	assert(decorator.is_valid());
	return 0;
}

CGAL 5.6 - Halfedge Data Structures: User Manual

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

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

相关文章

012:计算影线长度占比

怎么说呢&#xff0c;我希望得到一个数据&#xff0c;就是某个K线的影线长短。可以这样算&#xff0c;用高点和低点的差值作为分母&#xff0c;开盘价和收盘价的差值的绝对值作为分子&#xff0c;得出的值得越大&#xff0c;说明影线越长&#xff0c;影线越长&#xff0c;说明上…

【递归、搜索与回溯算法】第七节.257. 二叉树的所有路径和46. 全排列

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;递归、搜索与回溯算法 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&am…

666666666666666

标题 摘要引言1. HashMap简介&#xff1a;掌握什么是HashMap&#xff1f;&#x1f9d0;2. HashMap的操作技巧&#xff1a;从基础到高级&#x1f680;2.1 添加键值对&#xff1a;put(K key, V value) &#x1f4e5;2.2 获取值&#xff1a;get(Object key) &#x1f4e4;2.3 检查…

element ui el-table表格纵向横向滚动条去除并隐藏空白占位列

需求 当table内容列过多时&#xff0c;可通过height属性设置table高度以固定table高度、固定表头&#xff0c;使table内容可以滚动 现在需求是右侧滚动条不好看&#xff0c;需要去除滚动条&#xff0c;并隐藏滚动条所占列的位置 // ----------修改elementui表格的默认样式-…

068:mapboxGL绘制多边形,过滤获取选中的点的集合信息

第068个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制多边形,获取选中的点的集合信息。这里使用turf来判断点是否在多边形的范围内。通过filter方式,过滤掉未选中的点。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章…

对自动化测试的一些展望与理解

1. 需求和目标 在我开展自动化测试之前&#xff0c;其实该项目以前的测试人员也已经写了很多的接口测试用例&#xff0c;但是大多数用例处于“半瘫痪”状态&#xff0c;在CI上无人维护&#xff08;听说起初是有人维护的&#xff0c;但是后来用例多了&#xff0c;维护的人每次花…

设计模式之门面模式

前言 什么是门面模式 门面模式是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。它定义了一个高层接口&#xff0c;让子系统更容易使用。这种模式常用于将一个复杂的子系统封装成一个简单的接口&#xff0c;使得客户端可以方…

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

记 : CTF2023羊城杯 - Reverse 方向 Blast 题目复现and学习记录

文章目录 前言题目分析and复习过程exp 前言 羊城杯题目复现&#xff1a; 第一题 知识点 &#xff1a;DES算法 &#xff1a; 链接&#xff1a;Ez加密器 第二题 知识点 &#xff1a;动态调试 &#xff1a; 链接&#xff1a;CSGO 这一题的查缺补漏&#xff1a; 虚假控制流的去除…

CVE-2021-44228 Apache log4j 远程命令执行漏洞

一、漏洞原理 log4j(log for java)是由Java编写的可靠、灵活的日志框架&#xff0c;是Apache旗下的一个开源项目&#xff0c;使用Log4j&#xff0c;我们更加方便的记录了日志信息&#xff0c;它不但能控制日志输出的目的地&#xff0c;也能控制日志输出的内容格式&#xff1b;…

算法通过村第十二关青铜挑战——不简单的字符串转换问题

大家好&#xff0c;我是怒码少年小码。 今天练习一道数据处理的题目&#xff0c;字符串->整数 int myAtoi(string s) {unsigned long len s.length();//去除前端空格int index 0;while(index < len ){if(s[index]! ){break;}index;}if(index len){return 0;}int sign…

VsCode配置C/C++环境、控制台中文乱码、中文包不生效、debug调试、cin无法输入

VsCode配置C/C环境 文章目录 VsCode配置C/C环境[toc]下载VScode下载编译器MinGW 并解压将MinGW添加至环境变量测试MingGW 环境变量配置成功安装插件重启 VSCODE 并创建编程文件测试 debug可能遇到的问题Chinese 中文包未生效外部控制台中文乱码cin 无法输入终端中文乱码 下载VS…

cmake练习一

需求&#xff1a; 1、利用CGAL库Boost库&#xff0c;写一个关于CGAL的程序 2、使用cmake构建 1、创建目录结构 src中有一个main.cpp&#xff0c;放的是我们的主程序代码 2、安装CGAL和Boost库 略 3、编写cmakelist.txt cmake_minimum_required(VERSION 3.1.0) project(cg…

MySQL:至少参与xxx参与的全部事件

MySQL&#xff1a;至少参与xxx参与的全部事件 – WhiteNights Site 标签&#xff1a;MySQL, 数据库 这玩意&#xff0c;期末要考&#xff0c;还是重点。所以不得不仔细思考思考怎么写了。 什么时候用NOT EXISTS 双重否定表肯定 之前虽然已经讲过了&#xff0c;不过那一篇文章…

Apache ActiveMQ RCE漏洞复现(CNVD-2023-69477)

0x01 产品简介 ActiveMQ是一个开源的消息代理和集成模式服务器&#xff0c;它支持Java消息服务(JMS) API。它是Apache Software Foundation下的一个项目&#xff0c;用于实现消息中间件&#xff0c;帮助不同的应用程序或系统之间进行通信。 0x02 漏洞概述 Apache ActiveMQ 中存…

Flink on yarn 加载失败plugins失效问题解决

Flink on yarn 加载失败plugins失效问题解决 flink版本&#xff1a;1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口&#xff0c;TaskMana…

Go学习第十章——文件操作,Json和测试

Go文件操作&#xff0c;Json和测试 1 文件1.1 基本介绍1.2 读取的基本操作1.3 写入的基本操作1.4 使用案例(三个) 2 Go语言的Json使用2.1 序列化案例2.2 反序列化案例 3 单元测试3.1 先看个需求3.2 快速入门3.3 入门总结 1 文件 1.1 基本介绍 文件在程序中是以流的形式来操作…

Android环境变量macOS环境变量配置

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览macOS基础知识 三、设置环境变量3.1 终…

【iOS免越狱】利用IOS自动化web-driver-agent_appium-实现自动点击+滑动屏幕

1.目标 在做饭、锻炼等无法腾出双手的场景中&#xff0c;想刷刷抖音 刷抖音的时候有太多的广告 如何解决痛点 抖音自动播放下一个视频 iOS系统高版本无法 越狱 安装插件 2.操作环境 MAC一台&#xff0c;安装 Xcode iPhone一台&#xff0c;16 系统以上最佳 3.流程 下载最…

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…