【计算机图形学】实验一 DDA算法、Bresenham算法

news2024/11/29 4:37:15

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

文章目录

  • 实验一、DDA算法、Bresenham算法
    • 一、实验目的及要求
    • 二、实验设备
    • 三、实验原理
    • 四、实验方法与步骤
    • 五、实验结果
    • 六、结论

实验一、DDA算法、Bresenham算法

一、实验目的及要求

  1. 使用DDA算法画直线
  2. 使用Bresenham算法画直线和圆弧

二、实验设备

  • Microsoft Visual Studio 2022

三、实验原理

  1. DDA算法(Digital Differential Analyzer): DDA算法是一种基于差分的算法,通过逐个增加x和y的步长来绘制直线。其基本原理是计算出两点之间的x和y的差值,然后根据斜率选择较大的差值来确定下一点的位置。
  2. Bresenham算法: Bresenham算法是一种整数算法,通过判断像素点到直线的距离来确定下一个像素点的位置。该算法通过利用递推关系式,避免了浮点数运算,提高了绘制速度。

四、实验方法与步骤

  1. 算法思想
  • DDA算法:根据起点和终点的坐标,计算出x和y的增量,并根据斜率选择较大的增量来确定下一个像素点的位置。
  • Bresenham算法:根据起点和终点的坐标,计算出dx和dy的差值,并根据差值来选择下一个像素点的位置。
  1. 算法步骤
  • DDA算法:
  1. 计算出dx和dy的差值。
  2. 根据斜率选择较大的增量。
  3. 根据起点和增量计算下一个像素点的位置。
  4. 重复以上步骤,直到达到终点。
  • Bresenham算法:
  1. 计算出dx和dy的差值。
  2. 判断斜率是否小于1,如果是则选择x方向为递增方向,否则选择y方向为递增方向。
  3. 根据判断结果选择递增方向,并计算初始决策参数。
  4. 循环计算下一个像素点的位置,并更新决策参数。
  5. 重复以上步骤,直到达到终点。
  6. 代码
  • DDA算法画直线
void LineDDA(int x0, int y0, int x1, int y1)
{
    // 初始化变量
    int x;
    int dy, dx;
    int y;
    float k;

    // 计算斜率和增量
    dx = x1 - x0;
    dy = y1 - y0;
    k = (float)dy / dx; // 计算斜率
    y = y0; // 初始化y坐标为起始点y坐标

    // 设置绘制点的颜色和大小
    glColor3f(0.0f, 0.0f, 0.0f); // 将线条颜色设置为黑色
    glPointSize(1);

    // 使用逐点递增算法绘制直线
    for (x = x0; x <= x1; x++) {
        glBegin(GL_POINTS); // 开始绘制一个点
        glVertex2i(x, (int)(y + 0.5)); // 绘制当前像素点
        glEnd(); // 结束绘制点
        y += k; // 根据斜率递增y坐标
    }

    // 强制刷新缓冲区,执行绘制命令
    glFlush();
}
  • Bresenham算法画直线
void Line(int x0, int y0, int x1, int y1)
{
    // 判断斜率绝对值是否大于1,以确定直线是陡峭还是平缓
    bool steep = abs(y1 - y0) > abs(x1 - x0);

    // 如果是陡峭的直线,则交换x和y的坐标值
    if (steep) {
        swap(x0, y0);
        swap(x1, y1);
    }

    // 确保x0 < x1
    if (x0 > x1) {
        swap(x0, x1);
        swap(y0, y1);
    }

    // 计算直线斜率的绝对值
    int dx = x1 - x0;
    int dy = abs(y1 - y0);

    // 初始化误差值和y的增量
    int error = dx / 2;
    int ystep = (y0 < y1) ? 1 : -1;
    int y = y0;

    // 设置绘制颜色为红色
    glColor3f(1.0f, 0.0f, 0.0f);

    // 使用 Bresenham 算法绘制直线
    for (int x = x0; x <= x1; x++) {
        glBegin(GL_POINTS);
        if (steep) {
            glVertex2i(y, x);
        }
        else {
            glVertex2i(x, y);
        }
        glEnd();
        error -= dy;
        if (error < 0) {
            y += ystep;
            error += dx;
        }
    }
}
  • Bresenham算法画圆
void CirclePoints(int cx, int cy, int x, int y) {
    glBegin(GL_POINTS);
    glVertex2i(cx + x, cy + y);
    glVertex2i(cx - x, cy + y);
    glVertex2i(cx + x, cy - y);
    glVertex2i(cx - x, cy - y);
    glVertex2i(cx + y, cy + x);
    glVertex2i(cx - y, cy + x);
    glVertex2i(cx + y, cy - x);
    glVertex2i(cx - y, cy - x);
    glEnd();
}

void DrawCircle(int cx, int cy, int radius, bool drawFullCircle = true) {
    int x = 0;
    int y = radius;
    int d = 3 - 2 * radius;

    glColor3f(1.0f, 0.0f, 0.0f);

    while (x <= y) {
        if (drawFullCircle) {
            CirclePoints(cx, cy, x, y);
        }
        else {
            // 如果只画圆弧,可以在这里加入逻辑来决定哪些点应该被画出来
            glBegin(GL_POINTS);
            glVertex2i(cx + x, cy + y); // 仅示例:画1/8圆弧
            glEnd();
        }
        if (d < 0) {
            d += 4 * x + 6;
        }
        else {
            d += 4 * (x - y) + 10;
            y--;
        }
        x++;
    }
}

五、实验结果

  1. DDA算法画直线

image.png

  1. Bresenham算法画线

image.png

  1. Bresenham算法画圆

image.png

六、结论

  1. DDA算法和Bresenham算法都是用于绘制直线的算法,它们各有特点:
    • DDA算法(Digital Differential Analyzer)是一种基于差分的算法,通过逐个增加x和y的步长来绘制直线。它的优点在于简单易懂,但由于需要进行浮点数运算,因此在绘制速度上相对较慢。
    • Bresenham算法是一种整数算法,通过判断像素点到直线的距离来确定下一个像素点的位置,避免了浮点数运算,提高了绘制速度。因此,Bresenham算法在绘制直线时具有更高的效率。
  2. 在绘制圆弧时,Bresenham算法同样展现了其优势,通过使用整数计算和递推关系式,能够高效地绘制圆形和圆弧。

因此,根据本次实验结果,可以得出结论:在绘制直线和圆弧时,Bresenham算法相比DDA算法具有更高的效率和精确度,特别是在涉及大量像素绘制的情况下,Bresenham算法更为优越。

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

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

相关文章

【Git】05 分离头指针

文章目录 一、分离头指针二、创建分支三、比较commit内容四、总结 一、分离头指针 正常情况下&#xff0c;在通过git checkout命令切换分支时&#xff0c;在命令后面跟着的是分支名&#xff08;例如master、temp等&#xff09;或分支名对应commit的哈希值。 非正常情况下&…

python_蓝桥杯刷题记录_笔记_全AC代码_入门3

前言 记录我的解法以及笔记思路&#xff0c;谢谢观看。 题单目录 1.P2141 [NOIP2014 普及组] 珠心算测验 2.P1567 统计天数 3.P1055 [NOIP2008 普及组] ISBN 号码 4.P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here 5.P1308 [NOIP2011 普及组] 统计单词数 6.P1047 […

Kubernetes的有状态应用示例:用PV部署WordPress和MySQL

文章目录 环境PVC和PV创建PVC和PV 创建kustomization.yaml添加secret生成器 为MySQL和WordPress添加资源配置部署和验证清理参考 环境 RHEL 9.3Docker Community 24.0.7minikube v1.32.0 PVC和PV PersistentVolume&#xff08;PV&#xff09;是在集群里由管理员手动provisio…

Python爬虫urllib详解

前言 学习爬虫&#xff0c;最初的操作便是模拟浏览器向服务器发出请求&#xff0c;那么我们需要从哪个地方做起呢&#xff1f;请求需要我们自己来构造吗&#xff1f;需要关心请求这个数据结构的实现吗&#xff1f;需要了解 HTTP、TCP、IP 层的网络传输通信吗&#xff1f;需要知…

vue3 之 组合式API—computed

computed计算属性函数 计算属性基本思想和Vue2的完全一致&#xff0c;组合式API下的计算属性只是修改了写法 核心步骤&#xff1a; 导入computed函数执行函数 在回调参数中return基于响应式数据做计算的值&#xff0c;用变量接收 vue <script setup> // 1.导入compute…

【数据分享】1929-2023年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐年平均气温数据、逐年最高气温数据…

TypeScript实战系列之强力爆破泛型的困扰

目录 介绍开始如何理解泛型语法泛型约束泛型默认值练习后续 介绍 泛型在typescript 中使用频率相当高&#xff0c;也给了初学者相当大的阻碍。希望这一篇文章&#xff0c;能帮助你们爆破它。 开始 下面通过模拟实现一个简易版本的axios来引入泛型的使用 // axios.ts type M…

10秒部署好 Serverless Web,我只告诉你一个人

谁还不知道Serverless&#xff1f; 上个月亚马逊云科技 re:Invent大会第一个演讲主题就是它。 每一个新技术概念的引入都伴随着生产力的提高&#xff0c;Serverless指的是一种构建和运行不需要服务器管理的应用程序的概念。 一个很有用的技术&#xff0c;这篇文章带你入门。…

alibabacloud学习笔记05(小滴课堂)

高并发下的微服务存在的问题 高并发下的微服务容错方案 介绍什么是分布式系统的流量防卫兵Sentinel 微服务引入Sentinel和控制台搭建 每个服务都加上这个依赖。 启动方式&#xff1a; 讲解AliababCloud微服务整合Sentinel限流配置实操 我们在order和video模块都加上。 分别启动…

网站接入QQ登录

开发者认证&#xff0c;创建应用&#xff1a; &#xff08;1&#xff09;先在 QQ 互联 QQ互联管理中心 进行个人开发者认证&#xff0c;并审核 &#xff08;2&#xff09;创建【网站应用】&#xff0c;填写正确信息&#xff0c;获得对应的 appid 与 appkey&#xff0c;并审核…

Redis——SpringBoot整合Redis实战

1、基本配置 1.1、引入依赖 首先&#xff0c;建立Maven项目&#xff0c;在Maven项目中引入pom.xml文件&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &l…

【HarmonyOS应用开发】后台提醒(十六)

简述 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c;希望在指定时间点提醒用户有优惠活动。为满足此类业务诉求&#xf…

机器学习 | 解析聚类算法在数据检测中的应用

目录 初识聚类算法 聚类算法实现流程 模型评估 算法优化 特征降维 探究用户对物品类别的喜好细分(实操) 初识聚类算法 聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的对象按照相似性分组。它旨在发现数据中的内在结构和模式&#xff0c;将具有相似特征的数据…

Photoshop CS6 下载安装教程,保姆级教程,小白也能轻松搞的,附安装包

前言 Adobe Photoshop CS6强大的照片拍摄和突破性的新功能&#xff0c;用于复杂的图形、选择、逼真的绘画和装饰智能。创建惊人的高动态范围(HDR)图像。用逼真的笔触和混合的颜色绘画。消除噪音&#xff0c;添加种子&#xff0c;并绘制一个国家最先进的摄影设备的草图。凭借原…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-Video组件的使用(十)

一、Video组件的使用 1、概述 在手机、平板或是智慧屏这些终端设备上&#xff0c;媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集&#xff0c;还是视频的播放、切换、循环&#xff0c;亦或是相机的预览、拍照等功能&#xff0c;媒体组件都是必不可…

MacBook有必要装清理软件吗?CleanMyMac的一些主要特点

MacBook是苹果公司的一款高端笔记本电脑&#xff0c;但是&#xff0c;随着使用时间的增长&#xff0c;MacBook也会出现一些问题&#xff0c;比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验&#xff0c;也可能对MacBook的寿命和安全性造成…

Shell脚本⑧免交互

目录 一.Here Document 1.定义 2.变量 &#xff08;1&#xff09;变量替换成实际值 &#xff08;2&#xff09;整行内容作为变量并输出结果 &#xff08;3&#xff09;多行注释 &#xff08;4&#xff09;自动划分磁盘免交互 二.Expect 1.定义 2.安装 3.免交互操作 …

django线上教育学习平台大数据分析系统python

随着互联网技术不断地发展&#xff0c;网络与大数据成为了人们生活的一部分&#xff0c;而线上教育平台大数据分析作为网上应用的一个全新的体现&#xff0c;由于其特有的便捷性&#xff0c;已经被人们所接受。目前主流的线上教育平台大数据分析服务不仅不明确并且管理盈利较低…

基于STM32的UART/USART数据传输的错误检测和纠错机制研究

在STM32微控制器中&#xff0c;UART/USART模块的数据传输可以通过错误检测和纠错机制来提高数据的可靠性。下面将介绍一些常用的错误检测和纠错机制&#xff0c;并提供一个示例代码来演示如何使用这些机制。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技…

SpringCloud-微服务概述、SpringCloud入门概述、服务提供与消费

1.学习前言 1.1 学习前提 熟练使用SpringBoot 微服务快速开发框架了解过Dubbo Zookeeper 分布式基础电脑配置内存不低于8G 1.2 文章大纲 Spring Cloud 五大组件 服务注册与发现——Netflix Eureka负载均衡&#xff1a; ​ 客户端负载均衡——Netflix Ribbon ​ 服务端负载…