CGAL中2D Arrangements学习笔记_cgal arrangements-程序员宅基地

技术标签: CGAL  文档  算法  iterator  float  数据结构  图形  

 

 

CGAL2D Arrangements学习笔记

转载自:http://hi.baidu.com/lihao102/blog/item/33015f63b69b3b6a0c33fab6.html

 

2D Arrangement类型简介:

给定一组平面曲线,2D Arrangement能够将这组曲线所组成的图形细分成顶点、边和面这些最基本的几何单位。其中给定的曲线能够相互相交,甚至能自相交。其组成的图形在2D Arrangemen中描述成双边连接数据结构(doubly-connected edge list data-structure (D CEL for short))即把一条边变成两条半边来描述,其中,这个数据结构包含了对顶点、边、面的描述。

如上图,通过线段构造的2D Arrangements表现成了顶点(vn)、边(un)、面(fn)的形式。 其中f0是一个没有被包装的面(un_bound),其余都是被包装的面,其中f2为普通的面,f1中包含两个洞f3和f4。至于顶点和边,在这里就不多说了,很简单。需要说明的是对于f0面来说,所有里面的(即f1+f2)组成的为其一个洞。

一个面的边界由一系列的边和点组成,我们称其为a connected component of the boundary(or CCB for short)。这个CCB我们是可以迭代的访问其组成的边和顶点的。

2D Arrangement类型基本使用方法:

1、构造组成
经过研究,2D Arrangement主要由内核、DCEL描述和数据类型组成,其中CGAL提供N种内核来构造一个ARRANGMENT,而我们要用到的基本上就是二维空间中ARRANGMENT的应用,即ARRANGMENT_2,所以下面所说明和讨论的都是基于ARRANGMENT_2的;

在所有的内核之中,据文档介绍Arr_segment_traits_2是一种效率高的内核,所以我也主要以其为研究对象。DCEL一般的就是用默认的DCEL足够了,数据类型则用CGAL::MP_Float。

2、迭代访问
我们可以通过给定的迭代器来访问2D Arrangement。如下代码
template<class Arrangement>
void print_arrangement (const Arrangement& arr)
{
CGAL_precondition (arr.is_valid());
// Print the arrangement vertices.
typename Arrangement::Vertex_const_iterator vit;
std::cout << arr.number_of_vertices() << " vertices:" << std::endl;
for (vit = arr.vertices_begin(); vit != arr.vertices_end(); ++vit)
{
std::cout << "(" << vit->point() << ")";
if (vit->is_isolated())
std::cout << " - Isolated." << std::endl;
else
std::cout << " - degree " << vit->degree() << std::endl;
}

// Print the arrangement edges.
typename Arrangement::Edge_const_iterator    eit;
std::cout << arr.number_of_edges() << " edges:" << std::endl;
for (eit = arr.edges_begin(); eit != arr.edges_end(); ++eit)
std::cout << "[" << eit->curve() << "]" << std::endl;

// Print the arrangement faces.
typename Arrangement::Face_const_iterator    fit;
std::cout << arr.number_of_faces() << " faces:" << std::endl;
for (fit = arr.faces_begin(); fit != arr.faces_end(); ++fit)
print_face<Arrangement> (fit);
return;
}

注:arrangement操作方法比较简单,总有来说就是把一组线段插入到一个arrangement对象中,arrangement会自然的构造DCEL结构来描述线段所能组成的图形(不同的图形复杂度,构造需要的时间也不同),然后就可以迭代的访问其中的几何对象了。

经过研究,arrangement对于相交线段与非相交线段的处理方法,可以是不同的(不同的插入处理),见其例子

经过以上分析,就需要针对我们软件中的例子,进行抽象建模。我们的需求是,给定一组线,找出最小区域和最大外包。仔细一分析,CGAL中的arrangement类完全可以满足我们的需求。对于arrangement也是通过一组线段,就能求出其对应的面(这里可以对应我们的最小区域和最大外包),但在arrangement中只有面的概念,那么怎么样区分最小区域和最大外包呢,上文中提到过,所谓最大外包就是对应的最外面一个面,这个面是un_bound的,其余的面,也是就最小区域是被bound的,所以,针对我们的问题,这个标记应该就能够解决的。

现在的问题就是,我们采用哪一种方法来处理一组线段,是我们在外面自己离散?还是输入最基本的数据,让arrangement自己去离散?这就在于,是自己的离散算法效率高,还是arrangement的效率高。不管怎么样,我们首先还是用一组数据和结果来说明(以下数据采自己CGAL的两个例子。

其中,图A是没有离散的数据,图B是离散了的数据。运行结果如下:

A

B

其中构造图Aarrangement花了11秒多,而构造图Barrangement只花了半秒多。当然,这两份数据不是描述一个图,所以也只仅做参考和学习之用,但这说明了,arrangement对线段离散的时间和线段的复杂性是成正比的。

下面,我将自己构造的数据来说明两者的差据。(数据为横、竖各一百条线组成的简单轴网):

首先是离散了的数据的运行结果:

然后是没有离散的数据运行结果

从这份数据来看,对于简单的线段复杂度,离散与非离散数据表现出来的差异并不是很大。

但我相信,也不能完全根据这份数据盲目的判断,我将加入一些曲线,来判断运行的时间,关于结果,下次再贴。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wsh6759/article/details/7425014

智能推荐

colmapBUGMake Error in srcCMakeLists. txt Imported target Boostfilesystem includes non-existent path_colmap提示invalid path-程序员宅基地

文章浏览阅读1.1k次。背景使用colmap的时候,编译的过程中遇到的错误。解决这里我是被误导了搞了colmap的dev版本。其实改成3.6版本就可以了。想要指定版本下载,见:https://www.cnblogs.com/Sungeek/p/10275903.html之后再次编译就不再报错了。..._colmap提示invalid path

自定义函数与UDF:扩展ClickHouse的查询能力-程序员宅基地

文章浏览阅读868次,点赞21次,收藏19次。1.背景介绍在大数据时代,数据处理和分析的需求日益增长。ClickHouse是一种高性能的列式数据库,它可以实时处理大量数据并提供快速的查询速度。为了满足不同的业务需求,ClickHouse提供了一系列内置函数,以及用户自定义函数(UDF)机制,使得开发者可以轻松地扩展ClickHouse的查询能力。本文将从以下几个方面进行阐述:背景介绍核心概念与联系核心算法原理和具体操作步骤以...

Arrays$ArrayList转java.util.ArrayList_java.util.arrays$arraylist 如何转成 arraylist-程序员宅基地

文章浏览阅读1.3k次。前两天遇到一个问题,要对一个集合的某个值进行删除操作。我以前有过总结,删除List的某个原色,最好用for i 这种遍历形式,因为它是单线程的。(见①)正常的new 出来的List删除是没问题的。但是用Arrays转化成的ArrayList,就出现问题了。public static void test1(){ List<String> typeList = A..._java.util.arrays$arraylist 如何转成 arraylist

hexo入门(安装,配置,本地启动)_怎么运行hexo-程序员宅基地

文章浏览阅读1.2w次,点赞8次,收藏10次。hexo是一个快速、简洁且高效的博客框架,本文介绍hexo的安装,配置,本地启动。_怎么运行hexo

基于python网上饰品在线饰品购物商城系统设计与实现(django框架)研究背景和意义、国内外现状_小饰品网上商城的研究现状-程序员宅基地

文章浏览阅读2.3k次,点赞19次,收藏24次。基于python网上饰品在线饰品购物商城系统设计与实现(django框架)研究背景和意义、国内外现状黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,程序员宅基地专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,免费项目配有对应开发文档、开题报告、任务书、PPT、论文模版等项目都录了发布和功能操作演示视频;项目的界面和功能都可以定制,包安装运行!!!如果需要联系我,可以在CSDN网站查询黄菊华老师。_小饰品网上商城的研究现状

天池学习赛——街景字符编码识别(得分上0.93)_dst_image_path-程序员宅基地

文章浏览阅读5.9k次,点赞12次,收藏64次。目录1 比赛介绍2 解题思路3 数据集制作4 模型训练5 更改detect.py文件5 结果检测5 上传文件1 比赛介绍项目链接:零基础入门CV - 街景字符编码识别一、赛题数据赛题来源自Google街景图像中的门牌号数据集(The Street View House Numbers Dataset, SVHN),并根据一定方式采样得到比赛数据集。数据集报名后可见并可下载,该数据来自真实场景的门牌号。训练集数据包括3W张照片,验证集数据包括1W张照片,每张照片包括颜色图像和对应的编码类别和具体位置_dst_image_path

随便推点

4、Java调用FFmpeg推流到SRS_java ffmpeg推流-程序员宅基地

文章浏览阅读1.8k次。Java调用FFmpeg推流到SRS_java ffmpeg推流

使用Godaddy的API批量修改域名的NameServers,指向CloudFlare的NS,享受免费的抗DDOS保护!_godaddy cloudflare-程序员宅基地

文章浏览阅读7.3k次,点赞2次,收藏4次。目标Godaddy上有200个不同的域名,我们来批量修改它们的NameServers,指向CloudFlare的免费Plan。涉及Godaddy的API,CloudFlare的API前言上次网站被DDOS攻击,服务器供应商SoftLayer竟然直接关掉我们的服务器,为时一天,说不要影响他们其他的服务器!深深的怨气+怒气!CloudFlare(简称CF)提供免费的抗击服..._godaddy cloudflare

ROS2 - tf2_ros tf2工具-程序员宅基地

文章浏览阅读1.1k次,点赞25次,收藏26次。在本教程中,您将了解静态变换如何用于定义坐标系之间的静态关系,例如神秘海龟与世界坐标系的关系。此外,您还了解了静态变换如何通过将数据与通用坐标系相关联来帮助理解传感器数据(如激光扫描仪的数据)。最后,你们编写了自己的节点来向 tf2 发布静态变换,并学习了如何使用 static_transform_publisher 可执行文件和启动文件来发布所需的静态变换。在之前的教程中,我们创建了一个 tf2 广播器,将乌龟的姿势发布到 tf2。在本教程中,我们将创建一个 tf2 监听器,开始使用 tf2。_ros tf2工具

快速Android开发系列网络篇之Android-Async-Http-程序员宅基地

文章浏览阅读291次。先来看一下最基本的用法AsyncHttpClient client = new AsyncHttpClient();client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) {..._d:\desk\android\meowsic-master\meowsic-master\app\libs\android-async-http-1.

《数据结构教程(李春葆主编 第五版)》第一章源代码 + 《数据结构》上机实验(第九章) —查找_数据结构李春葆源代码-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏20次。1. 线性表中各结点的检索概率不等时,可用如下策略提高顺序检索的效率:若找到指定的结点,则将该结点和其前驱结点(若存在)交换,使得经常被检索的结点尽量位于表的前端。试设计在顺序结构和链式结构的线性表上实现上述策略的顺序检索算法。使用顺序结构int SeqSrch(RecType R[], int n, KeyType k){ int i = 0, temp; while(i<n) { if (R[i].key == k) { temp = R[i].key; R[i]._数据结构李春葆源代码

JSON 之 SuperObject(17): 实例 - 借用 Google 实现全文翻译-程序员宅基地

文章浏览阅读63次。为什么80%的码农都做不了架构师?>>> ...

推荐文章

热门文章

相关标签