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. 通过CURL抓取页面中的图片路径并下载到本地

    1.首页是图片处理页面downpic.php <?phpfunction getImage($url,$filename="") { if($url=="" ...

  2. Centos安装FastDFS+Nginx(一天时间搞定)

    最近在研究和使用Fastdfs,别人搭的环境,终究是别人的,绝知此事要躬行~躬行啊~      下面的脚本主要参考了官方的INSTALL文件,这个是比较权威的,部分地方和实际情况不一致.比如配置文件的 ...

  3. 【习题 8-9 1613】 K-Graph Oddity

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 感觉最大度数|1就是最多需要的个数了. 就贪心一下. 然后模拟染色的过程就可以了. (贪心染色就可以了 (看看周围哪个颜色没有,就用 ...

  4. IntelliJ IDEA基于maven构建的web项目找不到jar包

    基于maven构建的springMVC项目,下载好jar包import后,运行提示ClassNotFoundException: java.lang.ClassNotFoundException: o ...

  5. thinkphp5空控制器和空操作

    thinkphp5空控制器和空操作 一.总结 1.空控制器和空操作用:空控制器和空操作都是为了防止网站上的用户恶意输入,网站上线的话必须加上, 2.空操作:空操作就是在一般的控制器里面加上一个 _em ...

  6. SQL2012的新分页方法

    SELECT BusinessEntityID , FirstName , LastName FROM Person.Person ORDER BY BusinessEntityID OFFSET ( ...

  7. 洛谷 P3386 【模板】二分图匹配 Dinic版

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

  8. 使用Python开发轻量级的Web框架以及基于WSGI的服务器来实现一个网站页面

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目说明 二丶数据准备 三丶使用网络TCP开发一个基于WSGI协议的Web服务器 四丶使用python3开发一个轻量级的 ...

  9. 常用处理字符串的SQL函数

    汇总函数:Count.Sum.AVG.MAX.min; 数学函数: ABS:绝对值.floor:给出比给定值小的最大整数. round(m,n):m为给定的值,n为小数点后保留的位数. power(m ...

  10. [Javascript] Classify text into categories with machine learning in Natural

    In this lesson, we will learn how to train a Naive Bayes classifier or a Logistic Regression classif ...