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

参考书籍和资料:

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),即为裁剪后的线段端点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

助力智能密集人群检测计数,基于YOLOv8全系列模型【n/s/m/l/x】开发构建通用场景下密集人群检测计数识别系统

在一些人流量比较大的场合&#xff0c;或者是一些特殊时刻、时段、节假日等特殊时期下&#xff0c;密切关注当前系统所承载的人流量是十分必要的&#xff0c;对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段&#xff0c;本文的主要目的是想要…

springboot基于Web的社区医院管理服务系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括社区医院管理服务系统的网络应用&#xff0c;在外国线上管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区医院信…

node.js笔记(1)

node,js是一个基于chrome v8引擎的javascript运行环境。 浏览器是javascript的前端运行环境。 node.js是javascript的后端运行环境。 node.js中无法调用浏览器中内置的DOM和BOM等API。 node.js作为一个javascript的运行环境&#xff0c;仅仅提供了基础的功能和API。 浏览器中…

线索系统性能优化实践

引言 在京东家居事业部&#xff0c;线索CRM系统扮演着至关重要的角色&#xff0c;它作为构建家居场景核心解决方案集的首要环节&#xff0c;肩负着获客和拓展业务的重要使命。然而&#xff0c;随着业务的不断扩张和市场需求的日益增长&#xff0c;系统原有的架构开始显露出诸多…

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问

Github搭建图床 github搭建静态资源库 免费CDN加速 github搭建图床使用 jsdelivr CDN免费加速访问 前言1、创建仓库2、开启 gh-pages页面功能3、访问测试 前言 写博客文章时&#xff0c;图片的上传和存放是一个问题&#xff0c;使用小众第三方图床&#xff0c;怕不稳定和倒闭&…

RTL编码(1)——概述

一、RTL级描述 RTL&#xff08;Register Transfer Level&#xff09;级&#xff1a;寄存器&#xff0b;组合逻辑&#xff0c;其功能与时序用Verilog HDL&#xff08;以下简称Verilog&#xff09;或VHDL代码描述。 RTL描述包含了同步数字电路最重要的三个特征&#xff1a;组合逻…

24-1-9 bilibilic++音视频

下午两点面试&#xff0c;面试官迟到了一会&#xff0c;面试官人很好&#xff0c;整体面试经历很不错&#xff0c;但是我人太紧张了&#xff0c;基础知识掌握的深度不够&#xff0c;没有深挖&#xff0c; 是做音视频的底层相关的&#xff0c; 实习要求只要每天打卡够九个小时就…

FineBI实战项目一(15):订单销售总额分析开发

点击新建组件&#xff0c;创建订单销售总额组件。 选择自定义图表&#xff0c;选择文本&#xff0c;拖拽要分析的字段到文本中。 进入仪表板&#xff0c;拖拽刚刚的组件进入仪表板&#xff0c;然后在再编辑标题。 效果如下

MySQL-外键等信息

38. 基础-多表查询-概述_哔哩哔哩_bilibili 1、流程函数 2、约束字段 删除外键 &#xff1a; alter table emp2 drop foreign key 外键名 //外键可以保持数据的一致性和完整性&#xff0c;外键的话&#xff0c;就是类似一个主表&#xff0c;一个从表&#xff0c;从表的其中一…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子详情实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

js中的class类

目录 class构造函数方法原型方法访问器方法静态方法 继承super minxin关于多态 class 在ES6中之前如果我们想实现类只能通过原型链和构造函数的形式&#xff0c;不仅难以理解步骤也十分繁琐 在ES6中推出了class关键字&#xff0c;它可以在js中定一个类&#xff0c;通过new来实…

Flink异步IO

本文讲解 Flink 用于访问外部数据存储的异步 I/O API。对于不熟悉异步或者事件驱动编程的用户,建议先储备一些关于 Future 和事件驱动编程的知识。 本文代码gitee地址: https://gitee.com/ddxygq/BigDataTechnical/blob/main/Flink/src/main/java/operator/AsyncIODemo.java …

ceph、gluster、longhorn选型对比

Ceph Ceph是一个分布式的存储系统&#xff0c;可以在统一的系统中提供唯一的对象、块和文件存储。 名词解释&#xff1a; RADOS&#xff1a; 由自我修复、自我管理、智能存储节点组成的可靠、自主、分布式对象存储LIBRADOS&#xff1a; 一个允许应用程序直接访问 RADO 的库&…

虚幻UE 材质-进阶边界混合之运行时虚拟纹理

之前在学习空山新雨后时对于边缘虚化过渡处理有很多技术 今天又要介绍一个边缘过渡的方法&#xff1a;运行时虚拟纹理 文章目录 前言一、运行时虚拟纹理二、使用步骤总结 前言 边缘过渡柔和的方式我们之前介绍了很多&#xff0c;但是效果也不是最好的。 像素偏移PDO和我们今天…

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算?

查准率与查全率在自然语言处理中的核心概念与联系、核心概念和实践应用,如何使用朴素贝叶斯、SVM 和深度学习实现查准率和查全率的计算? 人工智能核心技术有:1. 深度学习;2.计算机视觉;3.自然语言处理;4.数据挖掘。其中,深度学习就是使用算法分析数据,从中学习并自动归…

jsonvue-mobile 联动方式说明。

目录 jsonvue-mobile的联动类型分为两种 一种是命令式的&#xff1a; 另一种是响应式的&#xff1a; 联动场景 场景一&#xff1a;某一个字段的值变化时&#xff0c;同步修改另一个字段的值 命令式&#xff1a; 响应式&#xff1a; 场景一演示效果GIF 场景二&#xff1…

对外贸易数据平台解析_外贸三大支撑力_箱讯科技

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 三大支撑力支撑我国外贸持续回暖 海关总署近日发布数据显示&#xff0c;今年前11个月&#xff0c;我国进出口总值37.96万亿元&#xff0c;与去年同期持平。进入四季度&#xff0c;我国外贸发展的积极因素…

k8s--动态pvc和pv

前情回顾 存储卷&#xff1a; emptyDir 容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失 不能做数据持久化 hostPath&#xff1a;持久化存储数据 可以和节点上目录做挂载。pod被销毁了数据还在 NFS&#xff1a;一台机器&#xff0c;提供pod内容器所有的挂载点…

css设置内嵌样式阴影

.box{box-shadow: inset 0 0 10px #f1e227, inset 0 0 10px #b6b70f, inset 0 0 10px #879017, inset 0 0 10px #485b22, inset 0 0 10px #0a272e;/* 这是一个CSS的box-shadow属性的值&#xff0c;用于创建一个元素的内部阴影效果。具体的意思是在元素的边界内部添加五个不同颜…

Java项目:119SpringBoot废品回收系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 废品回收系统是由SpringBootMybatis开发的&#xff0c;分为前台和后台&#xff0c;前台进行下单&#xff0c;后台处理。 后台功能如下&#xff1a; 类型…