clipper一些数据结构(入门初识(一))
clipper一些数据结构(一)
Clipper库是一个用于执行多边形裁剪(clipping)和偏移(offsetting)操作的开源C++库。在Clipper库中,点和多边形(polygon)是基本的数据结构。Clipper库主要处理的是多边形(polygons)和路径(paths),其中路径可以代表开放的多边形(即折线段)或闭合的多边形。
在Clipper中,路径通常表示为一个点的集合,这些点按照它们在路径上的顺序排列。对于开放路径(折线段),第一个点和最后一个点通常不是相同的;而对于闭合路径(多边形),第一个点和最后一个点是相同的,形成一个闭合的环。
Clipper使用Paths类型来表示一个或多个路径的集合,其中Paths是一个std::vector<std::vector<IntPoint>>。每个内部的std::vector<IntPoint>代表一个单独的路径,而IntPoint是Clipper库定义的一个包含整数坐标(int X, Y;)的点类型。
虽然Clipper没有直接定义一个名为polylines的结构,但可以使用Paths类型来表示折线段的集合。当你创建一个Paths对象并填充它时,每个路径(即每个内部的std::vector<IntPoint>)可以代表一个折线段。只要确保每个折线段的路径起点和终点不重合,它们就会被当作开放路径来处理。
以下是一个使用Clipper中Paths类型来表示折线段的示例:
#include <clipper.hpp>
#include <vector> int main() { ClipperLib::Paths polylines; // 创建一个折线段集合(即开放路径集合) ClipperLib::Paths solution; // 用于存储操作结果的集合 ClipperLib::IntPoint pt1(10, 10); ClipperLib::IntPoint pt2(20, 20); ClipperLib::IntPoint pt3(30, 10); // 添加一个折线段到polylines集合中 polylines.push_back(std::vector<ClipperLib::IntPoint>{pt1, pt2, pt3}); // 在这里可以执行Clipper的裁剪、偏移等操作... // ... // 处理结果将存储在solution中 return 0;
}
在这个示例中,polylines是一个包含单个折线段的Paths对象。这个折线段由三个点pt1、pt2和pt3定义,并且它们按照在折线段上的顺序排列。你可以根据需要向polylines中添加更多的折线段。然后,你可以使用Clipper库提供的函数来对这些折线段进行裁剪、偏移等操作,并将结果存储在solution中。
1、Point(点)
在Clipper中,点通常表示为一个包含两个浮点数(通常是double类型)的结构或类,分别代表点的x坐标和y坐标。具体的实现可能会因Clipper的版本和作者的定制而有所不同,但基本概念是相似的。
例如,一个简单的Point结构可能如下所示:
struct Point { double X; double Y;
};
2、Polygon(多边形)
多边形在Clipper中通常表示为一个点的集合(std::vector<Point>或类似的容器)。这些点按照它们在多边形边界上的顺序排列,形成多边形的轮廓。多边形的方向(顺时针或逆时针)对于某些Clipper操作是重要的,因为它决定了多边形的“内部”和“外部”。
例如,一个表示多边形的结构可能如下所示:
#include <vector> struct Polygon { std::vector<Point> Data;
};
或者,如果你直接使用Clipper库提供的类型,你可能会使用Clipper库定义的类型,比如Paths,它是一个std::vector<std::vector>,其中IntPoint是Clipper定义的一个整数坐标点类型。
3、折线段(Polyline)
在Clipper库中,折线段(通常也被称为开路径或线段序列)可以使用与多边形类似的方式来表示,即一个点的集合。Clipper库并不直接区分多边形和折线段;它们都是点的集合。但是,根据这些点如何被使用(例如,作为裁剪操作的输入或输出),以及它们的方向性,可以解释它们代表多边形还是折线段。
如果你想要明确地表示一个折线段而不是闭合的多边形,你需要确保提供的点集合不闭合,即第一个点和最后一个点不是相同的。
在Clipper中执行操作时,可能需要区分开路径(open paths,即折线段)和闭路径(closed paths,即多边形)。这通常是通过在创建路径时确保点的顺序以及是否在操作中指定路径是开还是闭来实现的。例如,在调用Clipper的某些函数时,你可能需要传递一个标志来指示路径是开放的还是闭合的。
术语
1、裁剪 (Clipping)
裁剪通常指的是在二维平面上,将图形在指定区域以外的部分去除掉的过程。在Clipper库中,裁剪操作不仅限于矩形框,还可以是任意多边形,甚至多个多边形。Clipper库支持四种基本的布尔运算:求交(Intersection)、求和(Union)、求异(Difference)、求异或(Xor)。
代码示例(使用Clipper库进行矩形裁剪):
#include <clipper.hpp>
#include <vector>
#include <iostream> int main() { ClipperLib::Paths subject, clip, solution; ClipperLib::IntPoint pt1(0, 0), pt2(100, 0), pt3(100, 100), pt4(0, 100); subject.push_back(std::vector<ClipperLib::IntPoint>{pt1, pt2, pt3, pt4}); // 创建一个矩形作为被裁剪对象 ClipperLib::IntPoint rect1(20, 20), rect2(80, 20), rect3(80, 80), rect4(20, 80); clip.push_back(std::vector<ClipperLib::IntPoint>{rect1, rect2, rect3, rect4}); // 创建一个矩形作为裁剪框 ClipperLib::Clipper clipper; clipper.AddPaths(subject, ClipperLib::ptSubject, true); // 添加被裁剪对象 clipper.AddPaths(clip, ClipperLib::ptClip, true); // 添加裁剪框 clipper.Execute(ClipperLib::ctIntersection, solution); // 执行求交运算 // 输出裁剪结果 for (const auto& path : solution) { for (const auto& pt : path) { std::cout << "(" << pt.X << ", " << pt.Y << ") "; } std::cout << std::endl; } return 0;
}
2、路径 (Path)
路径在Clipper库中指的是一系列有序点的集合,用于定义一个轮廓。这个轮廓可以是开放路径(如一条线),也可以是闭合路径(如一个多边形)。
3、线 (Line) 与 Polyline
在Clipper库中,线(Line)和折线段(Polyline)是同义的,指的是具有两个或更多点的开放路径。折线段由一系列的点组成,这些点按照它们在路径上的顺序排列,且起点和终点不重合。
4、轮廓 (Contour)
轮廓与路径是同义的,在Clipper库中,轮廓用于表示图形的外部边界或内部孔洞边界。
5、孔洞/内轮廓 (Hole)
在Clipper库中,孔洞或内轮廓指的是多边形内部的一个闭合区域,这个区域表示该部分不属于该多边形的外部边界。内轮廓通常用于定义复杂多边形的内部空洞。
6、多边形填充规则 (Polygon Filling Rule)
多边形填充规则用于定义在一系列闭合路径中,哪些区域被认为是“内部”,哪些区域被认为是“外部”。Clipper库通常使用“非零环绕规则”(Non-Zero Winding Rule)或“奇偶规则”(Odd-Even Rule)来确定填充区域。
总结
相关文章:
clipper一些数据结构(入门初识(一))
clipper一些数据结构(一) Clipper库是一个用于执行多边形裁剪(clipping)和偏移(offsetting)操作的开源C库。在Clipper库中,点和多边形(polygon)是基本的数据结构。Clipp…...
读《SQL基础教程 第二版 上》的一些总结
1. 数据库语言 DDL: Data Definition Language,数据定义语言(库、表的操作) DML: Data Manipulation Language, 数据操控语言(对表中数据的增删改) DQL: Data Query Language,数据库查询语言…...
EDI是什么:EDI系统功能介绍
EDI全称Electronic Data Interchange,中文名称是电子数据交换,也被称为“无纸化贸易”。EDI实现企业间(B2B)自动化通信,帮助贸易伙伴和组织完成更多的工作、加快物流时间并消除人为错误。 目前国内企业实现EDI通信大多…...
64B/66B GT Transceiver 配置
一、前言 前一篇文章已经讲述了64B/66B的编码原理,此篇文章来配置一下7系列GT的64B/66B编码。并讲述所对应的例子工程的架构,以及部分代码的含义。 二、IP核配置 1、打开7 Series FPGAs Transceiver Wizards,选择将共享逻辑放置在example …...
ES6: promise对象与回调地狱
ES6: promise对象与回调地狱 一、回调地狱二、Promise概述三、Promise的组成四、用函数封装Promise读取文件操作 一、回调地狱 在js中大量使用回调函数进行异步操作,而异步操作什么时候返回结果是不可控的,所以希望一段程序按我们制定的顺序执…...
Qt事件处理机制2-事件函数的传播
所有继承自QObject的类都有event函数,该函数用来处理自身的事件,函数定义如下: virtual bool QObject::event(QEvent *e);Qt帮助文档: This virtual function receives events to an object and should return true i…...
【PDF.js】PDF文件预览
【PDF.js】PDF文件预览 一、PDF.js二、PDF.js 下载1、下载PDF.js2、在项目中引入3、屏蔽跨域错误 三、项目中使用四、说明五、实现效果 使用PDFJS实现pdf文件的预览,支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、PDF.js 官方地址 文档地址 二、PD…...
从建表语句带你学习doris_表索引
1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…...
Linux CentOS 安装 MySQL 服务教程
Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc,全名GNU C Library,是大多数Linux发行版中使用的C库,为系统和应用程序提供核心的API接口。在Linux系统中,特别是在…...
MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理
说明:本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时,总是出错的背景下,不得已搜索和整理了一下,如何用命令行进行sql server 数据库和用户管理的方法,作为从Access2019 直接导出数据到sql server 数据库…...
【系统分析师】系统安全分析与设计
文章目录 1、安全基础技术1.1 密码相关1.1.1对称加密1.1.2非对称加密1.1.3信息摘要1.1.4数字签名1.1.5数字信封 1.2 PKI公钥体系 2、信息系统安全2.1 保障层次2.2 网络安全2.2.1WIFI2.2.2 网络威胁与攻击2.2.3 安全保护等级 2.3计算机病毒与木马2.4安全防范体系 1、安全基础技术…...
ActiveMQ 07 集群配置
Active MQ 07 集群配置 官方文档 http://activemq.apache.org/clustering 主备集群 http://activemq.apache.org/masterslave.html Master Slave TypeRequirementsProsConsShared File System Master SlaveA shared file system such as a SANRun as many slaves as requ…...
Redis(哨兵模式)
什么是哨兵机制 问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动…...
一种基于镜像指示位办法的RingBuffer实现,解决Mirror和2的幂个数限制
简介 在嵌入式开发中,经常有需要用到RingBuffer的概念,在RingBuffer中经常遇到一个Buffer满和Buffer空的判断的问题,一般的做法是留一个单位的buffer不用,这样做最省事,但是当RingBuffer单位是一个结构体时࿰…...
【Java开发指南 | 第十一篇】Java运算符
读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 算术运算符关系运算符位运算符逻辑运算符赋值运算符条件运算符(?:)instanceof 运算符Java运算符优先级 Java运算符包括:算术运算符、关系运算符、位运算符、逻辑运算符、赋值…...
【IC前端虚拟项目】验证环境方案思路和文档组织
【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 对于mvu的验证环境,从功能角度就可以分析出需要搭建哪些部分,再看一下mvu的周围环境哈: 很明显验证环境必然要包括几个部分: 1.模拟idu发送指令; 2.模拟ram/ddr读写数据; 3.rm模拟mvu的行为; …...
程序设计|C语言教学——C语言基础1:C语言的引入和入门
一、程序的执行 1.定义 解释:借助一个程序,那个程序能够试图理解你的程序,然后按照你的要求执行。下次执行的时候还需要从零开始解释。 编译:借助一个程序,能够像翻译官一样,把你的程序翻译成机器语言&a…...
初学python记录:力扣928. 尽量减少恶意软件的传播 II
题目: 给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示。在节点网络中,只有当 graph[i][j] 1 时,节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,…...
LlamaIndex 组件 - Storing
文章目录 一、储存概览1、概念2、使用模式3、模块 二、Vector Stores1、简单向量存储2、矢量存储选项和功能支持3、Example Notebooks 三、文件存储1、简单文档存储2、MongoDB 文档存储3、Redis 文档存储4、Firestore 文档存储 四、索引存储1、简单索引存储2、MongoDB 索引存储…...
在Linux系统中设定延迟任务
一、在系统中设定延迟任务要求如下: 要求: 在系统中建立easylee用户,设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果