CavalierContours 二维线操作

CavalierContours 二维线操作

2D polyline library for offsetting, combining, etc.
用于偏移、交并补等组合等操作的 2D 多折段线库。

Polyline Structure 多段线结构

Polylines are defined by a sequence of vertexes and a bool indicating whether the polyline is closed or open. Each vertex has a 2D position (x and y) as well as a bulge value. Bulge is used to define arcs, where bulge = tan(theta/4). theta is the arc sweep angle from the starting vertex position to the next vertex position. If the polyline is closed then the last vertex connects to the first vertex, otherwise it does not (and the last vertex bulge value is unused). See for more details regarding bulge calculations.

多段折线由一系列顶点和一个布尔值定义,该布尔值指示折线是闭合的还是开放的。每个顶点都有一个 2D 位置(x 和 y)以及一个凸起值。凸起用于定义弧,其中凸起 = tan(theta/4)。θ 是从起始顶点位置到下一个顶点位置的弧扫描角。如果折线闭合,则最后一个顶点连接到第一个顶点,否则不连接(并且最后一个顶点凸起值未使用)。

示例

#include "cavc/polylineoffset.hpp"// input polyline
cavc::Polyline<double> input;
// add vertexes as (x, y, bulge)
input.addVertex(0, 25, 1);
input.addVertex(0, 0, 0);
input.addVertex(2, 0, 1);
input.addVertex(10, 0, -0.5);
input.addVertex(8, 9, 0.374794619217547);
input.addVertex(21, 0, 0);
input.addVertex(23, 0, 1);
input.addVertex(32, 0, -0.5);
input.addVertex(28, 0, 0.5);
input.addVertex(39, 21, 0);
input.addVertex(28, 12, 0);
input.isClosed() = true;// compute the resulting offset polylines, offset = 3
std::vector<cavc::Polyline<double>> results = cavc::parallelOffset(input, 3.0);

输入多线段(包含弧段)
在这里插入图片描述
结果:
在这里插入图片描述

Demo

//
git clone https://github.com/jbuckmccready/CavalierContours.git
//vcpkg install gtest:x64-windows
// 试用vcpkg安装Qt环境和相关库
vcpkg install qt5[core,quickcontrols2]:x64-windowscmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=D:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build build --config Release

在这里插入图片描述

Polyline Offset

在这里插入图片描述

Polyline Combine 交并补

在这里插入图片描述
在这里插入图片描述

Polyline Offset Islands

在这里插入图片描述

Hilbert Curve 希尔伯特曲线

在这里插入图片描述
在这里插入图片描述

Algorithm Complexity and 2D Spatial Indexing算法复杂度和二维空间索引

该算法需要查找自相交,测试点与原始折线之间的距离,测试新线段与原始折线之间的相交,以及将开放的折线首尾相连。这些步骤的幼稚方法通常会导致 O(n2) 算法复杂性,其中每个段必须针对其他每个段进行测试,并且必须针对每个段测试每个点。
该库使用的方法是使用打包的 Hilbert R-Tree [4]空间索引。有关 c++ 实现,请参阅 staticspatialindex.hpp。这导致典型输入的算法复杂度为 O(n log n),病理输入的算法复杂度为 O(n2)。

Packed Hilbert R-Tree 希尔伯特 R-Tree

Here is an image of a closed polyline approximating a circle using 100 line segments (blue lines and red vertexes) with spatial index bounding boxes made visible (magenta, orange, and light green boxes). The root of the R-Tree is the light green box, its children are the orange boxes, and its grand children are the magenta boxes.
这是使用 100 个线段(蓝线和红色顶点)近似圆的闭合折线图像,空间索引边界框(洋红色、橙色和浅绿色框)可见。R-Tree 的根是浅绿色的盒子,它的子是橙色的盒子,它的孙子是洋红色的盒子。

在这里插入图片描述

UE 集成

直接以源码的形式集成。
在这里插入图片描述

在这里插入图片描述

参考

1、https://github.com/jbuckmccready/CavalierContours.git
2、https://jbuckmccready.github.io/CavalierContoursWebDemo/
3、https://www.lee-mac.com/bulgeconversion.html
4、https://en.wikipedia.org/wiki/Hilbert_R-tree#Packed_Hilbert_R-trees
5、https://github.com/jbuckmccready/CavalierContoursDev.git
6、https://blog.csdn.net/mrbaolong/article/details/121887605【空间填充曲线】
7、https://blog.csdn.net/mrbaolong/article/details/120854261【RTree 空间索引】

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

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

相关文章

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

前端常用的css以及css3技巧

前端常用的css以及css3 首先给大家推荐一个款很不错的微信小程序&#xff0c; 可以逗逗身边朋友&#xff0c;或者你有时候想脱身的时候&#xff0c;想找个理由接口 那么这个绝对是神器 文章目录 黑白图像使用:not()在菜单上应用/取消应用边框对图标使用 SVG继承 box-sizingCS…

若依框架实现不同端用户登录,提示用户不存在/密码错误

效果如下 提示错误 com.ruoyi.common.exception.user.UserPasswordNotMatchException: 用户不存在/密码错误at com.ruoyi.framework.web.service.CustomerLoginService.customerLogin(CustomerLoginService.java:87)at com.ruoyi.web.controller.module.customer.CustomerInfo…

LQR的横向控制与算法仿真实现

文章目录 1. 引言2. 车辆运动学线性离散模型3. LQR求解4. 算法和仿真实现 1. 引言 在现代控制理论的领域中&#xff0c;线性二次型调节器&#xff08;Linear Quadratic Regulator&#xff0c;简称LQR&#xff09;被广泛认可为一种高效的优化控制方法。LQR的核心优势在于其能力…

UE5数字孪生系列笔记(三)

C创建Pawn类玩家 创建一个GameMode蓝图用来加载我们自定义的游戏Mode新建一个Pawn的C&#xff0c;MyCharacter类作为玩家&#xff0c;新建一个相机组件与相机臂组件&#xff0c;box组件作为根组件 // Fill out your copyright notice in the Description page of Project Set…

安科瑞智慧安全用电综合解决方案

概述 智慧用电管理云平台是智慧城市建设的延伸成果&#xff0c;将电力物联网技术与云平台的大数据分析功能相结合&#xff0c;实现用电信息的可视化管理&#xff0c;可帮助用户实现安全用电&#xff0c;节约用电&#xff0c;可靠用电。平台支持web&#xff0c;app&#xff0c;微…

HarmonyOS 应用开发之进程模型

系统的进程模型如下图所示。 应用中&#xff08;同一Bundle名称&#xff09;的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility均是运行在同一个独立进程&#xff08;主进程&#xff09;中&#xff0c;如下图中绿色部分的“Main Process”。应用中&#x…

stm32定时器中断函数回调函数

方式一&#xff1a;stm32定时器中断可以直接在硬件中断函数TIM3_IRQHandler执行。 在HAL库中可以注册回调函数&#xff0c;在定时器中断发生时调用注册的函数&#xff0c;这样可以统一接口&#xff0c;大大提高函数可读性&#xff0c;和硬件解耦提高程序可移植性。 使用过程如…

爬取b站音频和视频数据,未合成一个视频

一、首先找到含有音频和视频的url地址 打开一个视频&#xff0c;刷新后&#xff0c;找到这个包&#xff0c;里面有我们所需要的数据 访问这个数据包后&#xff0c;获取字符串数据&#xff0c;用正则提取&#xff0c;再转为json字符串方便提取。 二、获得标题和音频数据后&…

Python基础:标准库 -- pprint (数据美化输出)

1. pprint 库 官方文档 pprint --- 数据美化输出 — Python 3.12.2 文档 pprint — Data pretty printer — Python 3.12.2 documentation 2. 背景 处理JSON文件或复杂的嵌套数据时&#xff0c;使用普通的 print() 函数可能不足以有效地探索数据或调试应用程序。下面通过一…

PHP实现单列内容快速查重与去重

应用场景:excel一列内容比如身份证号&#xff0c;可能有重复的&#xff0c; 则用此工具快速查询那些重复及显示去重后内容。 使用&#xff1a;粘贴一列数据&#xff0c;然后提交发送。 <?php $tm "单列查重去重(粘贴Excel中1列内容查重)!";function tipx($str…

攻防世界-baby_web

题目信息 相关知识 使用bp进行抓包 解题过程 题目界面如下所示: 试图找index界面&#xff1a; 发现又跳转到http://61.147.171.105:51201/1.php页面&#xff0c;因此说明61.147.171.105:51201/index.php是存在的&#xff08;因为笔者试了&#xff0c;不存在的页面会直接报…