当前位置: 首页 > 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会进行“四舍五入”等操作并保持几何形状的有效性。

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

http://www.lryc.cn/news/406728.html

相关文章:

  • Spring-Aop源码解析(二)
  • antdesgin table 组件下载成excel
  • MongoDB - 聚合阶段 $group 的使用
  • Flutter 插件之 easy_refresh(下拉刷新、上拉加载)
  • DVWA的安装和使用
  • CSS相关记录
  • Fedora40安装telnet-server启用telnet服务
  • Unity3D结合AI教育大模型 开发AI教师 AI外教 AI英语教师案例
  • lua 游戏架构 之 SceneLoad场景加载(一)
  • 【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存
  • Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名
  • (leetcode学习)236. 二叉树的最近公共祖先
  • Zabbix监控系统:zabbix服务部署+基于Proxy分布式部署+zabbix主动与被动监控模式
  • 【Vue实战教程】之 Vue Router 路由详解
  • 测试用例接口开发实战
  • C#中压缩文件夹,及其内容
  • 机器学习 | 回归算法原理——多项式回归
  • 力扣224【基本计算器】
  • 【Linux】HTTP 协议
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • 网络学习|如何理解服务的端口号
  • 《0基础》学习Python——第十八讲__爬虫/<1>
  • NFTScan 浏览器现已支持 .mint 域名搜索功能!
  • Git基本原理讲解、常见命令、Git版本回退、Git抛弃本地分支拉取仓库最新分支
  • 前端网页打开PC端本地的应用程序实现方案
  • 遇到not allow unquoted fieldName怎么办
  • IDEA安装并使用通义灵码
  • <数据集>AffectNet表情识别数据集<目标检测>
  • ThinkPHP对接易联云打印
  • JavaScript轮播图