生成直线的DDA算法:

假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示:

令  , 斜率  , 则直线方程为 

为方便起见,这里 假定  。 显然,对于每一个 xi 的取值(x 的变化规律是每次递增1),都有唯一的 yi 值与之对应,通过对 yi 值做四舍五入运算,最终确定每一扫描列上的像素值。

但这种策略效率不高,因为每次迭代都要做一次浮点(或二进制分数)乘法、加法和一个舍入运算。可以使用下式跳过乘法:

若  , 则  , 即 x, y 的值可由它们的前一个值确定。

注意: 如果  , 则x 的步进值会使 y 的步进值超过1.在这种情况下,应颠倒x 与 y 的位置,给 y 以单位增量,即 ,而x 的增量为  , 即取x 轴和 y 轴中变化较快的轴作为参变量,则可在直线上绘制更多的点。

核心代码:

from PySide2.QtCore import *
import mathclass Line:def __init__(self, p):self.p = pdef points_list_dda(self):points = []if self.p[0].y() == self.p[1].y():if self.p[0].x() > self.p[1].x():self.p.reverse()x = self.p[0].x()y = self.p[0].y()while x < self.p[1].x():points.append(QPoint(x, y))x = x+1return pointsif self.p[0].x() == self.p[1].x():if self.p[0].y() > self.p[1].y():self.p.reverse()x = self.p[0].x()y = self.p[0].y()while y < self.p[1].y():points.append(QPoint(x, y))y = y+1return pointsm = (self.p[1].y()-self.p[0].y())/(self.p[1].x()-self.p[0].x())if m <= 1 and m >= -1:if self.p[0].x() > self.p[1].x():self.p.reverse()x = self.p[0].x()y = self.p[0].y()points.append(self.p[0])while x < self.p[1].x():x = x+1y = y+myy = round(y)points.append(QPoint(x, yy))return pointselse:if self.p[0].y() > self.p[1].y():self.p.reverse()x = self.p[0].x()y = self.p[0].y()points.append(self.p[0])while y < self.p[1].y():xx = int(x+0.5)points.append(QPoint(xx, y))y = y+1x = x+1/mreturn points

注意: 这里采用的四舍五入方法有 yy = round(y) 和 xx = int(x+0.5) ,但是由于在负数区域 xx = int(x+0.5)并不是那么灵便,比如:int(-0.6)= 0,而我们期望的值为 -1 , 所以建议使用 round() 函数。

eg:使用 xx = int(x+0.5)

使用 xx = round(x)

加上UI界面实现效果:

PS: 如需参考完整代码,请移步:https://download.csdn.net/download/qq_42185999/11834669   进行下载

DDA算法画直线----计算机图形学相关推荐

  1. dda算法画直线_深度学习算法第一讲感知机数学原理解析及实现

    前言    从本篇开始我们将讲解一些机器学习中常用的算法模型及实现原理,本系列会一直更新,把自己走过的弯路都记录下来,也希望后人学习的过程能更顺畅一点. 正文 感知机的理解  感知机属于机器学习算法中 ...

  2. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  3. 数值微分法绘制直线c语言,OpenGL数值微分法(DDA)画直线

    DDA算法,是计算机图形学中一种基于直线的微分方程来生成直线的方法,由于有浮点数运算与取整,该算法不利于硬件实现. 其主要思想是由直线公式y = kx + b推导出来的. 我们已知直线段两个端点P0( ...

  4. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  5. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  6. 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]

    整个项目,从Bezier曲线的创建,到Coons Patch曲面的实现,再到网格的实现和优化,还有最后对表面的光顺,链接如下: [CAD算法][计算机图形学]Bezier贝塞尔曲线生成程序(pytho ...

  7. 如何用计算机画立方体,画立方体-计算机图形学实验.doc

    画立方体-计算机图形学实验.doc (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 计算机图形学实验--画立方体(通过视向变换等)具 ...

  8. 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码

    环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...

  9. 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得

    摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...

最新文章

  1. JAVA变量的数据类型样例
  2. Java 理论与实践: 用弱引用堵住内存泄漏---转载
  3. python中cv2库_Python cv2库(人脸检测)
  4. 芯片里的CPU、GPU、NPU是什么,它们是如何工作的
  5. STL中算法锦集(四)
  6. Linux命令:mkdir
  7. 侵犯著作权法定赔偿额上限提高至500万元
  8. CVPR 2019 | 旷视提出新型目标检测损失函数:定位更精准
  9. 忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!
  10. python中字典和json的区别_详解python中的json和字典dict
  11. 计算机word实训项目任务说明,计算机项目实训报告怎么写啊
  12. 5.9 Longformer解读
  13. Win装linux双系统教程
  14. 用CMD批量ping ip地址
  15. 实现百战铁路售票系统临时车次的添加功能
  16. 官方通知:考研国家线预计4月中旬公布
  17. 设计模式之多用组合,少用继承
  18. STM32F7 内部flash操作启动
  19. ASBR上配置外部OSPF路由汇总
  20. 使用d3画横向组织架构图,兼容ie8(一)

热门文章

  1. 支付宝发的计算机,支付宝电脑支付沙箱配置(JAVA)
  2. 从PCRE到Hyperscan 性能对比
  3. ASTERISK入门
  4. 部分WP-GKCTF2020
  5. 新一代EEA的主干网:车载以太网
  6. IDEA导入Maven模块未识别,包颜色不对(包显示灰色)
  7. div(table)自动换行word-break:break-all和word-wrap:break-word的区别
  8. 2005是网游商最尴尬一年 涉赌投诉意外死亡
  9. 操作无法完成因为已经在mysqld.exe上打开_Win10 PC+iPad+Android Phone 无顿挫感使用指南:同步(上)...
  10. 淘宝、1688采集商品信息详情API