首页 > 编程语言 >CGAL入门——凸壳算法

CGAL入门——凸壳算法

时间:2023-08-20 22:24:15浏览次数:35  
标签:入门 Point CGAL back points result 凸壳 指针

一、凸壳算法

  凸壳是能包含点集合的最小凸多边形,即凸壳是点集合的一个子集,将这个子集的点连接起来可以包含点集中所有的点。

 

二、数组中点的凸壳

#include <iostream>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/convex_hull_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; //predicates精确,constructions不精确的内核

typedef K::Point_2 Point_2;

//计算数组中点的 2D 凸壳,
int array_convex_hull_2()
{
    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];
    //输入的开始指针points,结束指针points+5,结果数组的开始指针result
    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;
}

输出结果

 这里使用的是精确谓词不精确构造的核(Exact_predicates_inexact_constructions_kernel),因为凸壳算法只对输入点的坐标和方向做比较。

convex_hull_2函数有三个输入参数:输入的开始指针,结束指针,结果数组的开始指针;一个输出参数:指针(ptr),这个指针是个边界指针,指向最后一个凸壳点的后面,所以指针差(ptr-result)是凸壳上点的数量。

 

三、vector中点的凸壳

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

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; //predicates精确,constructions不精确的内核

typedef K::Point_2 Point_2;
typedef std::vector<Point_2> Points;

//计算vector中点的 2D 凸壳
int vector_convex_hull_2()
{
    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));//输出迭代器back_inserter在递增时不执行任何操作,而是调用result.push_back(..)赋值
    std::cout << result.size() << " points on the convex hull" << std::endl;
    for (int i = 0; i < result.size(); i++)
    {
        std::cout << result[i] << std::endl;
    }
    return 0;
}

输出结果

 同样的convex_hull_2也是三个输入参数,但是这里不需要返回边界指针了,也不需要预设结果的大小,但它需要动态增长,所以这里不能简单输入result.begin(),要用帮助器函数生成的输出迭代器back_inserter,这个迭代器可以在插入值调用push_back

 

标签:入门,Point,CGAL,back,points,result,凸壳,指针
From: https://www.cnblogs.com/ping-code/p/17639425.html

相关文章

  • 【人工智能】机器学习入门之监督学习(一)有监督学习
    机器学习入门之监督学习(一)有监督学习简介监督学习算法是常见算法之一,主要分为有监督学习和无监督学习。本文主要记录了有监督学习中的分类算法和回归算法,其中回归算法是最主要内容。本笔记对应视频:阿里云开发者社区学习中心-人工智能学习路线-阶段1:机器学习概览及常见算法对应......
  • 【人工智能】深度学习框架值TF入门-模型保存与加载
    资料:https://tensorflow.google.cn/tutorials/keras/save_and_load#选项Keras的方式Keras版本模型保存与加载函数保存模型权重:model.save_weights保存HDF5文件:model.save保存pb文件:tf.saved_modeltf.saved_model和model.save的区别在于,tf.saved_model格式的模型可以直接......
  • Jmeter 接口测试工具入门
    1)Jmeter介绍JMeter是一款JAVA桌面应用程序,常常被用来做接口测试、负载测试等等JMeter是一款开源测试工具:开源免费软件,不需要任何使用费用小巧绿色,相比LoadRunner的庞大,它非常小巧并且不需要安装(需要安装JDK)功能强大,设计之初只是一个简单的性能测试工具,经过无数次更......
  • transformer小白入门
    transformer库是huggingface发布的1个框架,非常好用,很多外行看起来高大上的问题,用它都可以轻松解决,先来看1个小例子: 一、情感分析fromtransformersimportpipelineclassifier=pipeline('sentiment-analysis')classifier('youarebeautiful')这简单的三行代码,就能分析......
  • 软件测试|测试平台开发-Flask 入门:Flask HTTP请求详解
    简介上一篇文章我们介绍了flask的基本使用,编写了flask的第一个脚本。在本文中,我们将详细介绍如何使用Flask进行HTTP请求。我们将学习如何创建Flask应用程序,并通过不同的HTTP方法(GET、POST、PUT、DELETE等)发送请求。app.route()要使用不同的http方法发送请求,我们要先了解flask是如何......
  • c++基础入门
    1.安装g++编译器是编译C++代码使用的编译器,不要使用gcc了。在用户目录中单独创建一个文件夹存放下载后的3个安装文件,然后进入到目录中执行下面命令cd文件夹sudodpkg-i*.deb本地安装sudoapt-getinstallg++在线安装2.C++的语言特点及优势cwithclass(类)cplusplus大型......
  • Express - 入门
    创建Express应用可使用应用程序生成器工具(express-generator)快速创建应用程序框架。npminstall-gexpress-generator然后使用express命令就可以创建express应用了。express--view=pugmyapp使用这个命令创建一个myapp应用并将视图引擎将设置为pug。创建好应用后进......
  • 【Freertos基础入门】深入浅出freertos互斥量
    @TOC前言FreeRTOS是一款开源的实时操作系统,提供了许多基本的内核对象,其中包括互斥锁(Mutex)。互斥锁是一种常用的同步机制,用于确保在同一时间内只有一个任务可以访问共享资源,防止竞态条件等并发问题。本文将介绍FreeRTOS中的互斥锁的使用方法和注意事项。一、互斥量是什么?当多个任务......
  • 基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护
    基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护基础入门-算法分析&传输加密&数据格式&密文存储&代码混淆&逆向保护传输数据-编码型&加密型等传输格式-常规&JSON&XML等密码存储-Web&系统&三方应用代码混淆-源代码加密&逆向保护加密:1.常见加密编码进制等算法解......
  • JS入门第三节
    <ulclass="nav"><li>我的首页</li><li>产品介绍</li><li>联系方式</li></ul><script>constresult=document.querySelectorAll('li');......