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

news2024/12/27 11:41:18

一、使用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://www.coloradmin.cn/o/1962985.html

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

相关文章

取图小程序搭建教程,达人+流量主+会员快速部署上线指南

目录 一、取图小程序是什么? 二、搭建教程 (一)前期准备 (二)开发环境搭建 (三)部署与上线 三、部分代码展示 一、取图小程序是什么? 取图小程序以其多元化的功能而著称&…

抖音本地生活城市代理保证金多少?最新标准出炉!

随着本地生活的前景和潜力不断显现,抖音本地生活城市代理的申请热度不断攀升,并逐渐成为众多创业者入局本地生活的首要选择,而与之相关的问题,如抖音本地生活城市代理保证金等更是长居相关社群话题榜的前列。 而就目前的市场情况来…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑧)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…

抖音开放平台API接口如何开发||抖音相关接口数据采集数据分析 【附实例】

抖音开放平台提供了多种接口,包括授权登录、用户信息、视频管理、评论互动、消息通知、数据分析等。 以下是开发抖音接口的一些步骤: 1. 注册开发者账号:在抖音开放平台上注册开发者账号,获取开发者身份认证。 2. 创建应用&…

学习鸿蒙-利用Code Linter检查代码

如何检查: 1.在已打开的代码编辑器窗口单击右键点击Code Linter,或在工程管理窗口中鼠标选中单个或多个工程文件/目录,右键选择Code Linter > Full Linter执行代码全量检查。 2.通过git 提交,可在commit界面右下角点击齿轮图标…

嵌入式开发问题总汇

1. 事情经过:有天快下班的时候,我们采购经理找到我,说,生成的bin文件通过软件上传烧录时,烧录就会重启,但是其他的板子就不会。最后他换了一个A厂家的flash芯片,就可以了。但是,B厂…

使用 Postman 进行 Trello API 自动化测试的完整指南

文章目录 前言一、自动化测试是什么?二、比较自动化测试与手工测试1. 自动化测试2. 手工测试 三、环境搭建1.创建Collection2.创建环境变量3.添加API请求 四、设计测试用例1. API简单调用2. 获取所有emoji3. 创建一个新看板:4. 获得创建的看板信息5. 在看…

【Git】git 从入门到实战系列(一)—— Git 的诞生,Linus 如何在 14 天内编写出 Git?

<> 博客简介&#xff1a;Linux、rtos系统&#xff0c;arm、stm32等芯片&#xff0c;嵌入式高级工程师、面试官、架构师&#xff0c;日常技术干货、个人总结、职场经验分享   <> 公众号&#xff1a;嵌入式技术部落   <> 系列专栏&#xff1a;C/C、Linux、rt…

【机器学习】决策边界的基本概念以及如何在逻辑回归中找到决策边界

引言 在机器学习中&#xff0c;决策边界是分类算法用来区分不同类别数据点的线、面或超平面。这些边界通常是模型的预测规则&#xff0c;用于将特征空间中的点分配到不同的类别。决策边界可以是线性的&#xff0c;也可以是非线性的&#xff0c;取决于数据的分布和所使用的分类算…

探索开明软件包:应用开发指南轻松掌握,快速上手!

开明软件包格式&#xff0c;是openKylin社区Kaiming SIG为应对传统包格式存在的系统与应用无明确界限、发行版碎片化、兼容性等问题而开发的一款全新软件包格式&#xff0c;满足ISV&#xff08;Independent Software Vendors&#xff09;应用发布和应用独立发布需求&#xff0…

AI绘画:PS+comfyUI 工作流,直接在PS搞AI!

前言 直接在PS搞AI要不要&#xff1f; 大神 Nima Nazari 发布了一个可以无缝链接PS和comfyUI的工作流。 小编对该工作流进行了一个安装使用的测评&#xff0c;该工作流可以无缝与PS进行互联操作&#xff0c;切换模型和修改参数时还是需要在PS和ComfyUI间切换。总体而言&#x…

CSCP、CPIM和CLMP三大证书的区别?如何选择?

在制造型企业、供应链和运营管理专业人士都会不断寻找方法来提升他们的技能和职业前景。三种流行的认证——CSCP&#xff08;Certified Supply Chain Professional&#xff09;、CPIM&#xff08;Certified in Planning and Inventory Management&#xff09;以及CLMP&#xff…

其他:trycatch模块捕获循环错误,避免中断程序

介绍 今天有位同事问我怎么在某次循环报错后仍然可以继续程序运行&#xff0c;最后我们使用了trycatch模块。 代码解读 任务&#xff1a;在循环中&#xff0c;如果某次循环的calc出现错误则跳过这次循环并重新赋值结果 res_list <- list() # 创建一个空列表来存储结果fo…

整箱排柜不返工?用易境通散拼系统就OK

想必困扰散货拼柜小伙伴们一大难题就是&#xff0c;怎么把错乱纷繁的货物有序地整箱排柜&#xff0c;并且要保证集装箱高效利用&#xff0c;运输成本尽量降低。这不仅要求操作者具备卓越的统筹规划能力&#xff0c;更需长期积累的实践经验和敏锐的应变能力。易境通散拼系统可以…

[python] 启发式算法库scikit-opt使用指北

scikit-opt是一个封装了多种启发式算法的Python代码库&#xff0c;可以用于解决优化问题。scikit-opt官方仓库见&#xff1a;scikit-opt&#xff0c;scikit-opt官网文档见&#xff1a;scikit-opt-doc。 scikit-opt安装代码如下&#xff1a; pip install scikit-opt # 调用scik…

永结无间Ⅶ--具有知识图谱的高级 RAG

将知识图谱与先进的检索增强生成 (RAG) 策略相结合&#xff0c;以增强人工智能驱动的信息检索和生成 在增强 RAG 系统方面&#xff0c;知识图谱已成为改变游戏规则的因素。与传统矢量数据库不同&#xff0c;知识图谱提供丰富、互联的信息表示&#xff0c;可显著提高检索内容的…

Docker简介和Docker常见命令

目录 1. Docker 简介 1.1 Docker 的核心概念 1.2 Docker 的优势 1.3 Docker 工作流程 2. 常见命令 2.1 基本命令 2.2 镜像操作 2.3 容器操作 2.4 网络操作 2.5 卷操作 2.6 日志和监控 2.7 清理命令 3. 注意事项和最佳实践 3.1 镜像操作 3.2 容器操作 3.3 网络操…

18730 涂色问题

这个问题可以通过动态规划来解决。我们可以定义一个状态dp[i][j]&#xff0c;表示前i个牛舍中最后一个牛舍的颜色是j的涂色方案数量。然后我们可以通过状态转移方程来更新dp[i][j]。 状态转移方程如下&#xff1a; dp[i][j] dp[i-1][k] (k ! j) 然后我们需要对所有的dp[i][…

数据结构——排序(C语言版)

冒泡排序&#xff1a; 冒泡排序是一种简单直观的排序算法&#xff0c;其基本思想是多次遍历待排序数组&#xff0c;每次遍历时比较相邻的两个元素&#xff0c;如果它们的顺序不符合排序规则&#xff08;比如升序&#xff09;&#xff0c;则交换它们的位置&#xff0c;直到整个数…

Oracle数据库入门

目录 Oracle基础概念数据库安装连接Oracle查看当前用户 数据表的基本概念查看当前系统表Orcale函数单行函数多行函数/组函数/聚合函数 SQL语句DMLinsert批量插入数据创建新表在旧表中插入 delete全表删除 update DDLcreatealterdrop 连接 Oracle基础概念 数据库: 数据的仓库 以…