计算机图形学 实验

news2024/7/4 2:33:53

题目要求

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):
        pass

    def swapPoint(self,point):
        """ swap start-point with end-point  """
        temp = point[0]
        point[0] = point[1]
        point[1] = temp

    def 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 / dx
            x = 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 += k
        else:
            """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 += k

    def 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 / dx
        if m > 1:
            """slop > 1"""
            if point[0][1] > point[1][1]:
                self.swapPoint(point)
            # a = y2 - y1, b = x1 - x2
            b = point[1][0] - point[0][0]
            a = point[0][1] - point[1][1]
            # 判别参数p0 = a + 2 * b(扩大两倍)
            p = a + 2 * b
            d1 = 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 += 1
                if p < 0:
                    """if p < 0, 中点在线下, x_k+1 = x_k, p_k+1 = p_k + d2"""
                    p += d2
                else:
                    """if p > 0, 中点在线上, x_k+1 = x_k + 1, p_k+1 = p_k + d1"""
                    p += d1
                    x += 1
                graph_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 - x2
            b = point[1][0] - point[0][0]
            a = point[0][1] - point[1][1]
            # 判别参数p0 = 2 * a + b(扩大两倍)
            p = 2 * a + b
            d1 = 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 += 1
                if p < 0:
                    """if p < 0, 中点在线下, y_k+1 = y_k + 1, p_k+1 = p_k + d1"""
                    p += d1
                    y += 1
                else:
                    """if p > 0, 中点在线上, y_k+1 = y_k, p_k+1 = p_k + d2"""
                    p += d2
                graph_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 - x2
            b = point[1][0] - point[0][0]
            a = point[0][1] - point[1][1]
            # 判别参数p0 = 2 * a - b(扩大两倍)
            p = 2 * a - b
            d1 = 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 += 1
                if p < 0:
                    """if p < 0, 中点在线下, y_k+1 = y_k, p_k+1 = p_k + d2"""
                    p += d2
                else:
                    """if p > 0, 中点在线上, y_k+1 = y_k - 1, p_k+1 = p_k + d1"""
                    p += d1
                    y -= 1
                graph_points.append((x,  y))

        else:
            """斜率小于-1"""
            if point[0][1] < point[1][1]:
                self.swapPoint(point)
            # a = y2 - y1, b = x1 - x2
            b = point[1][0] - point[0][0]
            a = point[0][1] - point[1][1]
            # 判别参数p0 = 2 * b - a(扩大两倍)
            p = -2 * b + a
            d1 = -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 -= 1
                if p < 0:
                    """if p < 0, 中点在线下, x_k+1 = x_k + 1, p_k+1 = p_k + d1"""
                    p += d1
                    x += 1
                else:
                    """if p > 0, 中点在线上, x_k+1 = x_k, p_k+1 = p_k + d2"""
                    p += d2
                graph_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 / dx
        if 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_y
            p = 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 += 1
                if p < 0:
                    """if p < 0, x_k+1 = x_k, p_k+1 = p_k + 2 * delta_x"""
                    p += 2 * delta_x
                else:
                    """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_y
                    x += 1
                graph_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_x
            p = 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 += 1
                if p < 0:
                    """if p < 0, y_k+1 = y_k, p_k+1 = p_k + 2 * delta_y"""
                    p += 2 * delta_y
                else:
                    """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_x
                    y += 1
                graph_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_x
            p = 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 += 1
                if 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_x
                    y -= 1
                else:
                    """if p > 0,  y_k+1 = y_k, p_k+1 = p_k + 2 * delta_y"""
                    p += 2 * delta_y
                graph_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_y
            p = -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 -= 1
                if p < 0:
                    """if p < 0, x_k+1 = x_k, p_k+1 = p_k - 2 * delta_x"""
                    p -= 2 * delta_x
                else:
                    """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_x
                    x += 1
                graph_points.append((x,  y))

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

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

相关文章

计算机网络实验一

目录 实验一 使用PacketTracer组建简单局域网 1、实验目的 2、实验设备 &#xff08;1&#xff09;内容一&#xff08;组建简单局域网&#xff09;&#xff1a; &#xff08;2&#xff09;内容二&#xff08;使用交叉线直连两台机器&#xff09;&#xff1a; &#xff08…

Java知识点总结

数据类型强转&#xff1a;byte short int long float double &#xff1b; 数组定义 [ ]数组名 clone-复制数组equals-比较存储地址 toString sort-排序 length-长度 arraycopy([]a,s,[]b,ss,n)-数组复制 运算符及语句 instanceof双目运算符 –左对象右类 判断是否是该类创建…

【Linux】-多线程的知识都收尾(线程池,封装的线程,单例模式,自旋锁)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…

无人零售模式下,“IoT+鸿蒙”实现零代码搭建自动售货机监控大屏的可能性摸索

前言 新零售模式下&#xff0c;对loT的探索与应用还在继续。 而数字时代&#xff0c;数字化转型在零售行业中蔓延&#xff0c;而对于新的消费方式的探索&#xff0c;也在如火如荼的进行中。于是&#xff0c;一种新零售的形式——无人零售逐渐形成概念。 如果说&#xff0c;人…

D78XX系列——用于各种电视机、收录机、电子仪器、设备的稳压电源电路,输出电流大,内设过热、短路保护电路,无需外接元件

D78XX系列是用于各种电视机、收录机、电子仪器、设备的稳压电源电路。包括D7805、D7806、 D7808、 D7809、 D7810、 D7812、 D7815。 主要特点&#xff1a; ● 输出电流大&#xff0c;IOMAX 1A. ● 无需外接元件。 ● 内设过热、短路保护电路 ● 封装形式: T0-220

Cmake语法学习2:常用变量

目录 1.常用变量简介 1.1提供信息的变量 1.2改变行为的变量 1.3描述系统的变量 ​编辑1.4控制编译的变量 2.提供信息的变量 2.1PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 2.2 CMAKE_SOURCE_DIR 和 CMAKE_BINARY_DIR 2.3CMAKE_CURRENT_SOURCE_DIR 和CMAKE_CURRENT_BIN…

如何用AI人工智能写作?6个AI写作神器推荐

在日常生活中&#xff0c;我们往往会遇到一些关于写作方面的难题&#xff0c;毕竟传统的写作方式还是会存在一些局限性&#xff0c;幸运的是&#xff0c;随着人工智能技术的不断发展&#xff0c;AI写作已经成为了现实。AI写作神器可以帮助我们提高写作效率&#xff0c;解决写作…

骨传导耳机的技术原理是什么?和传统耳机相比有哪些优点?

骨传导耳机通过人体骨骼来传递声音&#xff0c;可以绕过耳道和耳膜直接传达音频到听者的内耳&#xff0c;开放双耳的佩戴方式可以在享受音乐或通话的同时保持对周围环境的感知&#xff0c;这种设计在户外活动或运动等场景下的使用尤为实用&#xff0c;可以避免堵塞耳朵&#xf…

RK3568驱动指南|驱动基础进阶篇-进阶1 编译进内核的驱动系统是如何运行的?

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

Python实现排序算法

目录 一&#xff1a;快速排序 二&#xff1a;合并排序 三&#xff1a;冒泡排序 四&#xff1a;插入排序 五&#xff1a;选择排序 一&#xff1a;快速排序 def quicksort(arr): if len(arr) < 1: return arr pivot arr[len(arr) // 2] le…

Unity | 渡鸦避难所-9 | 角色名字及血条等信息

1 效果预览 游戏中角色的名字和血条是非常重要的元素&#xff0c;它们可以帮助玩家了解角色的身份和状态。在 Unity 中&#xff0c;可以使用 UGUI 来实现这些功能 2 实现方案 1 画布 (Canvas) 画布 (Canvas) 组件表示进行 UI 布局和渲染的抽象空间。所有 UI 元素都必须是附加…

UE5 虚幻游戏报错常用解决方法(幻兽帕鲁UE5报错)

在体验使用虚幻引擎5、4&#xff08;UE5/UE4&#xff09;开发的游戏如《幻兽帕鲁》时&#xff0c;玩家可能会遇到各种报错情况&#xff0c;例如黑屏、闪退、C运行时错误等。本博客将汇集一系列有效解决方案&#xff0c;通过调整虚幻引擎内置命令行参数以及优化系统环境&#xf…

环状热力图R语言画法

环状热力图&#xff08;Circular Heatmap&#xff09;是一种以环状布局展示数据的可视化方法。它结合了热力图和极坐标系统&#xff0c;能够有效地显示数据的关系、模式和趋势。 环状热力图通常用于可视化二维数据矩阵&#xff0c;其中行和列代表不同的类别或变量&#xff0c;…

“欢天喜地迎新春”下姜村邻里守望写对联活动

卯兔追冬去&#xff0c;辰龙报春来。空谷幽香谱佳期&#xff0c;红联金句寄吉祥。春联是我国特有的文学形式&#xff0c;贴春联是继承传统习俗的一种方式&#xff0c;是对祖先的尊敬&#xff0c;对传统的继承。春节前夕&#xff0c;家家户户贴上红红的春联&#xff0c;一副副透…

前妻(C#)-基础03-枚举-预处理指令

前妻C#-基础语法03 枚举关于控制台IO及注释C#预处理指令 枚举 枚举是用户定义的整数类型。在声明一个枚举时&#xff0c;要指定改枚举的实例可以包含的一组可接受的值。不仅如此&#xff0c;还可以给值指定易于记忆的名称&#xff0c;如果在代码的某个地方&#xff0c;要试图把…

【SpringCloud】使用OpenFeign进行微服务化改造

目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…

QT SQL

QT SQL模块提供数据库编程的支持&#xff0c;支持多种常见的数据库&#xff1a;MySQL\Oracle\MS SQL Server\SQLite等。SQL模块包含多个类&#xff0c;可以实现&#xff1a;数据库连接、SQL语句执行、数据获取与界面显示 等功能。数据 与 界面间用Model\View架构。 一、 二、Q…

禅道列表页编辑页添加页自定义字段

1&#xff0c;数据库表 zt_story 添加自定义字段 bakDate1&#xff0c;bakDate2&#xff0c;bakDate3&#xff0c;bakDate4 2&#xff0c;在 /opt/lampp/htdocs/zentaopms/extension/custom/story/ext/config 中添加bakDate.php文件 <?php $config->story->datatab…

【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士&#xff0c;拥有10年网球球龄&#xff0c;2023年的温网决赛&#xff0c;熬夜到半夜全称观看完了直播&#xff0c;对于网球规则、比赛的数据非常熟悉&#xff0c;这个…