【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修改即可。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280419.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Spark累加器(Accumulator)

1.累加器类型: 数值累加器:用于计算总和、计数等。布尔累加器:用于计算满足特定条件的次数。自定义累加器:允许定义复杂的聚合逻辑和数据结构。集合累加器:用于计算唯一元素的数量,处理去重操作。 在 Spar…

Study--Oracle-07-ASM常用操作(五)

一、向磁盘组添加磁盘 1、查看系统中可用的磁盘 set lines 150; col name for a35; col path for a35; select group_number,path, state, name, total_mb, free_mb from v$asm_disk; 2、磁盘组操作 创建磁盘组 create DISKGROUP DATADGV2 EXTERNAL REDUNDANCY DISK /dev/…

解决Qt3D程序场景中无法显示创建的立体图形?

有的新手在创建Qt3D程序时,因为不熟练,导致经常遇到无法显示3D图形的情况。 原因其实也简单,就是设置的摄像机的位置不对,或者压根没有设置摄像机。 // CameraQt3DRender::QCamera *cameraEntity view.camera();cameraEntity-&g…

Java二十三种设计模式-外观模式(9/23)

外观模式:简化复杂系统的统一接口 引言 外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个统一的高层接口。外观模式定义了一个可以与复杂子系统交互的简化接口,使得子系统更加易于使用…

Android 10.0 Launcher3仿ios的folder文件夹widget功能实现二

1.前言 在10.0的系统ROM开发中,在进行一些系统Launcher3定制功能开发中,需要实现folder文件夹widget的功能,由于launcher3 默认不支持folder跨行显示,所以就需要借助自定义的widget小部件功能来实现相关功能,接下来分析实现相关功能 2.Launcher3仿ios的folder文件夹widge…

jQuery前端网页制作

1、Jquery的概述 1.1JavaScript库 JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常很困难也很耗时。 为了应对这些调整,许多的 JavaScript (helper) 库应运而生。 这些 JavaScript 库常被称为 JavaScript 框架。 市面上一些广受欢迎的 JavaScript 框架:…

大厂linux面试题攻略五之数据库管理

一、数据库管理-MySQL语句 0.MySQL基本语句: 1.SQL语句-增 创建xxx用户: mysql>create user xxx % indentified by 123456; xxx表示用户名 %b表示该用户用来连接数据库的方式(远程或本地连接) indentified by 123456设置密码…

Reranker技术

文章目录 Reranker技术0. 什么是RAG1. 什么是Reranker?2. Reranker在RAG技术中的应用3.使用 Reranker 的优缺点4.总结参考:知乎 Reranker技术 0. 什么是RAG 基础 RAG 的操作流程大致如下:首先,你需要将文本切分成小段&#xff0…

centos7 docker空间不足

今天在使用docker安装镜像的时候,出现报错 查看原因,发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间,并不支持扩展分区大小,下面对分区进行扩容 参考: 分区扩容 主…

细说MCU的DAC改变输出信号频率的方法

目录 一、参考硬件 二、改变输出信号的频率 1.建立新工程 2.配置TIM3 三、代码修改 四、查看结果 一、参考硬件 本项目依赖的软件和硬件工程参考本文作者写的文章:细说MCU的DAC1和DAC2各自输出一通道模拟信号的方法-CSDN博客 https://wenchm.blog.csdn.net/a…

【初阶数据结构篇】二叉树算法题

文章目录 二叉树算法题前言单值二叉树相同的树对称二叉树另一棵树的子树二叉树的前序遍历 二叉树算法题 前言 本篇的算法题涉及到链式结构二叉树的实现方法可参考:二叉链实现方法上篇二叉链实现方法下篇 单值二叉树 如果二叉树每个节点都具有相同的值,…

什么情况?我代码没了

前两天检视代码时,发现PR里面有两个提交的描述信息一模一样,于是我提出应该将这两个提交合并成一个,保持提交树的清晰。 1 先储存起来! 而同事这时正在开发别的特性,工作区不是干净的,没法直接执行 git r…

APDL(ANSYS Parametric Design Language)初识

APDL(ANSYS Parametric Design Language)编写涉及使用ANSYS的参数化设计语言来创建、修改和执行有限元分析(FEA)任务。以下是一些关于APDL编写的基本步骤、技巧和示例: 一、基本步骤 了解APDL基础: 熟悉AP…

如何在 Kali Linux 上安装和使用 Docker 和 Docker Compose

Docker 和 Docker Compose 是现代开发者必备的工具,特别是当你需要在不同的环境中部署应用时。本文将详细介绍如何在 Kali Linux 上安装 Docker 和 Docker Compose,并使用它们启动服务。即使你是个技术小白,也能轻松跟随这篇指南完成操作。 …

轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置

注:这是对我以前博客进行优化后再次发布的,博客中的截图为以前的。原博客已删除。 如何安装nginx nginx是一款开源、高性能的Web和反向代理服务器,支持HTTP、HTTPS、SMTP、POP3和IMAP协议。由于其轻量级、资源占用少和强大的并发能力&#…

基于vue2 + Ant Design 封装input(输入)下拉Table表格

封装 AInputTable 组件 <!--下拉Table--> <template><div class"input-select-table" ref"inputTableRef" v-clickoutside"handleHide"><div class"input-select-table-input" click"disabled?this:hand…

【C++] 认识C++(二)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;是一名大厂后端c程序员。 &#x1f4da;本文收录于C系列&#xff0c;本专栏主要是分享我所了解的c知识&#xff0c;带领大家慢慢从了解c到认识c&#xff0c;持续更新&#xff01; &#x1f4da;相关专栏Linux正…