计算机图形学作业:Cohen-Sutherland和Liang-Barsky 裁剪算法

news2024/10/5 2:50:20

参考书籍和资料:

Liang-Barsky参考下面视频14.2.1

[14.2.1]--讲解经典的梁友栋-巴斯基算法。_哔哩哔哩_bilibili

 Cohen-Sutherland参考孔令德的计算机图形学实验及课程设计(第二版),实验五直线段的裁剪

题目如下:

3. 编写程序,采用 Cohen-Sutherland 裁剪算法实现矩形窗口 ABCD 对线段 P1P2的裁剪,并返回裁剪结果。

//设置标志flag表示有线段在窗口内,数组cohen保存裁剪后的线段端点信
//息。设wxl , wxr ,wyb , wyt分别为窗口ABCD的左右边界x,下上边界y
class CPCohen//COhen-Sutherland算法的编码
{
public:
	double x, y;
	short rc;//编码
};
const int LEFT = 1, RIGHT = 2, BOTTOM = 4, TOP = 8;int flag=0;
void EnCode(CPCohen& pt)//对端点进行编码
{
	pt.rc = 0;
	if (pt.x < wxl) pt.rc = pt.rc | LEFT;
	else if (pt.x > wxr) pt.rc = pt.rc | RIGHT;
	if (pt.y < wyb)  pt.rc = pt.rc | BOTTOM;
	else if (pt.y > wyt) pt.rc = pt.rc | TOP;
}
void Cohen(CPCohen& p1, CPCohen& p2)
{
	CPCohen p;
	EnCode(p1); 
	EnCode(p2);
	if (p1.rc == 0 && p2.rc == 0)//两端点都在窗口内
	{
		cohen[0] = p1, cohen[1] = p2;
		flag=1;
		return;
	}
while (p1.rc != 0 || p2.rc != 0)
	{
		if (0 != (p1.rc & p2.rc))//两端点都在窗口外,丢弃
			return;
		short rc = p1.rc;
		if (p1.rc == 0) rc = p2.rc; 
		
		if (rc & LEFT)//在某个窗口边界不可见一侧时才求交
		{
			p.x = wxl;
			p.y = p1.y + (p2.y - p1.y) * (p.x - p1.x) / (p2.x - p1.x);
		}
		else if (rc & RIGHT)
		{
			p.x = wxr;
			p.y = p1.y + (p2.y - p1.y) * (p.x - p1.x) / (p2.x - p1.x);
		}
		else if (rc & BOTTOM)
		{
			p.y = wyb;
			p.x=p1.x+ (p2.x - p1.x)  * (p.y - p1.y) /(p2.y - p1.y);
		}
		else if (rc & TOP)
		{
			p.y = wyt;
			p.x = p1.x + (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y);
		}
		EnCode(p);
		if (rc == p1.rc)//求出交点替换掉原来的点
			p1 = p;
		else
			p2 = p;
if (p1.rc == 0 && p2.rc == 0)//两端点都在窗口内
		{
			cohen[0] = p1, cohen[1] = p2;
			flag=1;
			return;
		}
	}
}

 4. 编写程序,采用 Liang-Barsky 算法实现矩形窗口 ABCD 对线段 P1P2 的裁剪,返回裁剪结果,并举例说明算法的执行过程。

//设置标志flag表示有线段在窗口内,数组cohen保存裁剪后的线段端点信
//息。设wxl , wxr ,wyb , wyt分别为窗口ABCD的左右边界x,下上边界y
void Liang(CPoint& p1, CPoint& p2)
{
	double xl = min(p1.x, p2.x), xr = max(p1.x, p2.x),k= (p2.y - p1.y) /(p2.x-p1.x),m= (p2.x - p1.x) / (p2.y - p1.y);
	xl = max(xl, wxl), xr = min(xr, wxr);
	double xt = m * (wyb - p1.y) + p1.x, xu = m * (wyt - p1.y) + p1.x; int flag=0;
	if (k > 0)
	{
		if (xl <= xr&&xl<=xu&&xt<=xr)
		{
			double tx=p1.x;
			p1.x = max(xl, xt);
			p1.y = k * (p1.x - tx) + p1.y;
			tx = p2.x;
			p2.x = min(xr, xu);
			p2.y= k * (p2.x - tx) + p2.y;
			cohen[0] = p1, cohen[1] = p2;flag=1;
			return;
		}
	}
if (k < 0)
	{
		if (xl <= xr && xl <= xt && xu <= xr)
		{
			double tx = p1.x;
			p1.x = max(xl, xu);
			p1.y = k * (p1.x - tx) + p1.y;
			tx = p2.x;
			p2.x = min(xr, xt);
			p2.y = k * (p2.x - tx) + p2.y;
			cohen[0] = p1, cohen[1] = p2;flag=1;
			return;
		}
	}

例子:

设有线段AB,A(3,3),B(-2,-1),矩形窗口的wxl,wxr,wyb,wyt为0,2,0,2。

解:线段AB的参数方程为:x=3+u*(-2-3)=3-5u,y=3+u*(-1-3)=3-4u (0<=u<=1)

因此:

p1=x1-x2=5>0,q1=x1-wxl=3;p2=x2-x1=-5<0,q2=wxr-x1=-1;

p3=y1-y2=4>0,q3=y1-wyb=3;p4=y2-y1=-4<0,q4=wyt-y1=-1。pi均不为0。

线段与窗口边界的交点计算如下:

由uk*pk=qk(k=1,2,3,4)得u1=0.6,u2=0.2,u3=0.75,u4=0.25

由于p1、p3大于0,p2、p4小于0

则Uone=max(0,u2,u4)=0.25,Utwo=min(1,u1,u3)=0.6,满足Uone< Utwo,他们分别对应输出线段的起点和终点,将他们带入AB的参数方程,可得:

Uone对应点(1.75,2),Utwo对应点(0,0.6),即为裁剪后的线段端点。

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

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

相关文章

R语言【文章复现】——集成式地绘制高分辨率的多样性分布图,对方法的检验和优化,以及处理思路的思考

参考文献 本文对一篇 2022 年发表在 New Phytologist 的绘图方法文章中的技术路线进行复现。 An integrated high-resolution mapping shows congruent biodiversity patterns of Fagales and Pinales Summary 文中,作者针对在全球尺度上绘制物种分布图提出了一种全新的方法…

大白菜U盘安装系统-戴尔电脑

1. 把U盘插入电脑&#xff0c;启动盘去大白菜官网找&#xff0c;镜像可以去微软官网下&#xff0c;想要专业版的网上找资源。 2. 重启电脑&#xff0c;等出现log之后狂按F12&#xff0c;进入BOSS模式。 3. 选择UEFI...也就是下面白色的&#xff0c;按下回车。 4. 选第一个 5.…

数据结构_C++语言描述_高教出版社

contents 前言一、绪论1.1 数据分析结构存储算法计算1.1.1 逻辑结构1.1.2 存储结构1.1.3 算法实现 1.2 数据类型1.3 算法方法 二、线性表2.1 线性表的逻辑结构2.2 线性表的存储结构2.2.1 顺序存储结构2.2.2 链式存储结构 2.3 线性表的操作算法2.3.1 顺序表的操作算法2.3.2 链表…

RK3568驱动指南|驱动基础进阶篇-进阶3 驱动代码使用Makefile的宏

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

linux手动安装 vscode-server

适用场景 很多时候&#xff0c;我们需要在本机&#xff08;比如windows&#xff09;通过remote ssh访问远程服务器&#xff08;一般是ubuntu&#xff09;&#xff0c;但经常出现 vscode 一直连不上远程服务器的情况&#xff0c;看一下 log&#xff1a; 这个log表示远程服务器…

【2023年收入最高的10种编程语言】

在过去的一年时间里&#xff08;2022 年 10 月 1 日到 2023 年 10 月 1 日&#xff09; &#xff0c;DevJobsScanner 分析了来自世界各地的超过 1000 万份开发工作机会&#xff0c;以了解市场以及最热门、薪酬最高的编程语言。值得注意的是&#xff0c;本项研究只关注了来自美国…

【Linux】网络诊断 traceroute命令详解

目录 一、traceroute概述 1.1 traceroute命令简介 1.2 命令格式 1.3 原理 1.4 命令功能 二、使用实例 实例1&#xff1a;traceroute 用法简单、最常用的用法 实例2&#xff1a;跳数设置 实例3&#xff1a;设置探测数据包数量 实例4&#xff1a;显示IP地址&#xff0c…

什么是SAMBA?如何配置?方法来了!

/bin/bash 目录 SAMBA SMB协议 SMB连接过程 samba主要有两个进程 Linux下搭建samba服务器实现文件共享 Linux客户端&#xff1a; Windows客户端&#xff1a; SAMBA samba是SMB文件共享协议的应用软件&#xff0c;可以让Linux系统和Windows系统之间相互共享资源。 在Lin…

3d模型素材亮度和对比度如何调整呢?

1、修改材质参数&#xff1a;打开3ds Max后&#xff0c;选择要调整亮度和对比度的3D模型素材。然后&#xff0c;进入材质编辑器&#xff0c;选择相应的材质球。在材质编辑器中&#xff0c;你可以调整材质的漫反射、反射和高光等参数&#xff0c;这些参数将影响模型的亮度和对比…

K8S的dashboard使用账号密码登录

原文网址&#xff1a;K8S的dashboard使用账号密码登录-CSDN博客 简介 本文介绍K8S的dashboard使用账号密码登录的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c;吊打面试官&…

美颜技术对比:如何根据项目选择不同的美颜SDK?

各位开发者应该非常清楚&#xff0c;为了在项目中取得最佳效果&#xff0c;选择合适的美颜SDK至关重要。本篇文章&#xff0c;笔者将通过对比不同美颜SDK的关键特性&#xff0c;帮助开发者根据项目需求做出明智的选择。 一、技术原理对比 不同的美颜SDK可能采用不同的技术原理…

如何使用CFImagehost结合内网穿透搭建私人图床并无公网ip远程访问

[TOC] 推荐一个人工智能学习网站点击跳转 1.前言 图片服务器也称作图床&#xff0c;可以说是互联网存储中最重要的应用之一&#xff0c;不仅网站需要图床提供的外链调取图片&#xff0c;个人或企业也用图床存储各种图片&#xff0c;方便随时访问查看。不过由于图床很不挣钱&a…

大数据开发之Hive(压缩和存储)

第 9 章&#xff1a;压缩和存储 Hive不会强制要求将数据转换成特定的格式才能使用。利用Hadoop的InputFormat API可以从不同数据源读取数据&#xff0c;使用OutputFormat API可以将数据写成不同的格式输出。 对数据进行压缩虽然会增加额外的CPU开销&#xff0c;但是会节约客观…

Qt QTableView和QStandardItemModel包含搜索出现的文本及隐藏顶层节点

前言 使用Qt进行开发时&#xff0c;树结构一般是使用QTreeWidget或使用QTreeViewQStandardItemModel结合。 查找 如果要进行查找树的所有项中&#xff0c;是否包含某文本&#xff0c;就需要遍历。 QTreeWidget查找 以下是使用QTreeWidget进行查找&#xff1a; 首先初始化一…

Python 将列表数据写入文件(txt, csv,excel)

写入txt文件 def text_save(filename, data):#filename为写入txt文件的路径&#xff0c;data为要写入数据列表. file open(filename,a) for i in range(len(data)): s str(data[i]).replace([,).replace(],)#去除[],这两行按数据不同&#xff0c;可以选择 s s.replace(&quo…

全网首发!Yolov8_obb旋转框检测(DOTA1.0数据集)

一、YOLOv8环境搭建 &#xff08;1&#xff09;Pytorch的安装 如果你的环境没有部署请参考本人文章&#xff1a;NLP笔记&#xff08;2&#xff09;——PyTorch的详细安装_安装torchnlp-CSDN博客 &#xff08;2&#xff09;下载最新的Yolov8-obb代码&#xff1a; https://git…

MongoDB - 库、集合、文档(操作 + 演示 + 注意事项)

目录 一、MongoDB 1.1、简介 a&#xff09;MongoDB 是什么&#xff1f;为什么要使用 MongoDB&#xff1f; b&#xff09;应用场景 c&#xff09;MongoDB 这么强大&#xff0c;是不是可以直接代替 MySQL &#xff1f; d&#xff09;MongoDB 中的一些概念 e&#xff09;Do…

如何用Docker部署Nacos服务并结合内网穿透实现公网访问管理界面?

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Plik Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

HCIA的网络地址转换NAT

NAT&#xff1a;网络地址转换 功能&#xff1a; 1.将大量的私有地址转换成公有地址&#xff08;节约IP地址&#xff09; 2.将一个IP地址转换成另一个IP地址&#xff08;公有的&#xff09;&#xff08;增加内部网络设备的安全性&#xff09;&#xff1a;比如有一个内网&#xf…