多边形偏移算法【Polygon Offsetting】

news2024/11/24 11:53:01

在本教程中,我们将描述一种膨胀或收缩多边形的算法。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景。

1、一般形式的同调

为了简单起见,让我们从一个形状开始,一个正方形。 我们可能熟悉通过放大或缩小形状来缩放形状的想法。 从技术上讲,这个想法被称为空间的拟似变换(homothetic transformation)或齐次膨胀(homogeneous dilation):
在这里插入图片描述

我们从由一组 n 个顶点 v定义的任何多边形开始:
在这里插入图片描述

然后,我们确定一个点 S = (s_x, s_y),我们将其称为如下相似性的中心:
在这里插入图片描述

选择相似比 lambda(任何实数)后,我们可以计算变换后的多边形中相应的新顶点 v’=H(v) ,如下所示:
在这里插入图片描述

如果我们知道顶点的坐标 v = (v_x, v_y),则其对应的相似变换图像 可以计算为:

在这里插入图片描述

2、均匀缩放是一种特例

在相似中心坐标为 (S_x, S_y) = (0,0) 的特殊情况下,相似度相对于原点发生。 这显着简化了变换多边形的图像的计算。 因此,前面的公式简化为:
在这里插入图片描述

这种特殊类型的相似变换被称为均匀缩放(uniform scaling)。 在这种情况下,因子 lambda 假定为变换的缩放因子的名称。

3、相似变换与偏移形状

一个相关的问题是涉及形状或多边形的偏移(Offset)的问题。 在某些情况下,我们可能想要假设地变换多边形,但也对结果形状施加额外的约束。 例如,我们可能希望满足添加的约束,即新形状周界中的所有点与原始形状周界中最接近的点等距:
在这里插入图片描述

例如,如果原始形状是圆形,并且我们围绕其中心缩放它,则相似变换遵循此规则。

但请注意,相似性通常不满足此约束。 这是因为变换后的多边形中的每个角点或顶点实际上通常比变换后的形状中的任何其他点距其反转图像更远。

满足限制条件的变换被称为多边形偏移(Polygon offsetting),在地理空间分析中也称为多边形缓冲(Polygon buffering)。

4、偏移多边形的程序

为了偏移具有已知顶点的多边形,我们需要一种按顺序执行以下任务的算法。 首先,我们获取每个顶点并复制它。 然后,我们按顺时针顺序将每个新顶点与其前面的旧顶点连接起来。

这让我们可以定义可以彼此独立移动的段。 选择任意长度 δ 后,我们将线段沿其轴移动该 δ 。

通过记住线段之间垂直度的定义,我们可以首先计算每个线段 AB 的斜率 m,如下:

在这里插入图片描述

垂直于该线段的直线都有一个斜率,该斜率是 m 的倒数的倒数。 对于斜率为 m 的线段的每个顶点,新坐标 (Xnew, Ynew) 需要满足以下两个方程:

在这里插入图片描述

对于 m ≠ 0。这是两个未知数 ynew, xnew 的两个方程,我们可以求解它们来找到每个顶点的新坐标。

5、把要点串起来

最后剩下的步骤包括将平移后的片段相互连接。 这可以通过创建半径为 δ 的圆周弧来完成。 每条弧都以每个原始顶点为中心,并限制在复制顶点的两个图像内。

该动画显示了膨胀的完整过程,从多边形的定义到最终形状:
在这里插入图片描述

请注意,此过程也适用于凹多边形:不过,我们需要注意检查所有偏移顶点是否位于变换后的多边形之外。 如果没有,我们需要删除它们以及落在多边形内的所有线条。 如果我们需要复习如何做到这一点,我们可以参考我们的地理围栏教程。

该过程也适用于缩小多边形。 在这种情况下,我们需要反转平移片段的方向。 这可以通过交换我们之前定义的 δ 因子的符号来完成。 然后,我们再次删除所有落在新偏移多边形形状之外的点。


原文链接:多边形偏移算法 — BimAnt

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

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

相关文章

Jmeter实现生成全局参数-随机数

我在做项目的过程中,用的比较多的是【前置处理中】-用户参数 步骤一:添加参数处理器 步骤二:填写项目中可能会用到的一些参数(固定的或者随机的都可以) teacher_name${__RandomString(1,赵钱孙李周吴郑王冯陈褚卫蒋沈…

Python指定函数参数和返回值的类型

先看一个简单的示例: # name指定为str类型,返回值为str类型 def greeting(name: str) -> str:return hello: nameif __name__ __main__:print(函数参数类型、返回值类型基本使用)s greeting(张三)print(s)try:s greeting(123) # 可以传递其他类…

学习网页设计html个人总结

学习网页设计html个人总结篇一 我在网上进行的逻辑教学工作已经完成了,闲暇无事之余,便想将个人的主页——《思东书屋》重新进行一下规划和设计,为此购买了几本有关网页设计和制作的书籍,开始学习网页的基本语言HTML。尽管网页制作…

postgresql 数据库 索引 介绍

postgresql 数据库 索引 介绍 文章目录 postgresql 数据库 索引 介绍前言一 什么是索引?二 简介三 索引的种类B-treeHash索引GiST索引GIN 索引BRIN 索引SP-GiST索引 CREATE INDEX1.大纲2.描述3. 参数UNIQUECONCURRENTLYIF NOT EXISTSINCLUDEnameONLYmethodcolumn_na…

Mysql之账号管理、建库以及四大引擎详解

目录 一、MySql数据库引擎 1.1 什么是数据库引擎? 1.2 MySQL常见数据库引擎 1.2.1.InnoDB(MySQL默认引擎) 1.2.2.MyISAM 1.2.3.MEMORY(Heap) 1.3 存储引擎查看 二、建库 2.1.默认数据库介绍 2.2.建库 2.3.查看数据库 2.4.删除数…

【嵌入式Qt开发入门】如何使用Qt进行文本读写——QFile读写文本

在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本文介绍简单的文本文件读写,内容精简,让大家了解文本读写的…

linux 内核的学习

一、启动流程 二、进程调度 进程 进程控制块(pid)结构体 重要的信息 进程标识符 pid 状态:任务状态 优先级:相对其他进程 程序计数器:程序中即将被执行的下一条指令的地址 内存指针:包括程序代码…

echarts 柱状体点击空白处

点击红框里的空白区域: 再data里定义的idlist变量:idList: [800, 300, 500, 400, 800, 300, 500, 400, 800, 300, 500, 400, 800, 300,500, 400, 800, 300, 500, 400,]//以下是js代码var chartDom document.getElementById(echartsOne)this.myChart echarts.init…

数据产品经理的职业发展机会

在当今的数字时代,数据产品经理已成为许多企业中不可或缺的角色。随着越来越多的企业开始将数据应用于业务决策和产品开发中,数据产品经理的需求也不断增加。因此,学习成为一名数据产品经理成为了许多人的热门选择。下面说一说关于如何学习数…

tty(imx serial)(二)

基于linux-3.14.16 基于imx分析 一、串口设备注册 注册了一个uart设备驱动,和一个平台设备驱动 先一个一个看 1、serial_imx_driver平台设备驱动 看看匹配的设备树,imx6qdl.dtsi定义了很多,我们只看一个 如上图,设备树描述了…

基于 RK3399+fpga 的 VME 总线控制器设计(二)硬件和FPGA逻辑设计

3.2 FPGA 最小系统设计 FPGA 最小系统是指可以使 FPGA 正常工作的最基本的系统,主要包括电源电 路、配置电路、时钟和复位电路。本次设计使用的 FPGA 为紫光同创的 PG2L100H, 接下来具体介绍 FPGA 最小系统各个部分的电路设计。 ( 1 &#…

RflySim平台——高可信度的无人控制系统开发、测试与评估平台

01/RflySim平台背景 智能无人系统是一个复杂系统,涉及机械、控制、计算机、通信和材料等多个领域技术,而AI无疑是开发IUS所需的关键技术之一。随着新一代人工智能兴起,我们正面临一场新的工业革命,人类创造了各种无人系统&#x…

论文解读|点云分割中用于多尺度处理的金字塔结构

原创 | 文 BFT机器人 01 论文内容 这篇论文是关于点云分割中金字塔架构的多尺度处理的详细解读。 点云数据的语义分割是自动驾驶和其他应用中的关键任务。在这项工作中,作者指出了在点云分割中移动U形结构的紧迫需求和巨大好处,并受到图像分割领域最新进…

Fleet Farm EDI 需求详解

Fleet Farm 是一家成立于1955年的美国卖场,总部位于威斯康星州。作为一个全方位的零售商,Fleet Farm 提供了广泛的商品和服务,涵盖了农业用品、家居装饰、户外用品、汽车用品、园艺用品等多个领域。他们的使命是为客户提供高品质的产品和卓越…

《阿里大数据之路》读书笔记:第二章 日志采集

第二章 日志采集 一、浏览器的页面日志采集 浏览器的页面型产品/服务的日志采集可分为两大类: 页面浏览(展现)日志采集 指一个页面被浏览器加载呈现时采集的日志 此类日志是最基础的互联网日志 此类日志是目前所有互联网产品的两大基本指…

【Linux】LVS负载均衡群集 NAT模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 LVS负载均衡群集 NAT模式 一、理解负载均衡群集的原理1.企业群集应用概述2.企业群集分类3.负载均衡群集架构4.负载均衡群集工作模式分析5.NAT模式6.TUN模式7.DR模式 二、LVS虚…

ESP32 BLE蓝牙服务端客户端通信

官方帮助见这里 BLE服务端命令 ATRESTORE//复位 ATBLEINIT2 //将esp32设置成蓝牙SERVER ATBLEGATTSSRVCRE //GATTS创建服务, 建议初始化后就建立GATTS, 建立连接在创建会报错 ATBLEGATTSSRVSTART //GATTS 开启全部服务。 ATBLEGATTSCHAR? //GATTS 发现服务特征 ATBLEADDR…

回收站的文件删除了怎么恢复?实用的2个方法推荐!

我一直以为回收站里的文件都是我自己删除的文件,因此没有怎么在意。但是我刚刚清空了回收站,却发现我有些重要的文件是被误删而放入回收站的,现在这些文件都被删除了,这可怎么办? 回收站中通常会存放很多我们删除的文件…

使用QT: ActiveX控件生成文件,实现在QT项目中调用.c文件

以连接的其他控件为例,控件的位数(32/64),需要和QT编译器保持一致 我在此处连接的是.h和.c文件的类接口,在QT中使用 原始接口: 1.在QT程序中添加模块 QT axcontainer2.查看COM控件的UUID 打开一个.ui文件…

Java基础-多线程JUC-生产者和消费者

1. 生产者与消费者 实现线程轮流交替执行的结果; 实现线程休眠和唤醒均要使用到锁对象; 修改标注位(foodFlag); 代码实现: public class demo11 {public static void main(String[] args) {/*** 需求&#…