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用户…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...