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

【C#】 使用GDI+获取两个多边形区域相交、非相交区域

一、使用GDI+获取两个多边形区域相交、非相交区域

在 C# 中使用 GDI+(Graphics Device Interface Plus)处理图形时,你可以使用 System.DrawingSystem.Drawing.Drawing2D 命名空间中的类来操作区域(Region)。下面是一个示例,说明如何创建两个多边形区域,计算它们的相交和非相交部分,并对这些部分进行填充。

首先,确保你有以下引用:

using System.Drawing;
using System.Drawing.Drawing2D;

接下来,可以编写如下代码:

public void DrawPolygonIntersections(Graphics g)
{// 创建两个多边形Point[] polygon1 = new Point[]{new Point(50, 50),new Point(100, 50),new Point(100, 100),new Point(50, 100)};Point[] polygon2 = new Point[]{new Point(75, 75),new Point(125, 75),new Point(125, 125),new Point(75, 125)};// 创建 Region 对象Region region1 = new Region(polygon1);Region region2 = new Region(polygon2);// 计算相交区域Region intersectRegion = new Region();intersectRegion.Intersect(region1, region2);// 计算非相交区域(差集)Region nonIntersectRegion1 = new Region();nonIntersectRegion1.Exclude(intersectRegion);nonIntersectRegion1.Union(region1);Region nonIntersectRegion2 = new Region();nonIntersectRegion2.Exclude(intersectRegion);nonIntersectRegion2.Union(region2);// 创建画刷SolidBrush brush1 = new SolidBrush(Color.Red);SolidBrush brush2 = new SolidBrush(Color.Blue);SolidBrush brush3 = new SolidBrush(Color.Green);// 填充相交区域g.FillRegion(brush3, intersectRegion);// 填充非相交区域g.FillRegion(brush1, nonIntersectRegion1);g.FillRegion(brush2, nonIntersectRegion2);// 清理region1.Dispose();region2.Dispose();intersectRegion.Dispose();nonIntersectRegion1.Dispose();nonIntersectRegion2.Dispose();brush1.Dispose();brush2.Dispose();brush3.Dispose();
}

这个函数首先定义了两个多边形并创建了对应的 Region 对象。然后,它创建了一个新的 Region 来存储相交部分,通过调用 Intersect 方法。接着,它计算了非相交区域,即两个原始区域减去相交区域。最后,使用不同颜色的画刷填充这些区域。

注意,不要忘记在函数结束时释放所有创建的资源。这包括 RegionSolidBrush 对象,因为它们实现了 IDisposable 接口,需要显式调用 Dispose 方法来释放与之关联的非托管资源。

 

二、使用GDI+获取两个多边形区域相交、非相交区域的所有坐标集合

2.1使用GDI+获取两个多边形区域相交区域的所有坐标集合

属于是多边形可能存在交叉及互相重叠部分,参考如下链接:

【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?-CSDN博客文章浏览阅读304次,点赞2次,收藏3次。【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?https://blog.csdn.net/wangnaisheng/article/details/140513467

2.2使用GDI+获取两个多边形区域非相交区域的所有坐标集合

 根据2.1修改即可。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [数据集][目标检测]船上翻越栏杆危险行为检测数据集VOC+YOLO格式3678张1类别
  • 第13周 简历职位功能开发与Zookeeper实战
  • 4000元投影仪性价比之王:爱普生TW5750极米RS10还是当贝X5S?
  • 前端Long类型精度丢失:后端处理策略
  • 大数据学习之Flink基础
  • ChatGPT:如何在 linux 上运行 springboot 项目,不使用 jar 包的方式,直接编译运行源代码
  • Spring Cloud全解析:服务注册中心的多维度产品对比与优选指南
  • 网站如何实现HTTPS访问
  • 【Github】Github 上commit后 contribution 绿格子不显示 | Github绿格子 | Github贡献度不显示
  • ref函数
  • 英文文献翻译方法哪个好?高效率的翻译方法分享
  • Python中导入不同文件夹中的函数
  • 我们的前端开发逆天了!1 小时搞定了新网站,还跟我说 “不要钱”
  • Java 单元测试
  • 大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用
  • [译]如何构建服务器端web组件,为何要构建?
  • 【React系列】如何构建React应用程序
  • 【笔记】你不知道的JS读书笔记——Promise
  • Brief introduction of how to 'Call, Apply and Bind'
  • Docker入门(二) - Dockerfile
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • mac修复ab及siege安装
  • node和express搭建代理服务器(源码)
  • Object.assign方法不能实现深复制
  • 翻译:Hystrix - How To Use
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 搞机器学习要哪些技能
  • 将 Measurements 和 Units 应用到物理学
  • 经典排序算法及其 Java 实现
  • 利用jquery编写加法运算验证码
  • 新书推荐|Windows黑客编程技术详解
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • const的用法,特别是用在函数前面与后面的区别
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (11)MSP430F5529 定时器B
  • (42)STM32——LCD显示屏实验笔记
  • (7)STL算法之交换赋值
  • (java)关于Thread的挂起和恢复
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (三)c52学习之旅-点亮LED灯
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***详解账号泄露:全球约1亿用户已泄露
  • .CSS-hover 的解释
  • .net core Redis 使用有序集合实现延迟队列
  • .Net Core中Quartz的使用方法
  • .net framework4与其client profile版本的区别
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境