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

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍

开源库介绍:
Clipper2在Github上的地址:https://github.com/AngusJohnson/Clipper2
Clipper2库对简单和复杂多边形执行交集(Intersection)、并集(Union)、差分(Difference)、异或(XOR)的布尔运算。它还执行多边形偏移。
Clipper2库是对Clipper库的一次重大更新。Clipper库姑且称之为Clipper1的库,虽然它仍然运行良好,但Clipper2在几乎所有方面都更好。

支持的环境:
Clipper2可以使用C++、C#或Delphi Pascal进行编译。通过动态链接到C++编译的Clipper2库中的导出函数,也可以从其他编程语言访问该库。(由于C++编译的代码明显更快,C#和Delphi开发人员也可能更喜欢在库性能至关重要的应用程序中使用这种方法。)

其他介绍Clipper或Clipper2的博客:

ClipperLib库使用说明
Clipper2中的术语和基本概念

测试

环境:

  1. .NET Framework4.7.2
  2. 在NuGet中安装Clipper2 1.4.0
    在这里插入图片描述

数据1(未产生浮点数的交点)

Paths64 subj = new Paths64();
Paths64 clip = new Paths64();
subj.Add(Clipper.MakePath(new int[] { 0,0,0,2,2,2,2,0 }));
clip.Add(Clipper.MakePath(new int[] { 0,0, 0,1, 1,1, 1,0, 1,-1, 0,-1 }));
Paths64 r1 = Clipper.Intersect(subj, clip, FillRule.NonZero);
Paths64 r2 = Clipper.Union(subj, clip, FillRule.NonZero);
Paths64 r3 = Clipper.Difference(subj, clip, FillRule.NonZero);
Paths64 r4 = Clipper.Xor(subj, clip, FillRule.NonZero);
Trace.WriteLine(r1.ToString());//1,0  1,1  0,1  0,0 
Trace.WriteLine(r2.ToString());//1,-1 , 1,0 , 2,0 , 2,2 , 0,2 , 0,0 , 0,-1 
Trace.WriteLine(r3.ToString());//0,1 , 1,1 , 1,0 , 2,0 , 2,2 , 0,2 
Trace.WriteLine(r4.ToString());
//0,1 , 1,1 , 1,0 , 2,0 , 2,2 , 0,2
//1,-1 , 1,0 , 0,0 , 0,-1

效果图如下:
在这里插入图片描述

数据2(产生了浮点数的交点)

Paths64 subj = new Paths64();
Paths64 clip = new Paths64();
subj.Add(Clipper.MakePath(new int[] { 0, 0, 0, 2, 2, 2, 2, 0 }));
clip.Add(Clipper.MakePath(new int[] { -1, 0, 0, 1, 3,0, 0, -1 }));
Paths64 r1 = Clipper.Intersect(subj, clip, FillRule.NonZero);
Paths64 r2 = Clipper.Union(subj, clip, FillRule.NonZero);
Paths64 r3 = Clipper.Difference(subj, clip, FillRule.NonZero);
Paths64 r4 = Clipper.Xor(subj, clip, FillRule.NonZero);
Trace.WriteLine(r1.ToString());//2,0 , 0,2 , 0,0 
Trace.WriteLine(r2.ToString());//3,0 , 2,0 , 2,2 , 0,2 , -1,0 , 0,-1 
Trace.WriteLine(r3.ToString());//2,2 , 0,2 , 2,0  
Trace.WriteLine(r4.ToString());
// 2,2 , 0,2 , 2,0 
//3,0 , 2,0 , 0,0 , 0,2 , -1,0 , 0,-1

在这里插入图片描述
Clipper的坐标都是用int类型表示的,数据2在运算时产生了小数(例如CD和BG的交点的Y值就带有小数),Clipper2会进行“四舍五入”等操作并保持几何形状的有效性。

另外,异或相当于合并结果减去相交结果,图略。

相关文章:

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍: Clipper2在Github上的地址:https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集(Intersection)、并集(Union)、差分(Difference&…...

Spring-Aop源码解析(二)

书接上文,上文说到,specificInterceptors 不为空则执行createProxy方法创建代理对象,即下图的createProxy方法开始执行,生成代理对象,生成代理对象有两种方式,JDK和CGLIB。 createAopProxy就是决定使用哪…...

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下,需要添加下载功能 import React, { useState } from rea…...

MongoDB - 聚合阶段 $group 的使用

文章目录 1. 构造测试数据1. 示例 12. 示例23. 示例34. 示例45. 示例5 2. 构造测试数据1. 示例12. 示例23. 示例3 在 MongoDB 中&#xff0c;$group 是聚合管道中的一个阶段&#xff0c;用于根据指定的条件对文档进行分组。 {$group: {_id: <expression>, // 分组的依据…...

Flutter 插件之 easy_refresh(下拉刷新、上拉加载)

今天给大家较少一下日常开发中最常见的一个功能,就是 下拉刷新、上拉加载,这个在我们使用分页功能是最常见的。 此前我我也写了一篇关于 下拉刷新、上拉加载。 Flutter 下拉刷新、上拉加载flutter_easyrefresh的使用https://blog.csdn.net/WangQingLei0307/article/details/…...

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…...

CSS相关记录

文章目录 backgroundposition文字displayflexjustify-contentalign-itemsflex-directionflex-wrap gridimportant transformtranslate&#xff08;位移&#xff09;scale&#xff08;缩放&#xff09;rotate&#xff08;旋转&#xff09;origin (旋转中心点)skew (倾斜 ) borde…...

Fedora40安装telnet-server启用telnet服务

Fedora40安装telnet-server启用telnet服务 安装 telnet-server sudo yum install telnet-server或 sudo dnf install telnet-server启用服务 fedora40 或 CentosStream9 不能用 yum或dnf安装xinetd, telnet-server 的服务名为: telnet.socket 启用 telnet.socket.service …...

Unity3D结合AI教育大模型 开发AI教师 AI外教 AI英语教师案例

自2022年底ChatGPT引爆全球之后&#xff0c;大模型技术便迎来了一段崭新的快速发展期&#xff0c;由其在GPT4.0发布后&#xff0c;AI与教育领域结合产品研发、已成为教育AI科技竞争的新高地、未来产业的新赛道、经济发展的新引擎和新产品的诞生地。 据不完全统计&#xff0c;目…...

lua 游戏架构 之 SceneLoad场景加载(一)

设计一个为BaseSceneLoad class&#xff0c;用于处理场景加载的相关操作 &#xff0c;主要作用是提供了一个通用的场景加载框架&#xff0c;使得子类可以按照统一的接口进行场景加载操作。子类需要实现这些方法&#xff0c;以便在加载场景时能够正确地处理场景加载的各个阶段。…...

【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 命名管道2. 创建命名管…...

Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名

创建 Vue3Vite 项目 创建 Vue3 项目 $ pnpm create vuelatest通过脚手架选择开启以下功能 ✔ Project name: … <your-project-name> ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development?…...

(leetcode学习)236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…...

Zabbix监控系统:zabbix服务部署+基于Proxy分布式部署+zabbix主动与被动监控模式

一、Zabbix概述 1.1 简介 zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff0c;提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix…...

【Vue实战教程】之 Vue Router 路由详解

Vue Router路由 1 路由基础 1.1 什么是路由 用Vue.js创建的项目是单页面应用&#xff0c;如果想要在项目中模拟出来类似于页面跳转的效果&#xff0c;就要使用路由。其实&#xff0c;我们不能只从字面的意思来理解路由&#xff0c;从字面上来看&#xff0c;很容易把路由联想…...

测试用例接口开发实战

测试用例接口开发实战 前言 在上一集&#xff0c;我们也大概完成了对Jmeter的二次开发的Demo版本的了解&#xff0c;我们接下来就要基于这个Demo来将Jmeter压测进行平台化。 那么这一集&#xff0c;我们讲一讲测试用例接口开发实战。 StressCaseController 我们的Controll…...

C#中压缩文件夹,及其内容

压缩包格式&#xff0c;本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作&#xff0c; 下面分两个版本进行实现 1.简单版本 bool DoCompressDirectoryInfo(string folderPath){try{var zipFilePath $"{folderPath}.zip";var directoryInfo …...

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…...

力扣224【基本计算器】

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 1 < s.length < 3 * 105 s 由数字、‘’、‘-’、‘(’、‘)’、和 ’ ’ 组成 s 表示一个有效的…...

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址&#xff0c;俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...