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

在一个坐标轴上以单位间隔对线段取样,从而确定还有一个坐标轴上最靠近线路径的相应整数值。首先考虑如图3.6所看到的的具有正斜率的线段。比如。如果斜率小于等于1。则以单位x间隔(&x = 1)取样,并逐个计算每个y值:

       下标k取整数值,从第一个点1開始递增直至最后端点。因为m能够是0与1之间的随意实数。所以计算出的y值必须取整。对于具有大于l的正斜率的线段,则交换x和y的位置。也就是以单位Y间隔(&y = 1)取样,并计算每个连续的x值:

        此时,每个计算出的x值要沿y扫描线舍入到近期的像素位置。 等式(3.6)和等式(3.7)基于从左端点到右端点处理线段的如果(參见图3.6)。假如这个过程中的处理方向相反。即起始端点在右側。那么&x = -1,而且
                                      
或者(当斜率大于1时)是&y = -1。而且

        等式(3.6)和等式(3.9)也能够用来计算具有负斜率的线段的像素位置。假如斜率的绝对值小于1。而且起始端点在左側。可设置&x = 1并用等式(3.6)计算y值。当起始端点在右側(具有相同斜率)时。我们可设置&x = -1而且由等式(3.8 )得到y的位置。

相同,负斜率的绝对值大于1时,能够使用&y = -1和等式(3.9)或者&y = 1和等式(3.7)进行计算。
       这个算法能够概括为以下的过程:输人线段两个端点的像素位置,端点位置间的水平和垂直差值赋给參数dx和dy。绝对值大的參数确定參数steps的值。从像素位置(x0, y0)開始,确定沿线段生成下一个像素位置的每一步所需的偏移量。并循环上述过程steps次。

假如dx的绝对值大于dy的绝对值,且x0小于xEnd。那么x和y方向的增量值分别为1和m。假如x方向的变化较大,但x0大于xEnd。那么就採用减量-1和-m来生成线段上的每个点。

在其它情况下,y方向使用单位增量(或减量),x方向使用1/m的增量(或减量)。

#include <stdlib.h>
#include <math.h> inline int round(const float a) {return int (a + 0.5);}
void lineDDA(int x0,int y0,int xEnd,int yEnd){
int dx = xEnd - x0, dy = yEnd - y0,steps, k ;
float xIncrement, yIncrement,x = x0,y = y0;
if(fabs(dx)>fabs(dr))
steps = fabs(dx);
else
steps = fabs(dy);
xIncrement = float (dx) / float (steps);
yIncrement = float (dy) / float (steps); setPixel (round(x),round(y));
for(k = 0;k<steps;k++){
x += xIncrement;
y += yIncrement;
setPixel(round(x),round(y));
} }

       DDA方法计算像素位置要比直接使用直线方程(3.1 )计算的速度更快

它利用光栅特性消除了直线方程(3.1 )中的乘法,而在x或Y方向使用合适的增量。从而沿线路径逐步得到各像素的位置。但在浮点增量的连续迭加中,取整误差的积累使得对于较长线段所计算的像素位置偏离实际线段。

而且该过程中的取整操作和浮点运算仍然十分耗时。我们能够通过将增量m和1/m分离成整数和小数部分,从而使全部的计算都简化为整数操作来改善DDA算法的性能。在以后将讨论用整数步长计算1
/m增量的方法。在下一节中。我们考虑既能用于直线又能用于曲线的更通用的扫描线程序。

计算机图形学(二)输出图元_3_画线算法_2_DDA算法的更多相关文章

  1. 117.C语言实现桌面输出图片,桌面输出文字,桌面画线

    通过获取窗口句柄,然后获取窗口DC,然后画图 #include <Windows.h> #include <stdio.h> //桌面画线 void drawLine() { ...

  2. 画线函数Glib_Line算法的研究

      在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...

  3. 学习shader之前必须知道的东西之计算机图形学-渲染管线

    引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...

  4. 学习shader之前必须知道的东西之计算机图形学(一)渲染管线

    引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...

  5. 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

    中点画圆算法        如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...

  6. 计算机图形学DDA画线法+中点画线法+Bresenham画线法

    #include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...

  7. [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)

    上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...

  8. 解题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思路的方案

    今天(已经好些天前了...),群里面(JS前端开发跳板6群[81501322])有个群友问了这样一个问题. 如题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思 ...

  9. .NET CAD二次开发学习 对称画线功能

    [CommandMethod("CBline")] //对称画线 public void CBline() { Document doc = Application.Documen ...

随机推荐

  1. django shell 操作

    插件:django-extensions django-extensions==1.9.8 pip3 install  django-extensions 1.数据库shell 命令(项目目录下) p ...

  2. Android开发之经常使用开源库直接拿来用

    1.from  代码家 整理比較好的源代码连接 **************************************************************************** ...

  3. IIS6/7/8 WEBserver不能訪问grf报表模板文件的问题

    通过 IE不能訪问到 .grf 报表文件,这是由于 IIS6/7/8对訪问的扩展名做了限制,除了已经定义的扩展名之外.其它的扩展名都不能訪问.这跟 IIS5 不一样,IIS5 对全部的扩展名都不做限制 ...

  4. 徒弟们对话,遇到sb领导,离职吧

     由于涉及私密,所以qq号做了干扰.见谅. 非常多人以为在公司,你优化了几十个sql老板就给你涨工资了.或者你bbed搞点特殊恢复就涨工资了. 或者解决某些棘手问题就涨工资了. 那是不正确的. 遇 ...

  5. Dcloud课程8 开心一刻应用如何实现

    Dcloud课程8 开心一刻应用如何实现 一.总结 一句话总结:app就是远程调用接口获得数据,我们在后台要做的,就是写一个个让页面获得接口的数据.这里用的是公共笑话接口. 1.ajax返回给页面的h ...

  6. 【agc014d】Black and White Tree

    又是被虐的一天呢~(AC是不可能的,这辈子不可能AC的.做题又不会做,就是打打暴力,才能维持骗骗分这样子.在机房里的感觉比回家的感觉好多了!里面个个都是大佬,个个都是死宅,我超喜欢在里面的!) (↑以 ...

  7. var、let和const的区别

    var 首先var有变量提升 console.log(a); // undefined var a = 1; function也存在提升现象 console.log(b); //function b( ...

  8. Python之字符串切片

    切片操作(slice)可以从一个字符串中获取子字符串(字符串的一部分).我们使用一对方括号.起始偏移量start.终止偏移量end 以及可选的步长step 来定义一个分片. 格式: [start:en ...

  9. CISP/CISA 每日一题 九(2017-11-30 09:25)

    电子银行风险管理责任: 1.风险管理是董事会和高级管理层的责任 2.实施技术是信息技术高级管理层的责任 3.测量和监控风险是经营管理层的责任     管理层在实施一个新的电子银行应用程序之前要 ___ ...

  10. 洛谷 P2628 冒险岛

    P2628 冒险岛 题目背景 冒险岛是费老师新开发的一种情景模拟电脑的游戏,通过掷骰子(1~6个数字之间),让一种人物(棋子)在棋纸上从左至右的行走,从而模拟冒险的故事…… 题目描述 棋纸上有一条从左 ...