DDA算法画直线----计算机图形学
生成直线的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算法画直线----计算机图形学相关推荐
- dda算法画直线_深度学习算法第一讲感知机数学原理解析及实现
前言 从本篇开始我们将讲解一些机器学习中常用的算法模型及实现原理,本系列会一直更新,把自己走过的弯路都记录下来,也希望后人学习的过程能更顺畅一点. 正文 感知机的理解 感知机属于机器学习算法中 ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- 数值微分法绘制直线c语言,OpenGL数值微分法(DDA)画直线
DDA算法,是计算机图形学中一种基于直线的微分方程来生成直线的方法,由于有浮点数运算与取整,该算法不利于硬件实现. 其主要思想是由直线公式y = kx + b推导出来的. 我们已知直线段两个端点P0( ...
- 计算机图形学E2——OpenGL Bresenham算法画直线
其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 【CAD算法】【计算机图形学】Bezier贝塞尔曲线生成程序(python/numpy实现)[1]
整个项目,从Bezier曲线的创建,到Coons Patch曲面的实现,再到网格的实现和优化,还有最后对表面的光顺,链接如下: [CAD算法][计算机图形学]Bezier贝塞尔曲线生成程序(pytho ...
- 如何用计算机画立方体,画立方体-计算机图形学实验.doc
画立方体-计算机图形学实验.doc (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 计算机图形学实验--画立方体(通过视向变换等)具 ...
- 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码
环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...
- 计算机图形学直线算法论文,《计算机图形学》中直线生成算法的教学心得
摘要:<计算机图形学>是计算机科学与技术专业一门重要的专业课,其中直线生成算法是教学重点之一.该文通过分析几种直线生成算法的特点,阐述了理论教学和实践教学的重点和难点,总结了教学的体会和心 ...
最新文章
- JAVA变量的数据类型样例
- Java 理论与实践: 用弱引用堵住内存泄漏---转载
- python中cv2库_Python cv2库(人脸检测)
- 芯片里的CPU、GPU、NPU是什么,它们是如何工作的
- STL中算法锦集(四)
- Linux命令:mkdir
- 侵犯著作权法定赔偿额上限提高至500万元
- CVPR 2019 | 旷视提出新型目标检测损失函数:定位更精准
- 忠告 | 小小对Java30岁程序猿的忠告,强烈推荐!
- python中字典和json的区别_详解python中的json和字典dict
- 计算机word实训项目任务说明,计算机项目实训报告怎么写啊
- 5.9 Longformer解读
- Win装linux双系统教程
- 用CMD批量ping ip地址
- 实现百战铁路售票系统临时车次的添加功能
- 官方通知:考研国家线预计4月中旬公布
- 设计模式之多用组合,少用继承
- STM32F7 内部flash操作启动
- ASBR上配置外部OSPF路由汇总
- 使用d3画横向组织架构图,兼容ie8(一)
热门文章
- 支付宝发的计算机,支付宝电脑支付沙箱配置(JAVA)
- 从PCRE到Hyperscan 性能对比
- ASTERISK入门
- 部分WP-GKCTF2020
- 新一代EEA的主干网:车载以太网
- IDEA导入Maven模块未识别,包颜色不对(包显示灰色)
- div(table)自动换行word-break:break-all和word-wrap:break-word的区别
- 2005是网游商最尴尬一年 涉赌投诉意外死亡
- 操作无法完成因为已经在mysqld.exe上打开_Win10 PC+iPad+Android Phone 无顿挫感使用指南:同步(上)...
- 淘宝、1688采集商品信息详情API