CGAL 2D Polygons

news2024/9/22 13:43:49

CGAL 2D Polygons

简单概述 CGAL 2D Polygons使用。

简述

2D Polygon多边形是由一条封闭的边链表组成。对于多边形的操作有若干种常见的算法,有些算法要求多边形是简单多边形。如果边不相交,则多边形为简单多边形,除非连续的边相交于它们的公共顶点。

2d Polygons

常见的多边形算法:

  • 找出最左边、最右边、最上面和最下面的顶点。
  • 计算(有符号)面积。
  • 检查多边形是否为简单多边形。
  • 检查多边形是否为凸多边形。
  • 寻找到方向(顺时针或逆时针)。
  • 检查一个点是否位于多边形内。

所有这些操作都需要两个前向迭代器作为参数来描述多边形。这些形参的值类型与点类型相同。
Polygon_2 可用于表示多边形。多边形是动态的。顶点可以被修改、插入和删除。它们以成员函数的形式提供上述算法。此外,它们还提供了遍历顶点和边的方法。
Polygon_2 类是一个点容器的包装器,但仅此而已。特别是,计算值不会被缓存。也就是说,当 Polygon_2::is_simple() 成员函数被调用两次或两次以上时,每次都会重新计算结果。

示例

Polygon类

下面的例子创建了一个多边形,并说明了一些成员函数的用法。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
typedef CGAL::Polygon_2<K> Polygon_2;
using std::cout; using std::endl;
int main()
{
  Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6)};
  Polygon_2 pgn(points, points+4);
  // check if the polygon is simple.
  cout << "The polygon is " <<
    (pgn.is_simple() ? "" : "not ") << "simple." << endl;
  // check if the polygon is convex
  cout << "The polygon is " <<
    (pgn.is_convex() ? "" : "not ") << "convex." << endl;
  return 0;
}

在这里插入图片描述

操作点序列的算法

下面的例子创建了一个多边形,并演示了一些操作点序列的全局函数的用法。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point;
using std::cout; using std::endl;
void check_inside(Point pt, Point* pgn_begin, Point* pgn_end, K traits)
{
    cout << "The point " << pt;
    switch (CGAL::bounded_side_2(pgn_begin, pgn_end, pt, traits)) {
    case CGAL::ON_BOUNDED_SIDE:
        cout << " is inside the polygon.\n";
        break;
    case CGAL::ON_BOUNDARY:
        cout << " is on the polygon boundary.\n";
        break;
    case CGAL::ON_UNBOUNDED_SIDE:
        cout << " is outside the polygon.\n";
        break;
    }
}
int main()
{
    Point points[] = { Point(0,0), Point(5.1,0), Point(1,1), Point(0.5,6) };
    // check if the polygon is simple.
    cout << "The polygon is "
        << (CGAL::is_simple_2(points, points + 4, K()) ? "" : "not ")
        << "simple." << endl;
    check_inside(Point(0.5, 0.5), points, points + 4, K());
    check_inside(Point(1.5, 2.5), points, points + 4, K());
    check_inside(Point(2.5, 0), points, points + 4, K());
    return 0;
}

在这里插入图片描述

3D空间中的多边形

有时,在3D数据上运行2D算法很有用。多边形可以是3D对象的轮廓,其中轮廓被组织为通过从扫描仪分割图像数据产生的平行切片。
为了避免在 xy 平面上的显式投影,可以使用traitProjection_traits_xy_3 ,它是2D和3D线性几何内核的一部分。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_yz_3.h>
#include <CGAL/Polygon_2_algorithms.h>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_3 Point_3;
int main()
{
  Point_3 points[4] = { Point_3(0,1,1), Point_3(0,2,1), Point_3(0,2,2), Point_3(0,1,2) };
  bool b =  CGAL::is_simple_2(points,
                              points+4,
                              CGAL::Projection_traits_yz_3<K>());
  if (!b){
    std::cerr << "Error polygon is not simple" << std::endl;
    return 1;
  }
  return 0;
}

将三维多边形投影到yz平面上,判断投影的多边形是否为简单多边形。

迭代遍历顶点和边

polygon类提供了 Polygon_2::vertices_begin()Polygon_2::vertices_end() 这样的成员函数来迭代顶点。它还提供了一个成员函数 Polygon_2::vertices() ,它返回一个range,主要用于现代的 for 循环。这同样适用于 Polygon_with_holes_2 类的边和孔。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polygon_2<K>                                  Polygon_2;
typedef K::Point_2                                          Point_2;
typedef K::Segment_2                                        Segment_2;
int main()
{
  // create a polygon and put some points in it
  Polygon_2 p;
  p.push_back(Point_2(0,0));
  p.push_back(Point_2(4,0));
  p.push_back(Point_2(4,4));
  for(const Point_2& p : p.vertices()){
    std::cout << p << std::endl;
  }
  // As the range is not light weight, we have to use a reference
  const Polygon_2::Vertices& range = p.vertices();
  for(auto it = range.begin(); it!= range.end(); ++it){
    std::cout << *it << std::endl;
  }
  for(const Segment_2& e  : p.edges()){
    std::cout << e << std::endl;
  }
  return EXIT_SUCCESS;
}

在这里插入图片描述

绘制多边形

调用CGAL::draw()函数可以可视化多边形,如下面的例子所示。这个函数会打开一个显示给定多边形的新窗口。对这个函数的调用是阻塞的,也就是说,只要用户不关闭窗口,程序就会继续运行。Polygon_with_holes_2有一个版本,CGAL::draw<PH>()

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/draw_polygon_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Polygon_2<K>                                  Polygon_2;
typedef CGAL::Point_2<K>                                    Point;
int main()
{
	// create a polygon and put some points in it
	Polygon_2 p;
	p.push_back(Point(0, 0));
	p.push_back(Point(4, 0));
	p.push_back(Point(4, 4));
	p.push_back(Point(2, 2));
	p.push_back(Point(0, 4));
	CGAL::draw(p);
	return EXIT_SUCCESS;
}

在这里插入图片描述
该函数需要 CGAL_Qt5 ,并且仅在定义宏 CGAL_USE_BASIC_VIEWER 时可用。与cmake目标 CGAL::CGAL_Basic_viewer 连接将与 CGAL_Qt5 连接并添加定义 CGAL_USE_BASIC_VIEWER

CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.1...3.23)
project(test)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
create_single_source_cgal_program("test.cpp")
if(CGAL_Qt5_FOUND)
  #link it with the required CGAL libraries
  target_link_libraries(test PUBLIC CGAL::CGAL_Basic_viewer)
endif()

示例demo

ploygon.wkt文件。

POLYGON((0 0,4 0,4 4,2 2,0 4))

在这里插入图片描述

参考

  1. https://doc.cgal.org/latest/Polygon/index.html

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

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

相关文章

django外键表查询存储删除

查询 之前用get 现在用filter,get返回对象&#xff0c;filter返回列表django model的get和filter方法的区别_django模型objects.get-CSDN博客 存储 删除

[001-07-001].Redis中的BigKey使用分析

1、常见面试题&#xff1a; 1.阿里的广告平台&#xff0c;海量数据里面查询某一固定前缀的key2.小红书&#xff0c;如何在生产限制keys*/flushdb/flushall等危险命令以防止误删除误使用3.美团&#xff0c;MEMORU USAGE命令你使用过吗4.Bikey问题&#xff0c;多大算big&#xf…

Spring之配置类解析源码解析

解析配置类 解析配置类流程图&#xff1a;https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图&#xff1a;https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时&#xff0c;需要传入一个AppConfig.class给Appli…

VMware安装Ubuntu Linux Server操作系统

本文主要描述在VMware虚拟机上安装Ubuntu Linux Server操作系统&#xff0c;本版本集成kubernetes云原生对应的microk8s组件。 如上所示&#xff0c;从Ubuntu官方网站上下载Ubuntu服务器版本的安装文件 如上所示&#xff0c;在VMware上新建虚拟机&#xff0c;指定已下载的Ubunt…

基于yolov5的明厨亮灶阳光厨房老鼠检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的明厨亮灶阳光厨房老鼠检测系统是一种高效、智能的食品安全监测解决方案。该系统利用YOLOv5网络模型&#xff0c;结合深度学习技术&#xff0c;实现对厨房环境的实时监控与智能分析。 YOLOv5以其高速和高精度的特性&#xff0c;在实时目标检测任务中…

chapter09-OOP高级部分——(内部类)——day13

413-四种内部类 414-局部内部类1 记住: (1)局部内部类定义在方法中/代码块(2)作用域在方法体或者代码块中(3)本质仍然是一个类 415-局部内部类2 416-匿名内部类本质 匿名内部类只能用一次&#xff0c;并实例化了一个tiger对象&#xff0c; tiger指向它的对象&#xff0c;tig…

18043 找出3个数中最大的数

### 思路 1. 从键盘输入三个整数&#xff0c;使用空格分隔。 2. 比较三个整数&#xff0c;找出其中最大的数。 3. 输出最大的数。 ### 伪代码 1. 读取输入的三个整数。 2. 比较三个整数&#xff0c;找出最大的数。 3. 输出最大的数。 ### C代码 #include <iostream>…

Python编码系列—Python调试秘籍:pdb调试工具的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

《神话:悟空》的破晓之路:文化深度与技术巅峰的交响乐章

在八月的炽热中&#xff0c;《黑神话&#xff1a;悟空》如同一道璀璨的光芒&#xff0c;划破了国产游戏的寂静夜空&#xff0c;不仅以其惊人的销量速度震撼了业界&#xff0c;更以其深厚的文化底蕴与顶尖的游戏设计&#xff0c;在全球玩家心中留下了不可磨灭的印记。这款游戏的…

Masonry的入门学习

Masonry的学习 文章目录 Masonry的学习前言使用MasonryMasonry支持的属性修饰语基础APIAuto Boxing中心点设置边距优先级创建约束更新约束使用Masonry来布局UIScrollview 小结 前言 在日常的开发中&#xff0c;我们如果面对一些很复杂的UI布局&#xff0c;我们如果统一使用fram…

并发编程之AtomicUnsafe魔法类详解

并发编程之Atomic&Unsafe魔法类详解_并发魔法类-CSDN博客

京东2025校招/社招内推信息

社招链接&#xff1a;https://zhaopin.jd.com/web/job/job_info_list/3 社招内推码&#xff1a;JC8DI 校招链接&#xff1a;https://campus.jd.com/home#/ 校招内推码&#xff1a;C49D1 有需要的同学也可私信我姓名、电话、邮箱内推已经投递的同学可私信我获取最新进展哦

国内访问GitHub很卡,steam连接断开怎么办

目录 第一章、问题分析1.1&#xff09;问题1.2&#xff09;解决&#xff1a;下载个加速器就好了 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、问题分析 1.1&#xff09;问题 国内访问GitHub很卡怎…

Docker容器技术详解

一、Docker简介及部署方法 1.1Docker简介 1.1.1什么是docker Docker是管理容器的引擎&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚拟化技术 docker的重要特点和优势&#xff1a; 1. 轻量级虚拟化Docker 容器相较于传统的虚拟机更加轻量和高效&#xff0c;能够…

基于langchain的多轮对话RAG

目录 概述 整体架构 代码实现 输出展示 参考 概述 相比于单轮对话&#xff0c;多轮对话要考虑历史对话记录&#xff0c;大模型需要根据对话上下文去回答用户的问题。在RAG的场景中&#xff0c;通常需要通过问题去召回和问题相关的知识&#xff0c;再将知识和问题交给大模型…

江大白 | 大模型时代,CV目标检测任务,会走向何方?

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;大模型时代&#xff0c;CV目标检测任务&#xff0c;会走向何方&#xff1f; 以下文章来源于知乎&#xff1a;深度眸 作者&#xff1a;深度眸 编辑&#…

华为手机永久关闭自动亮度 | 使用智慧场景

问题 使用华为手机时&#xff0c;无法在设置中永久性关闭自动亮度&#xff0c;因为每次手机重启后都会自动打开自动亮度。此问题目前无法通过设置去解决&#xff0c;但可以通过华为的智慧场景解决&#xff0c;下文介绍解决方案。 解决方案 智慧场景 打开智慧生活APP&#xf…

JavaScript 作用链

JavaScript 作用链是指在 JavaScript 中查找变量时所遵循的规则和路径。它描述了当前执行上下文及其父级上下文之间的关系。作用链用于解析变量&#xff0c;当在一个作用域中查找变量时&#xff0c;如果当前作用域中没有找到&#xff0c;则会沿着作用链向上查找&#xff0c;直到…

华为OD机试真题 - 查找充电设备组合 - 子集和问题(Java/Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

51单片机——LED点阵屏

1、点阵屏简介 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色&#xff1a;单色、双色、全彩 …