DDA(digital differential analyzer)

由直线的斜截式方程引入

对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值

Yk+1 = Yk + m   (m为由初始点确定的斜率)

对于斜率>1的线段

Xk+1 = Xk + 1/m   (m为由初始点确定的斜率)

起始端点在于右侧时 ”+” -> ”-”

  1. #include "stdlib.h"
  2.  
  3. #include "math.h"
  4.  
  5. inline int round(const float a){return int (a + 0.5);}
  6.  
  7. //实现算数取整
  8.  
  9. void lineDDA(int x0, int y0, int xEnd, int yEnd)
  10.  
  11. {
  12.  
  13. int dx = xEnd - x0, dy = yEnd - y0, steps, k;
  14.  
  15. float xIncrement, yIncrement, x = (float)x0, y = (float)y0;
  16.  
  17. if(fabs(dx)>fabs(dy))
  18.  
  19. {
  20.  
  21. steps = fabs(dx);
  22.  
  23. }
  24.  
  25. else
  26.  
  27. {
  28.  
  29. steps = fabs(dy);
  30.  
  31. }
  32.  
  33. //比较斜率
  34.  
  35. xIncrement = float(dx)/float(steps);
  36.  
  37. yIncrement = float(dy)/float(steps);
  38.  
  39. setpixel(round(x),round(y));
  40.  
  41. for(k=;k<steps;k++)
  42.  
  43. {
  44.  
  45. x += xIncrement;
  46.  
  47. y += yIncrement;
  48.  
  49. setpixel(round(x),round(y));
  50.  
  51. }
  52.  
  53. //增量绘图
  54.  
  55. }

Bresenham 画线算法

Bresenham算法通过计算下一个理论点与其相邻栅格的距离构造了决策参数,而后利用决策参数进行递推绘点。

dlower = y - yk = m(xk+1)+b - yk

dupper = (yk+1) - y = yk + 1 – m(xk+1)-b

决策参数p = △x(dlower - dupper) = 2△y*xk - 2△x*yk + c

|m|<1时的Bresenham画线算法为:

  1. 输入线段的两个端点,并将左端点储存在(x0,y0)中
  2. 将(x0,y0)装入帧缓存,画出第一个点;
  3. 计算常量△x, △有,△2y和2△y-2△x,并得到决策参数的第一个值:

P0 = 2△y - △x

4.从k = 0开始,在沿线段路径的每个xk处,进行下列检测:

如果pk<0,下一个要绘制的点是(xk+1,yk),并且

pk+1 = pk+2△y

否则,下一个要绘制的点是(xk+1,yk+1),并且

pk+1 = pk+2△y-2△x

5.重复步骤4,△x-1次

  1. #include<stdlib.h>
  2. #include<math.h>
  3.  
  4. /*|m|<1.0时候的bresenham算法*/
  5.  
  6. void lineBres(int x0, int y0, int xEnd, int yEnd)
  7. {
  8. int dx = fabs(xEnd - x0), dy = fabs(yEnd - y0);
  9. int p = * dy - dx;
  10. int twoDy = * dy, twoDyminusDx = * (dy - dx);
  11. int x, y;
  12.  
  13. /*根据斜率正负决定起始点和终结点*/
  14. if (x0 > xEnd)
  15. {
  16. x = xEnd;
  17. y = yEnd;
  18. xEnd = x0;
  19. }
  20. else
  21. {
  22. x = x0;
  23. y = y0;
  24. }
  25. setPixel(x, y);
  26.  
  27. while (x < xEnd)
  28. {
  29. x++;
  30. if (p < )
  31. p += twoDy;
  32. else
  33. {
  34. y++; p += twoDyMinusDx;
  35. }
  36. setPixel(x, y)
  37. }
  38. }

两种画线算法(DDA&Bersenham)的更多相关文章

  1. Bresenham画线算法

    [Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...

  2. cocos2d中两种移动的算法

    在对cocos2d的sprite处理移动的过程中,通常用到的两种移动的算法: 假设这个CCNode是直接放在CCLayer上的 距离差法: CGPoint curTouchPosUI = [touch ...

  3. 计算机图形学(二)输出图元_3_画线算法_2_DDA算法

    DDA算法        数字微分分析仪(digital differential analyzer, DDA)方法是一种线段扫描转换算法.基于使用等式(3.4)或等式(3.5)计算的&x或& ...

  4. 中点Brehensam画线算法

    #include<stdio.h> #include<stdlib.h> #include"graphics.h" //函数声明 void MidBreha ...

  5. Bezier画线算法

    编译器:VS2013 描述:Bezier画线是利用导数相同拼接曲线,使曲线十分光滑,而不是随意拼接观赏性很差 主函数段 #include "stdafx.h" #include&l ...

  6. DDA画线算法

    #include<stdio.h> #include"graphics.h" #include<math.h> #include<stdlib.h&g ...

  7. matplotlib两种画散点图的方式

    对于matplotlib.pyplot( as plt ) 先输入主体数据部分: import numpy as np import matplotlib.pyplot as plt X_train ...

  8. PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家

    首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...

  9. 两种缓存淘汰算法LFU&LRU

    LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...

随机推荐

  1. DDD社区官网

    DDD社区官网上一篇关于聚合设计的几个原则的简单讨论: 聚合是用来封装真正的不变性,而不是简单的将对象组合在一起 聚合应尽量设计的小 聚合之间通过ID关联 聚合内强一致性,聚合之间最终一致性 从聚合和 ...

  2. 街景地图 API

    SOSO街景地图 API (Javascript)开发教程(1)- 街景   SOSO街景地图 Javascript API 干什么用的? 你想在网页里嵌入个地图,就需要它了! 另外,它还支持:地点搜 ...

  3. EasyUI项目驱动学习

    下面以一个项目简单介绍easyui的使用,主要包括以下组件 布局面板 - layout 可伸缩面板 - accordion 选项卡 - tabs 控制面板 - panel 窗口 - window 对话 ...

  4. JUC锁机制

    JUC锁机制(Lock)学习笔记,附详细源码解析 JUC锁机制(Lock)学习笔记,附详细源码解析 2013-08-22 20:03 by CM4J, 56 阅读, 0 评论,收藏, 编辑 锁机制学习 ...

  5. 【转】Install Oracle Jdbc driver in your Maven local repository

    Install Oracle Jdbc driver in your Maven local repository If you are using Oracle, you must first in ...

  6. C#中易混淆的知识点

    C#中易混淆的知识点 一.引言 今天在论坛中看到一位朋友提出这样的一个问题,问题大致(问题的链接为:http://social.msdn.microsoft.com/Forums/zh-CN/52e6 ...

  7. About Spring

    “Spring is the most popular application development framework for enterprise Java.”这是Spring官方首页上的第一句 ...

  8. 使用mysqldump 对数据库进行备份的乱码问题

    最近在做项目的工程中,由于系统中需要提供数据库备份的功能,经过网上一番搜索,觉得采用简单的mysqldump (1)java代码 String backupSQL = "cmd /c mys ...

  9. 框架基础:ajax设计方案(三)---集成ajax上传技术

    之前发布了ajax的通用解决方案,核心的ajax发布请求,以及集成了轮询.这次去外国网站逛逛,然后发现了ajax level2的上传文件,所以就有了把ajax的上传文件集成进去的想法,ajax方案的l ...

  10. 关于javascript变量作用域的研究。

    开始 一个变量的作用域(scope)是程序源代码中定义这个变量的区域.全局变量具有全局作用域,在javascript中的任何地方都是有定义的.然而在函数内申明的变量只在函数体内有定义.他们是局部变量, ...