已知两个点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算法相关推荐

  1. 直线扫描转换-中点算法

    直线扫描转换-中点算法 采用增量思想的DDA算法,直观.易实现,每计算一个象素坐标,只需计算一个加法. (1)改进效率.这个算法每步只做一个加法,能否再提高效率? 一般情况下k与y都是小数,而且每一步 ...

  2. cpp实现直线的DDA算法

    cpp实现直线的DDA算法 给定起始点,输出直线在两点之内所经过的像素点的位置. 比如输入: 输出起点x值:0 输出起点y值:0 输出终点x值:5 输出终点y值:2 输出结果: (0,0) (1,0) ...

  3. 使用QT绘制直线【DDA算法】

    使用QT绘制直线[DDA算法] 第一次用Markdown写博客 可以说过程极其坎坷 感谢大佬@jiangxiaoju的帮助 没有他就没有现在稍微会那么一点点C++的蘑菇 接下来 正文开始 添加头文件 ...

  4. 计算机图形学——生成直线的DDA算法

    本博客计算机图形学系列文章索引: 地址:<计算机图形学系列相关文章索引(持续更新)> 数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微 ...

  5. 计算机图形学之生成直线的DDA算法(C#)

    计算机图形学DDA直线算法(C#) 一.直线的生成算法 实质上是一个发现最佳逼近直线的象素系列,并填入彩色数据的过程. 二.DDA算法 一种基于直线的微分方程来生成直线的一种方法. 三.DDA代码程序 ...

  6. DDA算法画直线----计算机图形学

    生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令  , 斜率  , 则直线方程为  为方便起见,这里 假定  . 显然,对于每一个 xi  ...

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

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

  8. line划线计算机图像学,【计算机图形学】根本图形元素:直线的生成算法

    [计算机图形学]基本图形元素:直线的生成算法 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net ...

  9. 【计算机图形学】基本图形元素:直线的生成算法

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  10. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

最新文章

  1. 省内转学出错的解决办法
  2. XML解析,dom解析,Jdom解析
  3. ReactJS入门之组件状态
  4. 有意思的 Node.js 内存泄漏问题
  5. linux mysql 单机主从_MariaDB单机双实例主从复制
  6. 分表后需要注意的二三事
  7. 在github网页版里新建文件夹,放置很多子文件:添加斜杠自动生成文件夹
  8. 优酷直播节目“冠军体育课”第二季收官 共吸引近百万用户观看互动
  9. jQuery学习笔记02
  10. 2019湖南多校第四场
  11. 大二暑假假期周进度01
  12. CentOS SSH安装和配置
  13. 发布、发版、上线流程
  14. tmall API接口关键字获取商品数据
  15. 手机游戏:崇尚简单至上和零碎娱乐的永恒价值
  16. 名悦集团分享纯电动汽车保养的几个小秘诀
  17. 帮你全面了解人工智能
  18. asp.net基础:网页中插入Skype链接标签
  19. Kernel API(一)writeb(), writew(), writel(),readb(), readw(), readl()
  20. 【日常】某B视频网站模拟登录尝试

热门文章

  1. TSX指令集中的 RTM 受限的事务内存 来实现并发无锁编程
  2. Ubuntu下安装QQ(wineQQ)
  3. java md5加密源码_javaMD5加密源码
  4. CSND博客☞盘码之路开始
  5. Axure 9 案例教程基础篇之课程简介(助你快速进入实战阶段)
  6. mhd matlab,应用 | 基于磁流体MHD的FLUENT-Maxwell集成耦合开发
  7. 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的
  8. 23种设计模式之模板方法模式
  9. fortran 教程
  10. PHP微信H5支付Demo