【编程】Boost::geometry Polygon 常用应用代码记录(C++)

简介

本文的代码部分都比较简单容易

Boost Geometry 是 Boost C++ 库集合的一部分,定义了用于解决几何问题的概念、工具和算法。这个库比较常用,很多现成的函数都很实用且简单,本文记录一些常用的函数和操作,重复的功能以后还会用到,到时回来查看比阅读文档方便。

Polygon操作经常用于机器人行业的感知系统中,特别是用于定义安全区域和障碍物边界框等任务。一些常见的应用包括:

  • 计算障碍物边界框与安全区域之间的重叠比例,以确定危险级别。
  • 验证障碍物是否进入自动驾驶车辆的危险区域。
  • 确定一些激光雷达点是否位于指定区域内。

应用实现

需求

  1. 生成随机多边形:创建两个随机多边形。
  2. 有效性检查和面积计算:验证多边形的有效性并计算它们的面积。
  3. 相交检测:确定两个多边形是否相交,并在相交时计算交叉多边形。
  4. 点包含检查:检查指定点是否位于交叉多边形内。

代码

#include <iostream>
#include <string>
#include <deque>
#include <vector>   // To contain points
#include <random>   // Random generate points
#include <stdexcept>// for std::runtime_error
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/geometries.hpp> // Points, lines, polygons, etc.
#include <boost/geometry/geometries/point_xy.hpp>   // 2 D point point_xy
#include <boost/geometry/geometries/polygon.hpp>    // Polygon geometry, sequence of points for a closed loopnamespace bg = boost::geometry;
// Create type aliases
using Point = bg::model::d2::point_xy<double>;
using Points = std::vector<Point>;
using Polygon = bg::model::polygon<Point>;Polygon getOverlappingPolygon(const Polygon& polygon_1, const Polygon& polygon_2)
{std::deque<Polygon> overlapping_polygon;    // The overlapping polygon number can more than onebg::intersection(polygon_1, polygon_2, overlapping_polygon);return overlapping_polygon.front();
}bool checkPolygonIntersection(const Polygon& polygon_1, const Polygon& polygon_2)
{           return bg::covered_by(polygon_1, polygon_2) || bg::overlaps(polygon_1, polygon_2);
}void printPoints(const Points& points) 
{std::cout << "Generated Points:" << std::endl;for (const auto& point : points) {std::cout << "(" << bg::get<0>(point) << ", " << bg::get<1>(point) << ")" << std::endl;}
}Points generateRandomPoints(int num_points, double min_x, double max_x, double min_y, double max_y)
{std::random_device rd;std::mt19937 gen(rd());std::uniform_real_distribution<double> dist_x(min_x, max_x);std::uniform_real_distribution<double> dist_y(min_y, max_y);Points points;for (int i = 0; i < num_points; ++i){points.push_back(Point(dist_x(gen), dist_y(gen)));}points.push_back(points.front());   // To close the loop, otherwise polygon is invalidreturn points;
}Polygon generatePolygon(const Points& points)
{Polygon polygon;bg::assign_points(polygon, points);return polygon;
}void printPolygon(const Polygon polygon, const std::string& prefix = "")
{std::cout << "Polygon " << prefix << " points are: ";for (const auto& point : polygon.outer()) {std::cout << "(" << boost::geometry::get<0>(point) << ", " << boost::geometry::get<1>(point) << ") ";}std::cout << "\t Area is: " << bg::area(polygon) << std::endl;
}Polygon generateRandomPolygon(int num_points = 4, double min_x = 0, double max_x = 4, double min_y = 0, double max_y = 4)
{int max_attempts = 10;while(max_attempts > 0){Points points = generateRandomPoints(num_points, min_x, max_x, min_y, max_y);Polygon polygon = generatePolygon(points);if (bg::is_valid(polygon))  // Check if the polygon is valid{return polygon;}std::cout << "Polygon is invalid, retrying..." << std::endl;max_attempts--;}throw std::runtime_error("Failed to generate a valid polygon after maximum attempts.");
}int main()
{Polygon polygon_1 = generateRandomPolygon();printPolygon(polygon_1, "1");Polygon polygon_2 = generateRandomPolygon();printPolygon(polygon_2, "2");// Check intersectionif (checkPolygonIntersection(polygon_1, polygon_2)){// Print the intersection polygon points and areaPolygon intersect_polygon = getOverlappingPolygon(polygon_1, polygon_2);printPolygon(intersect_polygon, "intersect");// Check if the origin point inside the polygonPoint origin = {0, 0};if (bg::within(origin, polygon_1)){std::cout << "origin is inside the polygon" << std::endl;}else{std::cout << "origin is outside the polygon" << std::endl;}}else{std::cout << "Two polygons are not intersected" << std::endl;}
}

一个样例输出:

Polygon is invalid, retrying...
Polygon is invalid, retrying...
Polygon 1 points are: (1.05432, 2.2592) (1.5928, 3.05599) (2.93741, 2.09024) (1.47085, 0.798034) (1.05432, 2.2592)       Area is: 2.13627
Polygon is invalid, retrying...
Polygon is invalid, retrying...
Polygon is invalid, retrying...
Polygon 2 points are: (1.97136, 2.36949) (2.81913, 0.603898) (1.81515, 1.29083) (0.327355, 3.53608) (1.97136, 2.36949)   Area is: 1.5729
Polygon intersect points are: (1.11448, 2.34822) (1.40193, 2.77356) (1.97136, 2.36949) (2.35279, 1.57512) (1.93617, 1.20803) (1.81515, 1.29083) (1.11448, 2.34822)      Area is: 0.946869
origin is outside the polygon

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

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

相关文章

python实例1.1:编写一个程序来计算并打印用户输入的数字列表的平均值(详解及其知识点拓展)

目录 一、主程序详细讲解 二、strip()和float()函数详细用法 三、try...except详细用法 四、列表用法及append使用方法详解 append() 方法 语法&#xff1a; 实例&#xff1a; 一、主程序详细讲解 下面是一个简单的Python程序&#xff0c;它可以接收用户输入的数字列表…

Rust---模式(Pattern)匹配

目录 模式是什么它用来做什么模式匹配和赋值为什么会有模式匹配模式匹配用在什么地方match 表达式if let表达式while let表达式for 循环let 语句函数参数不可驳模式匹配和可驳模式匹配模式是什么 在Rust中,模式(Pattern)是一种用于匹配和解构数据的语法结构。模式匹配中常用…

Mac运行不畅?一招教你轻松清理缓存,恢复流畅体验!

在日常使用Mac电脑时&#xff0c;面对系统运行速度下降或频繁卡顿的问题&#xff0c;不仅影响工作效率&#xff0c;用户体验也随之大打折扣。探究 Mac 运行变慢的背后原因&#xff0c;涵盖了一系列潜在因素&#xff0c;诸如存储空间接近极限、系统资源紧张、启动加载项过多等。…

LeetCode刷题--- 让字符串成为回文串的最少插入次数

让字符串成为回文串的最少插入次数 题目链接&#xff1a;让字符串成为回文串的最少插入次数 题目 给你一个字符串 s &#xff0c;每一次操作你都可以在字符串的任意位置插入任意字符。 请你返回让 s 成为回文串的 最少操作次数 。 「回文串」是正读和反读都相同的字符串。…

EN 14246:2006 吊顶石膏板检测

石膏板是建筑领域使用的一种主要产品&#xff0c;具有重量轻&#xff0c;强度较高&#xff0c;厚度较薄&#xff0c;易加工&#xff0c;绝热隔音和防火等性能&#xff0c;是目前市场上较为流行的轻型板材之一&#xff1b;主要用于墙板&#xff0c;吊顶&#xff0c;检修口等领域…

Java设计模式详解:抽象工厂模式

Java设计模式详解&#xff1a;抽象工厂模式 文章目录 Java设计模式详解&#xff1a;抽象工厂模式前言一、原理二、案例实战&#xff1a;打造一款汽车生产流水线三、使用场景四、与工厂模式的区别总结 前言 对于初学者来说&#xff0c;设计模式可能显得有些抽象和复杂&#xff…

1.4 掌握Scala运算符

大家好&#xff0c;今天我们将一起探讨Scala中的运算符。在Scala中&#xff0c;运算符实际上就是方法的一种特殊形式。这意味着我们可以像调用方法一样使用运算符。 首先&#xff0c;让我们了解一下Scala中的运算符种类。Scala支持多种类型的运算符&#xff0c;包括算术运算符…

IT廉连看——SpringBoot——SpringBoot快速入门

IT廉连看——SpringBoot——SpringBoot快速入门 1、idea创建工程 &#xff08;1&#xff09;普通Maven工程创建 工程名spring-boot-test 2、添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/PO…

windows7安装高版本Node

项目需要安装高版本得node&#xff0c;windows7最高支持到v13&#xff0c;需要手动下载zip安装包进行解压&#xff0c;配置环境变量&#xff0c;添加路径到path&#xff0c;如果安装了nvm需要卸载&#xff0c;否则配置得高版本node可能不生效&#xff0c;成功后如下&#xff1a…

LeetCode 24.两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…

Mysql语句(更新)

查询框架 执行顺序select 查询列表 7from 表 1[join type] join 表2 2 on 连接条件 3where 筛选条件 4group by 分组条件 5having 分组后筛选 6or…

机器学习(Machine Learning)知识点

机器学习Machine Learning知识点 机器学习1. 常用的数据处理的库有哪些2. 常用的机器学习的库有哪些3. 过拟合问题的特点4. 过拟合问题的解决方法&#xff1a;5. 说一下广度优先遍历和深度优先遍历&#xff1f;6. 什么是线性回归?7. 机器学习中&#xff0c;有哪些损失函数&…

Java常用API_正则表达式_字符串的替换和截取方法——小练习

我将通过一个练习题来展示这两个方法 练习题&#xff1a; 有一段字符串&#xff1a;小张qwertyuiop123小李asdfghjkl456小王 要求1&#xff1a;把字符串中三个姓名之间的字母替换成vs 要求2&#xff1a;把字符串中的三个姓名切割出来 编写代码&#xff1a; public class Tes…

js,uniapp,vue,小写数字转化为大写

应用场景&#xff1a; 把1、2、3&#xff0c;转为一、二、三 方法&#xff1a; retBigSrt(num) {const changeNum [零, 一, 二, 三, 四, 五, 六, 七, 八, 九]const unit [, 十, 百]num parseInt(num)const getWan (temp) > {const strArr temp.toString().split().re…

day12 函数基础(三)

一.迭代器(了解) 迭代:更新换代 迭代特点:每一次迭代得到的值,就是下一个迭代的初始值 可迭代对象: 字符串 列表 元组 字典 集合 ...... 迭代器的语法格式: ```python 变量名 = iter(可迭代对象) 变量名 = 可迭代对象._iter_ # 迭代取值格式 迭代器名._next_() next(迭代器…

马斯克推出Grok-1.5,接近GPT-4级别的性能

定于下周发布的Grok-1.5带来了增强的推理和解决问题的能力&#xff0c;并接近于已知的开源和闭源的LLM的性能&#xff0c;包括OpenAI的GPT-4和Anthropic的Claude 3。 马斯克指出&#xff0c;Grok-1.5将为xAI在X平台上的ChatGPT挑战者聊天机器人提供支持&#xff0c;而Grok-2(新…

2024.3.26力扣每日一题——设计可以求最短路径的图类

2024.3.26 题目来源我的题解方法一 Dijkstra算法求最短路径方法二 Floyd算法求最短路径 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2642 我的题解 方法一 Dijkstra算法求最短路径 图使用邻接表存储&#xff0c;添加边只需要更新邻接表就行。 求两个节点的路径最小代…

交易要想成功澳福总结几点

100%使用基本面分析的投资者能保证每次交易都能成功吗&#xff1f;100%使用技术分析的投资者能保证每次交易都能成功吗&#xff1f;在fpmarkets澳福看来无论是基本面分析还是技术分析都不能保证100%交易成功。 投资者不能只依赖一种分析进行投资交易。在fpmarkets澳福看来成功的…

GD32F470_US-016 模拟电压输出 双量程 模拟量 超声波测距模块 高精度

2.18 US-016电压式超声波测距传感器 US-016是市场上唯有的一款模拟量输出的超声波测距模块&#xff0c;输出的模拟电压和距离值成正比&#xff0c;可以方便的和其他系统相连&#xff0c;US-016工作稳定可靠。 US-016超声波测距模块可实现2cm~3m的非接触测距功能&#xff0c;供…

掌握Go语言:Go语言错误处理,从基础到高级,让你的代码更健壮!(33)

Go 语言的错误处理机制非常灵活&#xff0c;它通过错误值&#xff08;error&#xff09;来表示可能发生的错误&#xff0c;并提供了多种处理错误的方法和技巧。除了基本的错误处理方式外&#xff0c;还有一些高级用法可以进一步提升代码的健壮性和可读性。 Go 语言的错误处理基…