多边形的裁剪:一种基于有效边表的有效多边形裁剪算法的分析

news2024/7/4 6:30:58

 我们可以考虑有下面的多边形

黑色边框就是区域就是裁剪下来的多边形区域,我们可以将裁剪区域与多边形区域的端点看作有效边表,显然对于左边界来说我们是要选取边界x值大的点作为新的多边形的边界,对于右边界我们是要选择x值小的点作为多边形的边界,这样我们就可以将整个问题转换成有效边表选取的问题,我们可以简要的分析对于矩形裁剪区域是可以实现这种裁剪方法的,但是对于别的裁剪区域呢?比如五角星裁剪区域,显然这种方法仍然是适用的

如何得到新边表呢?边表中的点一个是左界一个是右界两两能够配对,在分别两个边表内部将两两能够配对的点分为一组,然后按组别进行比较来得出新边表中的点可以使用哪些点。因为待裁剪区域的分成两两配对的组别,裁剪窗口的也分成两两配对,每比较一组的时候其实我们是很简单的,同时因为在选取时可能有一组点表示的区域较大,根据这一组点比较并不能判定其中没有其他的边界点了,此时我们就需要保留了,然后因为另一组的关系已经明了,所以可以换下一组点继续与当前点进行比较。依次进行下去,最后就能得到一个新的边表。

得到新边表的大致过程如下:

指定位置边表如下:

x1、x_1的相对位置反应相对大小,实际上在各自的链表存储时并没有这样的关系。

我们每一次将上面配对的两点与下面配对的两点进行抉择确定出一个新的边表

依照这种方法我们可以确定出整个裁剪出的多边形。

而且每一次判断待裁剪多边形边表的一个始点与终点这两点与裁剪窗口的一个始点与终点的相对位置,相对位置只有以下几种:

使用新边表绘制出的多边形就是使用裁剪你窗口裁剪指定多边形得到的裁剪多边形。

关键代码:

struct ListNode * t1 = list1[i].next;
struct ListNode* t2 = list2[i].next;
struct ListNode* t3 = &list3[i];
while (t1 != NULL&&t2!=NULL){
    struct ListNode* t11 = t1->next;
	struct ListNode* t22 = t2->next;
	if (t11->data.start < t2->data.start) {
		t1 = NULL;
		continue;
	}
	else {
		if (!(t1->data.start > t22->data.start)) {
			t3->next = (struct ListNode*)malloc(sizeof(struct ListNode));
			t3 = t3->next;
			t3->next = NULL;
			t3->data.start = t1->data.start > t2->data.start ? t1->data.start : t2->data.start;
			t3->next = (struct ListNode*)malloc(sizeof(struct ListNode));
			t3 = t3->next;
			t3->next = NULL;
			t3->data.start = t11->data.start > t22->data.start ? t22->data.start : t11->data.start;
			if (t3->data.start == t22->data.start) {
				if (t22->next != NULL) {
					t2 = t22->next;
					t22 = t2->next;
				}
				else {
					t2 = NULL;
					continue;
				}
			}
			else {
				if (t11->next != NULL) {
					t1 = t11->next;
					t11 = t1->next;
				}
				else {
					t1 = NULL;
					continue;
				}
			}
		}
		else {
			if (t22->next == NULL) {
				t2 = NULL;
				continue;
			}
			else {
				t2 = t22->next;
				t22 = t2->next;
			}
		}
    }
}

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

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

相关文章

Java 基础学习(八)多态、接口、造型与内部类

1 多态 1.1 多态 1.1.1 多态的意义 一个类型的引用在指向不同的对象时会有不同的实现。依然借助前面案例中的 Person类、Student类和 Teacher 类举例&#xff0c;看如下的代码&#xff1a; Person p1 new Student(); Person p2 new Teacher(); p1.schedule(); p2.schedul…

python 使用linux find命令引导用户定位和选择文档

字多不看板&#xff08;InsCode&#xff09; 演示代码 # -*- coding:UTF-8 -*-# region import DebugInfo from DebugInfo.DebugInfo import *# endregion 画板 打印模板()# localSearch posix搜索接口类() localSearch 本地搜索接口类()用户选择 交互接口类.指定选择文档(…

.Net Reactor 使用心得

主密钥是干嘛的&#xff1f; 1 若要创建有效的许可证文件&#xff0c;必须使用与用于生成受.NET Reactor保护的输出相同的主密钥来创建许可证。 2 主密钥是在创建项目时生成的&#xff01;必须保存该项目才能保留原始密钥。 dll而不是exe 由于使用的是.net6 生成的代码。 …

颠倒二进制位

题目链接 颠倒二进制位 题目描述 注意点 输入是一个长度为 32 的二进制字符串 解答思路 可以灵活运用位运算对二进制位进行颠倒&#xff0c;思路为&#xff1a;从后往前判断第i位是否为1&#xff0c;判断第i位是否为1可以将其二进制右移i位后与1进行&操作&#xff0c;…

掌握Web、DNS、FTP、DHCP服务器的配置。掌握简单网络方案的规划和设计

1、Web服务器配置 2、综合设计 配置完后,所有的终端主机都要能够访问外网服务器,并进行测试。(本题可以自行选题,自行设计,但必须包含路由器、服务器(web、dns、DHCP、)、交换机及防火墙)。 3.做好规划并搭建拓扑图: 4.给PC机与服务器配置好IP,网关 5.给每个交换机…

EasyRecovery2024功能强大且专业的mac电脑数据恢复程序

EasyRecovery15是一款功能强大且专业的IOS数据恢复程序&#xff0c;专为在iPhone&#xff0c;iPad和iPod touch上检索丢失的照片&#xff0c;消息&#xff0c;音乐等而设计。无论您是错误删除还是意外丢失了对您来说重要的任何内容&#xff0c;EasyRecovery都会帮助您找回它们。…

基于深度学习的人脸测距&社交距离过近警报系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来&#xff0c;随着深度学习技术的快速发展&#xff0c;人脸识别技术在各个领域得到了广泛应用。其中&#xff0c;人脸测距和社交距离过近警报系统成为了人们…

C语言:指向数组的指针和指向数组元素的指针

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆&#xff0c;或者笼统地被称为数组指针&#xff0c;但它们之间是有差别的&#xff0c;本文就将对此进行讨论。 下面的代码…

IPO:“动储结合”抢占储能先机后,瑞浦兰钧如何继续赢?

在全球新能源汽车的推动下&#xff0c;锂电池赛道早已拥挤不堪&#xff0c;作为入局较晚的后起之秀&#xff0c;从2017年成立到首次实现锂电池的批量交付&#xff0c;瑞浦兰钧能源股份有限公司&#xff08;以下简称“瑞浦兰钧”&#xff09;仅用了2年不到的时间。2022年&#x…

如何通过TortoiseGit可视化工具查看Git管理的版本树和信息(工作树变更)内容

一、版本树 黑色直线&#xff1a;master分支和基于master分支拉取基础分支都在这条线上&#xff0c;是一条直线。 其他线条&#xff1a;新开分支一定会增加一条线&#xff0c;但不一定每一条线分别代表一个分支。 注&#xff1a;如果一直是一个人&#xff0c;在同一个本地分支…

解决GateWay报错:Exceeded limit on max bytes to buffer : 262144

场景&#xff1a; 前端传来了一个大的字符串 发现请求不通 一番调试发现SpringGateway 默认内存缓冲区262144字节 网上查了很多种常见的解决方案无效之后 直接重写底层 网友的解决方案 方案1&#xff08;无效&#xff09; 直接修改缓冲区大小 spring:codec:max-in-memory-s…

Apache OfBiz 反序列化命令执行漏洞(CVE-2023-49070)

项目介绍 Apache OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0c;提供了创建基于最新J2EE/XML规范和技术标准&#xff0c;构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。OFBiz最主要的特…

Shopify模版二次开发 Liquid实现响应式无缝跑马灯效果

1、HTML 代码结构 要实现无缝&#xff0c;我们需要复制出文案结构放在后面 <div class"marquee__wrapper"><div class"marquee"><div class"marquee__content"><p>有人知道在 Shopify 中使用media 的正确方法吗&#x…

数据链路层的作用和三个基本问题

目录 一. 数据链路层的作用二. 数据链路层解决的三个问题2.1 数据链路和帧2.2 三个基本问题(重要)2.2.1 封装成帧2.2.2 透明传输2.2.3 差错检测 \quad 一. 数据链路层的作用 \quad \quad \quad 光有链路不能传输数据, 还要加上协议, 这样才是数据链路 数据链路层的作用就是负责…

CVPR 2023 三维重建相关必读论文和代码合集

三维重建涉及将二维图像或视频转换为三维模型的过程&#xff0c;这个过程需要应用到多门学科的知识&#xff0c;比如数学、计算机图形学和多视图几何等&#xff0c;学习门槛较高。但尽管如此&#xff0c;三维重建仍然是CV领域的一个热门方向。 目前三维重建技术已经有了广泛应…

基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

桥梁巡查管理二维码

随着互联网世界的发展&#xff0c;二维码随处可见。二维码已经融入到我们生活的各个方面&#xff0c;不管是买东西&#xff0c;还是参观展览&#xff0c;甚至当我们走在路上&#xff0c;路牌上都会有二维码。甚至很多桥梁都用二维码来管理。 使用二维码管理桥梁能实现哪些功能…

有监督学习、无监督学习、半监督学习和强化学习

有监督学习 训练数据有标签 无监督学习 数据是没有标签的 聚类的思想&#xff1a;通过计算空间中的距离来判断是否属于同一类 强化学习 和环境交互&#xff0c;从环境中学习 三者对比 半监督学习 少量有标注&#xff0c;大量无标注 三个假设 1.连续性/平滑性假设:相…

肥猫游戏报价器|计价器|王者荣耀代练陪练等游戏报价器软件介绍说明

目录 1. 前言2. 软件著作权3. 软件使用说明3.1 进入软件3.2 用户登录3.3 首页3.4 报价器3.4.1 总体介绍3.4.2 王者报价器3.4.3 LOL手游报价器3.4.4 英雄联盟报价器3.4.5 云顶之弈报价器3.4.7 王者水晶报价器3.4.8 和平精英报价器3.4.9 蛋仔派对报价器3.4.10 穿越火线报价器3.4.…

验证栈序列(栈压入、弹出序列),剑指offer,力扣

目录 题目地址&#xff1a; 相同题型&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 题目地址&#xff1a; 946. 验证栈序列 - 力扣&#xff08;LeetCode&#…