当前位置: 首页 > news >正文

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一些数据结构&#xff08;一&#xff09; Clipper库是一个用于执行多边形裁剪&#xff08;clipping&#xff09;和偏移&#xff08;offsetting&#xff09;操作的开源C库。在Clipper库中&#xff0c;点和多边形&#xff08;polygon&#xff09;是基本的数据结构。Clipp…...

读《SQL基础教程 第二版 上》的一些总结

1. 数据库语言 DDL: Data Definition Language&#xff0c;数据定义语言&#xff08;库、表的操作&#xff09; DML: Data Manipulation Language&#xff0c; 数据操控语言&#xff08;对表中数据的增删改&#xff09; DQL: Data Query Language&#xff0c;数据库查询语言…...

EDI是什么:EDI系统功能介绍

EDI全称Electronic Data Interchange&#xff0c;中文名称是电子数据交换&#xff0c;也被称为“无纸化贸易”。EDI实现企业间&#xff08;B2B&#xff09;自动化通信&#xff0c;帮助贸易伙伴和组织完成更多的工作、加快物流时间并消除人为错误。 目前国内企业实现EDI通信大多…...

64B/66B GT Transceiver 配置

一、前言 前一篇文章已经讲述了64B/66B的编码原理&#xff0c;此篇文章来配置一下7系列GT的64B/66B编码。并讲述所对应的例子工程的架构&#xff0c;以及部分代码的含义。 二、IP核配置 1、打开7 Series FPGAs Transceiver Wizards&#xff0c;选择将共享逻辑放置在example …...

ES6: promise对象与回调地狱

ES6&#xff1a; promise对象与回调地狱 一、回调地狱二、Promise概述三、Promise的组成四、用函数封装Promise读取文件操作 一、回调地狱 在js中大量使用回调函数进行异步操作&#xff0c;而异步操作什么时候返回结果是不可控的&#xff0c;所以希望一段程序按我们制定的顺序执…...

Qt事件处理机制2-事件函数的传播

所有继承自QObject的类都有event函数&#xff0c;该函数用来处理自身的事件&#xff0c;函数定义如下&#xff1a; virtual bool QObject::event(QEvent *e)&#xff1b;Qt帮助文档&#xff1a; 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文件的预览&#xff0c;支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、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&#xff0c;全名GNU C Library&#xff0c;是大多数Linux发行版中使用的C库&#xff0c;为系统和应用程序提供核心的API接口。在Linux系统中&#xff0c;特别是在…...

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明&#xff1a;本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时&#xff0c;总是出错的背景下&#xff0c;不得已搜索和整理了一下&#xff0c;如何用命令行进行sql server 数据库和用户管理的方法&#xff0c;作为从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的幂个数限制

简介 在嵌入式开发中&#xff0c;经常有需要用到RingBuffer的概念&#xff0c;在RingBuffer中经常遇到一个Buffer满和Buffer空的判断的问题&#xff0c;一般的做法是留一个单位的buffer不用&#xff0c;这样做最省事&#xff0c;但是当RingBuffer单位是一个结构体时&#xff0…...

【Java开发指南 | 第十一篇】Java运算符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 算术运算符关系运算符位运算符逻辑运算符赋值运算符条件运算符&#xff08;?:&#xff09;instanceof 运算符Java运算符优先级 Java运算符包括&#xff1a;算术运算符、关系运算符、位运算符、逻辑运算符、赋值…...

【IC前端虚拟项目】验证环境方案思路和文档组织

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 对于mvu的验证环境,从功能角度就可以分析出需要搭建哪些部分,再看一下mvu的周围环境哈: 很明显验证环境必然要包括几个部分: 1.模拟idu发送指令; 2.模拟ram/ddr读写数据; 3.rm模拟mvu的行为; …...

程序设计|C语言教学——C语言基础1:C语言的引入和入门

一、程序的执行 1.定义 解释&#xff1a;借助一个程序&#xff0c;那个程序能够试图理解你的程序&#xff0c;然后按照你的要求执行。下次执行的时候还需要从零开始解释。 编译&#xff1a;借助一个程序&#xff0c;能够像翻译官一样&#xff0c;把你的程序翻译成机器语言&a…...

初学python记录:力扣928. 尽量减少恶意软件的传播 II

题目&#xff1a; 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接&#xff0c…...

LlamaIndex 组件 - Storing

文章目录 一、储存概览1、概念2、使用模式3、模块 二、Vector Stores1、简单向量存储2、矢量存储选项和功能支持3、Example Notebooks 三、文件存储1、简单文档存储2、MongoDB 文档存储3、Redis 文档存储4、Firestore 文档存储 四、索引存储1、简单索引存储2、MongoDB 索引存储…...

在Linux系统中设定延迟任务

一、在系统中设定延迟任务要求如下&#xff1a; 要求&#xff1a; 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…...

人机协同中的“因为-所以”、“if-then”(如果-那么)

在人机协同中&#xff0c;“因为-所以”和“if-then”&#xff08;如果-那么&#xff09;是两种截然不同但紧密相关的逻辑范式。简单来说&#xff0c;“if-then”是机器的“计算”语言&#xff0c;而“因为-所以”是人类“算计&#xff08;谋算&#xff09;”与因果推理的核心。…...

现代前端项目模板:从工程化配置到最佳实践全解析

1. 项目概述&#xff1a;一个现代前端开发的起点在接手一个新项目&#xff0c;特别是前端项目时&#xff0c;最耗时的往往不是核心业务逻辑的开发&#xff0c;而是那些重复性的基础搭建工作&#xff1a;配置构建工具、集成代码规范、设置路由和状态管理、搭建基础布局组件……每…...

终极指南:如何利用Awesome Public Datasets构建专业级数据科学项目

终极指南&#xff1a;如何利用Awesome Public Datasets构建专业级数据科学项目 【免费下载链接】awesome-public-datasets A topic-centric list of HQ open datasets. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-public-datasets 在当今数据驱动的时代…...

Notion 发布开发者平台扩展协作软件,治理与执行决定能否突破试验阶段!

Notion 发布开发者平台扩展协作软件&#xff0c;治理与执行成突破试验阶段关键&#xff01;此次发布让 Notion 在企业软件栈中扮演更重要的角色&#xff0c;但分析师表示&#xff0c;治理和执行情况将决定它能否突破试验阶段。Notion 正在通过一个开发者平台扩展其协作工作空间…...

手把手教你给STM32H743的0.96寸OLED屏移植STemWin(裸机+FreeRTOS双版本)

STM32H743与0.96寸OLED的STemWin深度移植实战&#xff1a;裸机与RTOS双环境解析 在嵌入式图形界面开发领域&#xff0c;STemWin作为ST官方推出的图形库解决方案&#xff0c;以其高效的渲染性能和丰富的控件资源&#xff0c;成为STM32开发者构建人机界面的首选。本文将聚焦STM32…...

28纳米工艺下SAR ADC架构的核心优势与设计要点

1. SAR ADC架构在28纳米工艺中的核心优势在移动SoC设计中&#xff0c;模数转换器&#xff08;ADC&#xff09;的性能直接影响着整个系统的功耗和面积效率。随着工艺节点演进至28纳米及以下&#xff0c;逐次逼近型&#xff08;SAR&#xff09;ADC架构展现出三大核心优势&#xf…...

马上开课!因果推断与机器学习训练营,10天带你写出能“下结论”的论文!

为什么有些人服药后康复&#xff0c;而另一些人却毫无改善&#xff1f;为什么大学学位能改变收入水平&#xff1f;这些如果……会怎样的问题&#xff0c;其实都属于因果推断的范畴。在医疗研究中&#xff0c;许多问题都涉及因果概念&#xff0c;因此因果推断在健康研究领域越来…...

NCMDump终极指南:3步快速完成网易云音乐NCM转MP3的完整教程

NCMDump终极指南&#xff1a;3步快速完成网易云音乐NCM转MP3的完整教程 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在特定应用中播放&#xff1f;那些神秘的.ncm格…...

FPGA调试技术:ILA与VIO核心实战指南

1. FPGA调试基础与核心工具解析在FPGA开发流程中&#xff0c;调试环节往往占据整个项目周期的40%以上时间。传统逻辑分析仪存在连接复杂、探头数量有限等问题&#xff0c;而基于JTAG的片上调试技术则提供了更高效的解决方案。Xilinx Vivado设计套件内置的集成逻辑分析仪(ILA)和…...

Agent史上最全八股,来啦!

涉及到 RAG、MCP、Skills 等 12 个方向&#xff0c;共计 200 多个问题。 因为最近一段时间&#xff0c;我越来越明显地感觉到&#xff0c;前端 AI 方面的面试已经越来越倾向语 AI 化了。 以前很多同学去面试&#xff0c;面试官问的还是比较浅的东西。 你用过哪些大模型&#xf…...