当前位置: 首页 > 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用户…...

JVM之方法区的详细解析

方法区 方法区&#xff1a;是各个线程共享的内存区域&#xff0c;用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据&#xff0c;虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分&#xff0c;但是也叫 Non-Heap&#xff08;非堆&#xff09; 设置方法…...

Go 使用ObjectID

ObjectID介绍 MongoDB中的ObjectId是一种特殊的12字节 BSON 类型数据&#xff0c;用于为主文档提供唯一的标识符&#xff0c;默认情况下作为 _id 字段的默认值出现在每一个MongoDB集合中的文档中。以下是ObjectId的具体组成&#xff1a; 1. 时间戳&#xff08;Timestamp&…...

基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)

一.系统概述 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对疾病防控信息管理的提升&a…...

2024年阿里云4核8G配置云服务器价格低性能高!

阿里云4核8G服务器租用优惠价格700元1年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云优惠 aliyunfuwuqi…...

关于ContentProvider这一遍就够了

ContentProvider是什么&#xff1f; ContentProvider是Android四大组件之一&#xff0c;主要用于不同应用程序之间或者同一个应用程序的不同部分之间共享数据。它是Android系统中用于存储和检索数据的抽象层&#xff0c;允许不同的应用程序通过统一的接口访问数据&#xff0c;…...

《1w实盘and大盘基金预测 day23》

这几天预测错麻了&#xff0c;哈哈哈&#xff0c;完全和技术没关系&#xff0c;全是消息面。 昨日预测&#xff1a; 2958-2984-3010 证券继续下跌&#xff0c;昨天诱多把我诱惑进去了&#xff08;看2-3天的反弹也没了&#xff09;&#xff0c;今天直接出掉昨天买的。 整体操作…...

向量数据库与图数据库:理解它们的区别

作者&#xff1a;Elastic Platform Team 大数据管理不仅仅是尽可能存储更多的数据。它关乎能够识别有意义的见解、发现隐藏的模式&#xff0c;并做出明智的决策。这种对高级分析的追求一直是数据建模和存储解决方案创新的驱动力&#xff0c;远远超出了传统关系数据库。 这些创…...

WIN7用上最新版Chrome

1.下载WIN10最新版Chrome的离线安装包 谷歌浏览器 Chrome 最新版离线安装包下载地址 v123.0.6312.123 - 每日自动更新 | 异次元软件 文件名称&#xff1a;123.0.6312.123_chrome_installer.exe。 123.0.6312.123_chrome_installer.exe 文件右键解压缩得到 chrome.7z&#x…...

node.jd版本降级/升级

第一步.先清空本地安装的node.js版本 按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 进入命令控制行窗口&#xff0c;输入where node&#xff0c;查看本地…...

python+playwright 学习-88 禁止加载图片等资源

前言 对于爬虫的小伙伴来说,有时候只需抓取页面的文本,不用加载图片,可以加快操作页面速度,那么我们可以设置禁止加载图片等资源。 禁止图片加载 根据url地址的后缀,图片资源后缀一般是png,jpg,jpeg,gif等格式。 from playwright.sync_api import sync_playwrightwith…...

牛 网站建设/夫唯seo视频教程

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 选题及意义 1 1.2 邮箱发展现状 1 1.2.1开源邮件系统 2 1.2.2国外商业邮件系统 2 1.2.3国内商业邮件系统 2 1.3研究内容 4 第2章 相关技术的理论概述 5 2.1 JSPServlet技术优势 5 2.2Mysql数据库的介绍 6 2.3 tomcat服务器介绍 6 2…...

wordpress 页面 分类/友情链接

今天真的颇为激动&#xff0c;1年没有玩RN&#xff0c;竟然被最新的RN版本0.55.4创建Hello折腾了半天&#xff0c;想当年刚玩RN创建环境用了3天&#xff0c; 想想现在也是不容易啊半天就搞定了&#xff0c;目测以后创建的话也就1-2个小时就搞定了吧&#xff0c;哈哈 &#xff0…...

公司网站备案/培训心得体会万能模板

之前遇到一个老师&#xff0c;他从事Java行业20年了&#xff0c;在Python兴起的时候&#xff0c;他周围的其他同行们都在纷纷学习Python方面的知识&#xff0c;连他的学生也问他“老师&#xff0c;你为什么不学Python呢&#xff1f;”。当这位听到学生这个问题的时候&#xff0…...

网站前后端全部做需要多少钱/百度权重排名查询

今天虽然写的是第十五天&#xff0c;但是其实已经过了二个星期了&#xff0c;因为之前在做面向对象的项目&#xff0c;所以之前就没有写。 今天我们已经别了面向对象&#xff0c;已经学习到了Java核心——API 学习安排&#xff1a;两周时间 内容&#xff1a;String类&#x…...

海南住房城乡建设网站/西安网络推广seo0515

Elasticsearch Java API的基本使用 elasticsearch-rest-high-level-client 取聚合数据&#xff1a; https://www.cnblogs.com/darope/p/11847532.html 聚合详解 按时间筛选后聚合 各种聚合查询示例 elasticsearch聚合后多字段综合排序 示例&#xff1a;先按service grou…...

linux做网站/佛山网站设计实力乐云seo

1.微信官方文档 auth.code2Session | 微信开放文档 2.我们来实现这个登录功能, 直接上完整代码 controller <!-- 工具类-JSONUtil --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.…...