计算机图形学 实验

题目要求

1.1 实验一:图元的生成:直线、圆椭区域填充
你需要完成基本的图元生成算法,包括直线和椭圆。
在区域填充中,要求你对一个封闭图形进行填充。你需要绘制一个封
闭图形(例如多边形),并选择一种算法进行区域填充。
你的作品应当有一定的交互功能,例如,通过鼠标确定控制点来获得
以上图形。
1.2 实验二:样条曲线的生成: Bezier Bezier 曲线、B-样条
曲线的生成:
你需要完成这两种曲线的生成。
对于桂栭样条曲线,统一要求实现均匀二次桂栭样条曲线。
你的作品应当有一定的交互功能,例如,通过鼠标左键确定控制点,
双击绘制曲线。
1.3 实验三:分形图的生成: Koch 曲线、Mandelbrot Mandelbrot
集和Julia 集、蕨类植物(自选两个)
以上有栴个实验内容,自选栲个做实验即可。
对于实验中涉及的参数,不做统一要求。
1.4 实验四:真实感图形的生成:显示一个具有场景,几何造型
自定义包括消隐、镜面反射纹理效果
场景自选,几何体造型自选。可以是正方体、球体等简单图形,鼓励
使用复杂一点的真实感图形。

实验效果

总体框架

使用Python编程语言,利用PyQt5库进行代码实现,只使用PyQt5的画点函数实现所有图元生成。

PyQt5是基于Qt库的Python GUI开发框架,提供了丰富的图形用户界面组件和功能,支持跨平台应用程序的开发。通过连接信号与槽,开发者可以实现事件驱动的应用程序,并可使用Qt Designer工具进行可视化界面设计。PyQt5具备多线程支持、数据库连接功能,是一个开源、跨平台的强大工具,使得开发者能够轻松创建各种桌面应用程序。

整体的软件实现分为三个部分:CG_UI、Main、Algorithm。其中CG_UI是通过PyQt5设计的实验UI界面程序,Algorithm是各种图元生成算法的实现,Main实现的是与使用者的交互,以及对图元生成算法的调用和在UI界面的绘制。整体的设计逻辑为,使用者在UI界面进行相应的坐标点选择、参数选择、算法选择过程,Main将使用者的需求处理为具体的指令,调用相应的生成算法,计算出需要在UI界面绘制的坐标点的集合,再进行最终坐标点的绘制,即完成了图元生成过程。

主程序涉及的人机交互事件主要包括按键交互事件、鼠标点击事件以及绘制事件,为了统一化的设计,我将所有试验都合并设计为了一个软件,软件界面如下图所示。
在这里插入图片描述

同时,我们也设计了良好的交互提示逻辑,防止软件出现bug。例如,当你在画直线时,只在画图界面中绘制了一个坐标点就点击“生成直线”时,就会弹出下图警告,而不执行相应的命令,防止出现bug。

#在这里插入图片描述

实验一 图元生成

直线生成算法

圆和椭圆生成
在这里插入图片描述

图像填充

在这里插入图片描述

实验二 曲线

在这里插入图片描述

实验三 分形图生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验四 真实感图形生成

在这里插入图片描述

代码

完整代码和软件+Q:1695251905或CSDN私信
部分代码:

class Line():def __init__(self):passdef swapPoint(self,point):""" swap start-point with end-point  """temp = point[0]point[0] = point[1]point[1] = tempdef DDA(self, point, graph_points):"""DDA algorithm generate line"""dx = float(point[1][0] - point[0][0])dy = float(point[1][1] - point[0][1])m = dy / (dx+1e-9)if abs(m) <= 1:"""if abs(slope) less than 1, x_k+1 = x_k + 1, y_k+1 = y_k + m"""if point[0][0] > point[1][0]:self.swapPoint(point)k = dy / dxx = point[0][0]y = float(point[0][1])for x in range(point[0][0], point[1][0]):graph_points.append((x, int(y)))y += kelse:"""if abs(slope) more than 1, y_k+1 = y_k + 1, x_k+1 = x_k + 1/m"""if point[0][1] > point[1][1]:self.swapPoint(point)k = dx / dy  # 斜率的倒数y = point[0][1]x = float(point[0][0])for y in range(point[0][1], point[1][1]):graph_points.append((int(x), y))x += kdef MidPoint(self, point, graph_points):"""MID algorithm generate line"""dx = point[1][0] - point[0][0]dy = point[1][1] - point[0][1]m = dy / dxif m > 1:"""slop > 1"""if point[0][1] > point[1][1]:self.swapPoint(point)# a = y2 - y1, b = x1 - x2b = point[1][0] - point[0][0]a = point[0][1] - point[1][1]# 判别参数p0 = a + 2 * b(扩大两倍)p = a + 2 * bd1 = 2 * (a + b)d2 = 2 * b# 初始点x = point[0][0]y = point[0][1]graph_points.append((x,  y))while y < point[1][1]:"""y_k+1 = y_k + 1"""y += 1if p < 0:"""if p < 0, 中点在线下, x_k+1 = x_k, p_k+1 = p_k + d2"""p += d2else:"""if p > 0, 中点在线上, x_k+1 = x_k + 1, p_k+1 = p_k + d1"""p += d1x += 1graph_points.append((x,  y))elif m >= 0 and m <= 1:"""斜率大于0小于1"""if point[0][0] > point[1][0]:self.swapPoint(point)# a = y2 - y1, b = x1 - x2b = point[1][0] - point[0][0]a = point[0][1] - point[1][1]# 判别参数p0 = 2 * a + b(扩大两倍)p = 2 * a + bd1 = 2 * (a + b)d2 = 2 * a# 初始点x = point[0][0]y = point[0][1]graph_points.append((x,  y))while x < point[1][0]:"""x_k+1 = x_k + 1"""x += 1if p < 0:"""if p < 0, 中点在线下, y_k+1 = y_k + 1, p_k+1 = p_k + d1"""p += d1y += 1else:"""if p > 0, 中点在线上, y_k+1 = y_k, p_k+1 = p_k + d2"""p += d2graph_points.append((x,  y))elif m < 0 and m >= -1:"""斜率小于0大于-1"""if point[0][0] > point[1][0]:self.swapPoint(point)# a = y2 - y1, b = x1 - x2b = point[1][0] - point[0][0]a = point[0][1] - point[1][1]# 判别参数p0 = 2 * a - b(扩大两倍)p = 2 * a - bd1 = 2 * (a - b)d2 = 2 * a# 初始点x = point[0][0]y = point[0][1]graph_points.append((x,  y))while x < point[1][0]:"""x_k+1 = x_k + 1"""x += 1if p < 0:"""if p < 0, 中点在线下, y_k+1 = y_k, p_k+1 = p_k + d2"""p += d2else:"""if p > 0, 中点在线上, y_k+1 = y_k - 1, p_k+1 = p_k + d1"""p += d1y -= 1graph_points.append((x,  y))else:"""斜率小于-1"""if point[0][1] < point[1][1]:self.swapPoint(point)# a = y2 - y1, b = x1 - x2b = point[1][0] - point[0][0]a = point[0][1] - point[1][1]# 判别参数p0 = 2 * b - a(扩大两倍)p = -2 * b + ad1 = -2 * (b - a)d2 = -2 * b# 初始点x = point[0][0]y = point[0][1]graph_points.append((x, y))while y > point[1][1]:"""y_k+1 = y_k - 1"""y -= 1if p < 0:"""if p < 0, 中点在线下, x_k+1 = x_k + 1, p_k+1 = p_k + d1"""p += d1x += 1else:"""if p > 0, 中点在线上, x_k+1 = x_k, p_k+1 = p_k + d2"""p += d2graph_points.append((x, y))def Bresenham(self, point, graph_points):"""Bresenham algorithm generate line"""dx = point[1][0] - point[0][0]dy = point[1][1] - point[0][1]m = dy / dxif m > 1:"""斜率大于1"""if point[0][1] > point[1][1]:self.swapPoint(point)delta_x = point[1][0] - point[0][0]delta_y = point[1][1] - point[0][1]# 判别参数p0 = 2 * delta_x - delta_yp = 2 * delta_x - delta_y# 初始点x = point[0][0]y = point[0][1]graph_points.append((x, y))while y < point[1][1]:"""y_k+1 = y_k + 1"""y += 1if p < 0:"""if p < 0, x_k+1 = x_k, p_k+1 = p_k + 2 * delta_x"""p += 2 * delta_xelse:"""if p > 0, x_k+1 = x_k + 1, p_k+1 = p_k + 2 * delta_x - 2 * delta_y"""p += 2 * delta_x - 2 * delta_yx += 1graph_points.append((x, y))elif m >= 0 and m <= 1:"""斜率大于0小于1"""if point[0][0] > point[1][0]:self.swapPoint(point)delta_x = point[1][0] - point[0][0]delta_y = point[1][1] - point[0][1]# 判别参数p0 = 2 * delta_y - delta_xp = 2 * delta_y - delta_x# 初始点x = point[0][0]y = point[0][1]graph_points.append((x, y))while x < point[1][0]:"""x_k+1 = x_k + 1"""x += 1if p < 0:"""if p < 0, y_k+1 = y_k, p_k+1 = p_k + 2 * delta_y"""p += 2 * delta_yelse:"""if p > 0, y_k+1 = y_k + 1, p_k+1 = p_k + 2 * delta_y - 2 * delta_x"""p += 2 * delta_y - 2 * delta_xy += 1graph_points.append((x,  y))elif m < 0 and m >= -1:"""斜率小于0大于-1"""if point[0][0] > point[1][0]:self.swapPoint(point)delta_x = point[1][0] - point[0][0]delta_y = point[1][1] - point[0][1]# 判别参数p0 = 2 * delta_y + delta_xp = 2 * delta_y + delta_x# 初始点x = point[0][0]y = point[0][1]graph_points.append((x, y))while x < point[1][0]:"""x_k+1 = x_k + 1"""x += 1if p < 0:"""if p < 0, y_k+1 = y_k - 1, p_k+1 = p_k + 2 * delta_y - 2 * delta_x"""p += 2 * delta_y + 2 * delta_xy -= 1else:"""if p > 0,  y_k+1 = y_k, p_k+1 = p_k + 2 * delta_y"""p += 2 * delta_ygraph_points.append((x,  y))else:"""斜率小于-1"""if point[0][0] > point[1][0]:self.swapPoint(point)delta_x = point[0][0] - point[1][0]delta_y = point[0][1] - point[1][1]# 判别参数p0 = -2 * delta_x - delta_yp = -2 * delta_x - delta_y# 初始点x = point[0][0]y = point[0][1]graph_points.append((x,  y))while y > point[1][1]:"""y_k+1 = y_k - 1"""y -= 1if p < 0:"""if p < 0, x_k+1 = x_k, p_k+1 = p_k - 2 * delta_x"""p -= 2 * delta_xelse:"""if p > 0, x_k+1 = x_k + 1, p_k+1 = p_k - 2 * delta_x - 2 * delta_y"""p -= 2 * delta_y + 2 * delta_xx += 1graph_points.append((x,  y))

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

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

相关文章

Hadoop3.x基础(3)- MapReduce

来源: B站尚硅谷 目录 MapReduce概述MapReduce定义MapReduce优缺点优点缺点 MapReduce核心思想MapReduce进程常用数据序列化类型MapReduce编程规范WordCount案例实操本地测试提交到集群测试 Hadoop序列化序列化概述自定义bean对象实现序列化接口&#xff08;Writable&#xff…

新手不会Git也能玩Github吗?

新手不会Git也能玩Github吗&#xff1f; 前言使用Github的准备步骤使用一种访问外网资源的方法&#xff08;这一步才是新手最容易&#xff09;注册账号 创建一个自己的仓库创建完仓库后的界面 搜索你想要的代码类型以搜索坦克大战为例以下载烟花代码为例 总结 前言 说到Github&…

人工智能福利站,初识人工智能,机器学习,第四课

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

我已经入驻多多

我已经入驻多多面包多平台 啦! 作为一位专注于帮助人们部署Python环境、探索人工智能和JavaEE技术&#xff0c;并创作计算机课程设计相关作品的创作者。我的作品类型涵盖了各种技术领域&#xff0c;旨在为学习者提供实用的资源和指导。 在CSDN拥有1100个粉丝的基础上&#x…

arcgis javascript api4.x加载非公开或者私有的arcgis地图服务

需求&#xff1a; 加载arcgis没有公开或者私有的地图服务&#xff0c;同时还想实现加载时不弹出登录窗口 提示&#xff1a;​ 下述是针对独立的arcgis server&#xff0c;没有portal的应用场景&#xff1b; 如果有portal可以参考链接&#xff1a;https://mp.weixin.qq.com/s/W…

MapStruct 使用

MapStruct最详细的使用教程&#xff0c;别在用BeanUtils.copyProperties () mapstruct使用和详解 项目背景 之前查看网上别人写的文章&#xff0c;很多都提到了BeanUtils(org.springframework.beans) 利用反射性能比较差。大家都推荐使用 MapStruct。因为这个组件使用 Java 原…

zookeeper 应该这样学

ZooKeeper 是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是 Google 的 Chubby 一个开源的实现&#xff0c;是 Hadoop 和 Hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分…

C# 使用 MailKit 接收邮件(附demo)

C# 使用 MailKit 接收邮件&#xff08;附demo&#xff09; 介绍安装包&#xff08;依赖&#xff09;案例简单代码 获取附件核心代码完整代码 介绍一下POP3 介绍 MailKit 是一个开源的 C# 邮件处理库&#xff0c;用于在应用程序中发送和接收电子邮件。它提供了一个强大且易于使…

Redis核心技术与实战【学习笔记】 - 6.Redis 的统计操作处理

1.前言 在 Web 业务场景中&#xff0c;我们经常保存这样一种信息&#xff1a;一个 key 对应了一个数据集合。比如&#xff1a; 手机 APP 中的每天用户登录信息&#xff1a;一天对应一系列用户 ID。电商网站上商品的用户评论列表&#xff1a;一个商品对应了一些列的评论。用户…

【云原生之kubernetes系列】--污点与容忍

污点与容忍 污点&#xff08;taints)&#xff1a;用于node节点排斥Pod调度&#xff0c;与亲和效果相反&#xff0c;即taint的node排斥Pod的创建容忍&#xff08;toleration)&#xff1a;用于Pod容忍Node节点的污点信息&#xff0c;即node节点有污点&#xff0c;也将新的pod创建…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16&#xff1a;系统负载指数5. Processes: 1096系统正在运…

【AI视野·今日Robot 机器人论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 15 Jan 2024 Totally 14 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Learning Joint Space Reference Manifold for Reliable Physical Assistance Authors Amirreza Razmjoo, Tilen Brecelj, Kri…

【智能家居入门4】(FreeRTOS、MQTT服务器、MQTT协议、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…

Cache Lab:Part B(52.6/53分)【矩阵转置的分块算法】

目录 任务描述 32 32 baseline try1&#xff1a;给对角线上的块再次细分块 try2&#xff1a;对角块依次错位 成功&#xff1a;对角块两两交换 成功&#xff1a;其他方法 64 64 baseline 对角线优化普通块转置顺序调整&#xff08;7.6/8分&#xff09; 61 67 成…

Vue3+vite搭建基础架构(3)--- 使用dayjs

Vue3vite搭建基础架构&#xff08;3&#xff09;--- 使用dayjs 说明官方文档vite.config.js别名配置安装dayjs安装命令 使用dayjs将dayjs封装为自己的日期工具类使用dataUtil.js日期工具类示例 说明 这里记录下自己在Vue3vite的项目使用dayjs的过程&#xff0c;不使用ts语法&a…

最新XC主题 支持六种主题样式 去除域名授权全解密源码 一款多样式主题

Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题&#xff0c;首页支持六种主题样式&#xff0c;支持Pjax优化访问速度&#xff0c;多种单页&#xff0c;如友链、说说等。评论支持表情&#xff0c;自定义编辑器&#xff0c;支持其他样式功能。该主题功能性挺高&…

音视频数字化(音频数字化)

在音视频领域,人们始终追求无限还原现场效果,因此音频越逼真越好,视频越清晰越好。之所以我们需要将音视频信号由模拟转为数字,目的是在录制、存储、编辑、复制、回放等环节的不失真,尽量保持原有细节,不因以上操作,导致音画的质量下降。 为此,视频系统分辨率越来越高,…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的宠物领养管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统&#xff1a;游客打开系统…

k8s-HPA

前提条件 安装有**Metrics Server**,HPA的运行监控指标需要由Metrics Server 提供 文档&#xff1a;https://github.com/kubernetes-sigs/metrics-server?tabreadme-ov-file#readme 快速自动缩放&#xff0c;每15秒收集一次指标(可配置)。 资源效率&#xff0c;为集群中的每…

网络防御安全:2-6天笔记

第二章&#xff1a;防火墙 一、什么是防火墙 防火墙的主要职责在于&#xff1a;控制和防护。 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 二、防火墙的发展 区域&#xff1a; Trust 区域&#xff0c;该区域内网络的受信任程度高&#xff0c;通常用来定义内部…