2D 凸包-2D Convex Hulls

news2024/12/23 19:23:04

2D 凸包-2D Convex Hulls

本章描述了CGAL中用于生成二维凸包的函数,以及用于检查点集是否为强凸的函数。还有许多用于计算特殊极值点和包点子序列的函数,如一组点的下包和上包。

CGAL提供了几种经典算法的实现,用于计算二维点集的逆时针极值点序列(即凸包上的逆时针极值点序列)。这两种算法的渐近运行时间不同,所需的几何基元集也略有不同。因此,可以选择最适合设置的算法。
在这里插入图片描述

点序列(数组)的凸包

有一个包含5个点的数组作为输入。由于这些点的凸包是输入的子集,因此可以提供一个大小相同的数组来存储结果。

#include <iostream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
int main()
{
  Point_2 points[5] = { Point_2(0,0), Point_2(10,0), Point_2(10,10), Point_2(6,5), Point_2(4,1) };
  Point_2 result[5];
  Point_2 *ptr = CGAL::convex_hull_2( points, points+5, result );
  std::cout <<  ptr - result << " points on the convex hull:" << std::endl;
  for(int i = 0; i < ptr - result; i++){
    std::cout << result[i] << std::endl;
  }
  return 0;
}

在这里插入图片描述

点向量(vector)的凸包

将内置数组替换为标准模板库中的 std::vector

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
#include <vector>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef std::vector<Point_2> Points;
int main()
{
  Points points, result;
  points.push_back(Point_2(0,0));
  points.push_back(Point_2(10,0));
  points.push_back(Point_2(10,10));
  points.push_back(Point_2(6,5));
  points.push_back(Point_2(4,1));
  CGAL::convex_hull_2( points.begin(), points.end(), std::back_inserter(result) );
  std::cout << result.size() << " points on the convex hull" << std::endl;
  return 0;
}

在这里插入图片描述

拓展到三维数据点

计算投影到 yz 平面上的三维点的凸包。使用 Projection_traits_yz_3 类是对前一个示例的一个小修改。

#include <iostream>
#include <iterator>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Projection_traits_yz_3.h>
#include <CGAL/convex_hull_2.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K3;
typedef CGAL::Projection_traits_yz_3<K3> K;
typedef K3::Point_3 Point_3;
int main()
{
	Point_3 points[5] = { Point_3(0,0,0), Point_3(0,10,0), Point_3(0,10,10), Point_3(0,6,5),Point_3(0,4,1) };
	std::ostream_iterator< Point_3 >  output(std::cout, "\n");
	CGAL::convex_hull_2(points, points+5, output, K());
	return 0;
}

在这里插入图片描述

使用Graham-Andrew算法的示例

在下面的示例中,使用 Graham_Andrew 算法构建凸包。得到的凸多边形显示在标准输出控制台。将函数 ch_graham_andrew() 替换为其他函数,如 ch_bykat() ,也可以得到相同的结果。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/ch_graham_andrew.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;

int main()
{
	std::vector<Point_2> input = { Point_2(0, 0), Point_2(1,1), Point_2(2,0), Point_2(2,2), Point_2(1,2), Point_2(0,2) };
	std::ostream_iterator< Point_2 >  out(std::cout, "\n");
	CGAL::ch_graham_andrew(input.begin(), input.end(), out);
	return 0;
}

其中,Point_2(1,1)在内部,Point_2(1,2)共线。
在这里插入图片描述
在这里插入图片描述

使用属性映射的示例

在下面的例子中,我们有一个点向量作为输入,我们检索凸包上点的索引。凸包函数的第四个参数是一个必须为 ConvexHullTraits_2 概念模型的traits类。它提供了诸如定向测试之类的谓词。类 Convex_hull_traits_adapter_2 结合a Pointer_property_map ,就是这样的模型。索引 i 就是“点”,适配器执行 points[i] 上的谓词。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>
#include <CGAL/Convex_hull_traits_adapter_2.h>
#include <CGAL/property_map.h>
#include <vector>
#include <numeric>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef CGAL::Convex_hull_traits_adapter_2<K,
    CGAL::Pointer_property_map<Point_2>::type > Convex_hull_traits_2;
int main()
{
    std::vector<Point_2> points = { Point_2(10,0),
                                    Point_2(10,0),
                                    Point_2(0,10),
                                    Point_2(1,1),
                                    Point_2(3,4),
                                    Point_2(0,0),
                                    Point_2(10,10),
                                    Point_2(2,6) };
    std::vector<std::size_t> indices(points.size()), out;
    std::iota(indices.begin(), indices.end(), 0);
    CGAL::convex_hull_2(indices.begin(), indices.end(), std::back_inserter(out),
        Convex_hull_traits_2(CGAL::make_property_map(points)));
    for (std::size_t i : out) {
        std::cout << "points[" << i << "] = " << points[i] << std::endl;
    }
    return 0;
}

输出凸包点的索引。
在这里插入图片描述

凸性检查

is_ccw_strongly_convex_2() is_cw_strongly_convex_2() 函数用于检测给定的二维点序列是否构成逆时针或顺时针强凸多边形。它们用于二维凸包函数的后置条件测试。

如果你想保持共线点,可以使用2D Delaunay三角剖分,如下面的例子所示。这个序列不是强凸的。

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <list>
#include <iostream>
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef K::Point_2 Point_2;
typedef CGAL::Delaunay_triangulation_2<K> Delaunay_triangulation_2;
int main()
{
  std::vector<Point_2> input = { Point_2(0, 0), Point_2(1,1), Point_2(2,0), Point_2(2,2), Point_2(1,2), Point_2(0,2) };
  Delaunay_triangulation_2 dt(input.begin(), input.end());
  std::list<Point_2> result;
  Delaunay_triangulation_2::Vertex_circulator vc = dt.incident_vertices(dt.infinite_vertex());
  Delaunay_triangulation_2::Vertex_circulator done(vc);
  do{
    std ::cout << vc->point() << std::endl;
    // push_front in order to obtain the counterclockwise sequence
    result.push_front(vc->point());
    ++vc;
  }while(vc != done);
  return 0;
}

使用2D Delaunay三角剖分,输出凸包点,逆时针打印凸包点。
在这里插入图片描述

参考及相关链接

  1. https://doc.cgal.org/latest/Convex_hull_2/index.html#Chapter_2D_Convex_Hulls_and_Extreme_Points
  2. https://blog.csdn.net/mrbaolong/article/details/141713098?spm=1001.2014.3001.5501
  3. https://juejin.cn/post/7409866963981451299

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

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

相关文章

嵌入式软件--51单片机 DAY 1

一、单片机 1.单片机概念 51单片机&#xff08;或称8051单片机&#xff09;原是指1980年由Intel公司推出的一种8位微控制器系列&#xff0c;现在更多的指实现了8051指令集&#xff08;单片机的“语言”&#xff09;的一系列单片机。8位指的是寄存器的位数和数据总线的位数&…

分贝通助力云天励飞“甩掉”每月报销烦恼

技术创新和应用落地两手抓,已经是每一家人工智能企业突破瓶颈、快速发展的共同选择。可在组织的日常运营中,如何提升创新效率,保证项目建设又快又好完成,人效是关键。作为国内领先的人工智能企业,云天励飞率先选择从费用支出的角度寻找人效升级突破。 企业介绍 云天励飞成立于…

confluent-kafka

confluent-kafka pip3 install confluent-kafkaProducer.py from confluent_kafka import Producer# Kafka 配置 config {bootstrap.servers: 10.10.x.x:3082,security.protocol: SASL_PLAINTEXT,sasl.mechanism: SCRAM-SHA-512,sasl.username: kafka-974a3a34-bpxuser1,sas…

SAP物料帐结账操作

1. CKMLCP 实际物料帐运行 备注&#xff1a;执行最后一步过帐结帐时&#xff0c;MMPV允许记帐结帐期间和结帐的下一期间&#xff0c;同时OB52会计期间要允许记帐到这两个期间。 2. FAGLB03 查询材料成本差异余额 物料分类帐运行前总帐余额 物料分类帐运行后总帐余额 备注&…

模具配件加工精度的重要性及如何实现高精度加工?

在现代工业生产的舞台上&#xff0c;模具配件加工如同一位技艺精湛的工匠&#xff0c;以精度至上为准则&#xff0c;为各类模具赋予了优越的品质保障。时利和将详细阐述模具配件加工精度的重要性以及如何实现高精度加工! 一、精度&#xff1a;模具配件的灵魂 模具配件的精度是其…

语音测试(一)视频转音频

视频转音频 下载ffmpeg工具进入bin目录cmd进入控制台输入命令 ffmpeg.exe -i ./视频.mp4 ./音频.wav

92. UE5 GAS RPG 使用C++创建GE实现灼烧的负面效果

在正常游戏里&#xff0c;有些伤害技能会携带一些负面效果&#xff0c;比如火焰伤害的技能会携带燃烧效果&#xff0c;敌人在受到伤害后&#xff0c;会接受一个燃烧的效果&#xff0c;燃烧效果会在敌人身上持续一段时间&#xff0c;并且持续受到火焰灼烧。 我们将在这一篇文章里…

【最新华为OD机试E卷】猜字迷(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…

计算机网络 数据链路层1

数据链路层&#xff1a; 服务&#xff1a;将来自网络层的数据传输到相邻节点的网络层 作用&#xff1a;加强物理层传输原始比特流的功能 封装成帧---组帧&#xff1a;将来自网络层的数据在首尾添加特定信息(帧定界&#xff1a;帧的起始&#xff0c;结束) 差错控制 CRC循环冗余…

Springboot快速创建的两种方法(简单易学)

方式一&#xff1a;使用网站https://start.spring.io/快速创建 直接在浏览器中输入以上网址&#xff0c;进入创建Springboot项目页面&#xff0c;根据需要勾选一些选项&#xff0c;然后下载到本地即可。 方式二&#xff1a;在IDEA中创建 步骤 创建Maven项目 导入spring-bo…

Spring boot整合接入Redis

Spring boot简单接入Redis 1.pom文件中引入redis <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.yml文件redis属性配置 spring:redis:host: 120.4…

小北使用Python和pyecharts对我校通信学院2024大数据专业就业情况进行中国地图可视化

引言 在数据分析领域&#xff0c;地图可视化是一种直观展示数据分布和趋势的有效方式。然而&#xff0c;当我们面对如“2020-2024届近5年通信就业数据”这样的数据集时&#xff0c;挑战也随之而来。这些数据通常包含就业单位名称和对应的学生信息&#xff0c;但缺乏直接的地理位…

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到&#xff0c;在查询的时候Mapper对象已经是被代理过后的&#xff1a; 所以会执行invoke方法&#xff0c;其底层实现就是JDK的动态代理&#xff1a; 如下图所示&#xff0c;如果MethodCache里面存在方法&#xff0c;则判断这个方法是否为default方…

STM32:TIM中断配置应用(1)呼吸灯:库函数讲解笔记+代码讲解笔记

声明&#xff1a;本博客为哔哩哔哩up主江协科技 “STM32入门教程”的听课笔记&#xff0c;仅供学习、参考使用&#xff0c;不得用作其他用途&#xff0c;违者必究。如有版权问题&#xff0c;请联系作者修改。 目录 一、综述 二、TIM库&#xff08;有关输出比较的函数&#x…

【如何下载Landsat数据】

下载Landsat数据可以通过多种途径实现&#xff0c;主要包括使用官方网站、第三方平台和专门的软件库等。以下是一些常用的方法&#xff1a; 1. 使用USGS官方网站 EarthExplorer&#xff08;earthexplorer.usgs.gov&#xff09; 注册账号&#xff1a;首先&#xff0c;需要在…

10-python格式化字符串的四种方法(%,format,f-string,string template)

3 f-string (格式化字符串) in Python 自 Python 3.6 引入以来,f-string 提供了一种更加简洁和直观的方式来进行字符串格式化。其语法简单明了:只需在字符串前加上字母 f 或 F,并在字符串中使用 {} 来包裹需要插入的内容。 它相比于之前的%格式化和字符串format方法写起来更…

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)(持续更新中。。。。。。)

Species Distribution Models 1.写在前面2.物种分布模型介绍3.输入数据准备及预处理3.1.如何从GBIF网站上获取分布点数据&#xff08;基于rgbif包&#xff09;3.2.分布点稀疏处理&#xff08;基于spThin函数&#xff09;3.3.如何获取环境变量数据&#xff08;基于getData函数&a…

兴业月报|八月法拍房市场套均成交折扣降至6.9折

导读 8月北京法拍房成交房源233套&#xff0c;成交总金额18.2891亿元&#xff0c;套均成交价784.94万元&#xff0c;总参拍人数890人&#xff0c;套均参拍人数3.81人&#xff0c;套均成交折扣6.9折。 ——兴业数据中心 2024年八月北京法拍房市场详细数据报告 2024.03-2024.0…

计算机网络 第1章 概述

文章目录 计算机网络概念计算机网络的组成计算机网络的功能三种数据交换技术电路交换&#xff08;Circuit Switching&#xff09;报文交换&#xff08;message&#xff09;分组交换 三种交换方式性能对比计算机网络的分类计算机网络的性能指标性能指标1&#xff1a;速率性能指标…

【mysql】mysql查询机制 调优不止是索引调优

前言&#xff1a;说到mysql调优 我们第一反应都是想到索引调优 应该这是最基本的 也是至关重要的&#xff1b;一般工作个两年 索引调优都可以掌握的八九不离十&#xff0c;相关数据结构特点也都能说个一二出来&#xff0c;所以本文重点是讲述其它机制 整体架构 连接器&#xff…