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. Broadcast-广播的接收

    至于广播的意思,不再赘述,直接看它的使用 先看代码 package com.example.test1123; import android.annotation.SuppressLint; impo ...

  2. softInputMode- 软件盘的设置

    今天遇到一个问题,就是软件盘弹出来以后,会把之前的布局界面整个的挤到屏幕的外面,而且按下返回建以后,这个软件盘占据的空间会留下一个黑色的背景.在网上查找了很多的方法,刚开始都是说,如下方法 <a ...

  3. Flume的可靠性

    Flume的可靠性 当节点出现故障时,日志能够被传送到其他节点上而不会丢失. Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to- end(收到数据agent首先将event写到磁 ...

  4. golang 写文件

    package main import ( "bufio" "fmt" "io" "os" ) func main() ...

  5. golang API 例子实现

    golang API 例子实现 http://files.cnblogs.com/files/rojas/astaxie.zip

  6. 关于Promise详解

    异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务 ...

  7. 洛谷 P1054 等价表达式

    洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...

  8. View源码分析如何创建

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/jj120522 博主导读:View是Android中最重要的控件,几乎所有的控件都与View相 ...

  9. [React & Testing] Simulate Event testing

    Here we want to test a toggle button component, when the button was click, state should change, styl ...

  10. 2. ZooKeeper的ZAB协议。

    转自:https://blog.csdn.net/en_joker/article/details/78662880 ZooKeeper并没有完全采用Paxos算法,而是使用了一种称为ZooKeepe ...