直线扫描转换-DDA算法
已知两个点P0(x1,y1),P1(x2,y2)求直线。
为了在光栅显示器上用这些离散的像素点逼近这条直线,需要知道这些像素点的x,y坐标。
求出过P0,P1的直线段方程:
y=kx+b
k=(y1-y0)/(x1-x0)
假设x已知,即从x的起点x0开始,沿x方向前进一个像素(步长= 1),可以计算出相应的y值。
因为像素的坐标是整数,所以y值还要进行取整处理。
如何把数学上的一个点扫描转换一个屏幕像素点?
p(1.7,0.8) ->(1,0)
p(1.7,0.8) +0.5->(2.2,1.3)
p(2.2,1.3) ->(2,1)
直线是最基本的图形,一个动画或真实感图形往往需要调用成千上万次画线程序,因此直线算法的好坏与效率将直接影响图形的质量和显示速度。
为了提高效率,把计算量减下来,关键问题就是如何把乘法取消.
1、数值微分法(DDA)
2、中点画线法
3、Bresenham算法
数值微分DDA(Digital Differential Analyzer)法
引进图形学中一个很重要的思想—增量思想
yi=kxi+b
yi+1=kxi+1+b
=k(xi+1)+b
=kxi+k+b
=kxi+b+k
=yi+k
yi+1=yi+k
这个式子的含义是:当前步的y值等于前一步的y值加上斜率k
这样就把原来一个乘法和加法变成了一个计算机更喜欢的加法
用DDA扫描转换连接两点P0(0,0)和P1(5,3)的直线段。
k=(3-0)/(5-0)=0.6<1
yi+1=yi+k
x y int(y+0.5)
0 0 0
1 0+0.6 1
2 0.6+0.6 1
3 1.2+0.6 2
4 1.8+0.6 2
5 2.4+0.6 3
问题:DDA画直线算法:x每递增1,y递增斜率k。是否适合任意斜率的直线?
答案:不适合
当|k|>1时,如果还适用这种方法会导致点太少。
如直线点从(0,0)到(2,100),也只用3个点来表示,这样明显不合适。
因此当|k|>1时,交换x和y的位置。也就是以单位y间隔(δy=1)取样,顺序计算每个x值。
xi+1=xi+1/k
如从点0.0到点2,5
1/k=2/5=0.4
y x int(x+0.5)
0 0 0
1 0+0.4 0
2 0.4+0.4 1
3 0.8+0.4 1
4 1.2+0.4 2
5 1.6+0.4 2
代码:
void CDDALineDlg::DDA_Line(int x1, int y1, int x2, int y2, int color)
{CPaintDC dc(this); //获得窗口句柄float increX,increY; //x,y方向的增量float x,y;int steps; //循环次数,即画的点数steps = max(abs(x2-x1),abs(y2-y1));//选较大者作为步进方向increX = (float)(x2-x1)/steps;//x方向增量increY=(float)(y2-y1)/steps;//y方向增量x=x1;y=y1;for(int i=1;i<=steps;i++){SetPixel(dc,x,y,color); //在(x,y)处,以color色画点x+=increX;y+=increY;}
}
直线扫描转换-DDA算法相关推荐
- 直线扫描转换-中点算法
直线扫描转换-中点算法 采用增量思想的DDA算法,直观.易实现,每计算一个象素坐标,只需计算一个加法. (1)改进效率.这个算法每步只做一个加法,能否再提高效率? 一般情况下k与y都是小数,而且每一步 ...
- cpp实现直线的DDA算法
cpp实现直线的DDA算法 给定起始点,输出直线在两点之内所经过的像素点的位置. 比如输入: 输出起点x值:0 输出起点y值:0 输出终点x值:5 输出终点y值:2 输出结果: (0,0) (1,0) ...
- 使用QT绘制直线【DDA算法】
使用QT绘制直线[DDA算法] 第一次用Markdown写博客 可以说过程极其坎坷 感谢大佬@jiangxiaoju的帮助 没有他就没有现在稍微会那么一点点C++的蘑菇 接下来 正文开始 添加头文件 ...
- 计算机图形学——生成直线的DDA算法
本博客计算机图形学系列文章索引: 地址:<计算机图形学系列相关文章索引(持续更新)> 数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微 ...
- 计算机图形学之生成直线的DDA算法(C#)
计算机图形学DDA直线算法(C#) 一.直线的生成算法 实质上是一个发现最佳逼近直线的象素系列,并填入彩色数据的过程. 二.DDA算法 一种基于直线的微分方程来生成直线的一种方法. 三.DDA代码程序 ...
- DDA算法画直线----计算机图形学
生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令 , 斜率 , 则直线方程为 为方便起见,这里 假定 . 显然,对于每一个 xi ...
- 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码
环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...
- line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法
[计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...
- 【计算机图形学】基本图形元素:直线的生成算法
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...
最新文章
- 省内转学出错的解决办法
- XML解析,dom解析,Jdom解析
- ReactJS入门之组件状态
- 有意思的 Node.js 内存泄漏问题
- linux mysql 单机主从_MariaDB单机双实例主从复制
- 分表后需要注意的二三事
- 在github网页版里新建文件夹,放置很多子文件:添加斜杠自动生成文件夹
- 优酷直播节目“冠军体育课”第二季收官 共吸引近百万用户观看互动
- jQuery学习笔记02
- 2019湖南多校第四场
- 大二暑假假期周进度01
- CentOS SSH安装和配置
- 发布、发版、上线流程
- tmall API接口关键字获取商品数据
- 手机游戏:崇尚简单至上和零碎娱乐的永恒价值
- 名悦集团分享纯电动汽车保养的几个小秘诀
- 帮你全面了解人工智能
- asp.net基础:网页中插入Skype链接标签
- Kernel API(一)writeb(), writew(), writel(),readb(), readw(), readl()
- 【日常】某B视频网站模拟登录尝试