计算机图形学(二)输出图元_3_画线算法_2_DDA算法
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算法的更多相关文章
- 117.C语言实现桌面输出图片,桌面输出文字,桌面画线
通过获取窗口句柄,然后获取窗口DC,然后画图 #include <Windows.h> #include <stdio.h> //桌面画线 void drawLine() { ...
- 画线函数Glib_Line算法的研究
在这里首先先简单把我对函数的功能的理解阐述一下,方便后面的分析:Glib_Line函数实现的功能是通过参数给定(x1,y1,x2,y2,color),来确定起点(x1,y1)和终点(x2,y2)两 ...
- 学习shader之前必须知道的东西之计算机图形学-渲染管线
引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...
- 学习shader之前必须知道的东西之计算机图形学(一)渲染管线
引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
中点画圆算法 如同光栅画线算法,我们在每一个步中以单位间隔取样并确定离指定圆近期的像素位置.对于给定半径r和屏幕中心(xc,yc),能够先使用算法计算圆心在坐标原点(0, 0)的圆的像素 ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
- [计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(二)
上一节链接:http://www.cnblogs.com/zjutlitao/p/4116783.html 前言: 在上一节中我们已经大致介绍了该软件的是什么.可以干什么以及界面的大致样子.此外还详细 ...
- 解题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思路的方案
今天(已经好些天前了...),群里面(JS前端开发跳板6群[81501322])有个群友问了这样一个问题. 如题:在下面画线的地方填任何代码,使得最终输出 'hello world',至少写五个不同思 ...
- .NET CAD二次开发学习 对称画线功能
[CommandMethod("CBline")] //对称画线 public void CBline() { Document doc = Application.Documen ...
随机推荐
- centos7 docker镜像源设置
由于docker他的镜像下载地址是国外官网源需要修改 添加 Docker 加速镜像(阿里云专属) 安装/升级你的Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 dock ...
- 【Hello 2018 D】Too Easy Problems
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 可以考虑把所有的题目按照ai排序. 然后顺序考虑最后做出来的题目个数和第i道题目的ai一样. 则1..i-1这些题目就没有用了. 值 ...
- 图片工具GraphicsMagick的安装配置与基本使用
本文使用GraphicsMagick的版本为1.3.18 (Released March 9, 2013). 1.简介 GraphicsMagick是一个短小精悍的的图片处理工具和库集合.对于Java ...
- 47.Android 自己定义PopupWindow技巧
47.Android 自己定义PopupWindow技巧 Android 自己定义PopupWindow技巧 前言 PopupWindow的宽高 PopupWindow定位在下左位置 PopupWin ...
- 分析深圳电信的新型HTTP劫持方式
昨天深圳下了一天的暴雨,2014年的雨水真是够多的. 用户的资源就是金钱,怎的也要好好利用嘛不是? ISP的劫持手段真是花样百出.从曾经的DNS(污染)劫持到后来的共享检測.无不通过劫持正常的请求来达 ...
- 安卓手机上安装 谷歌 play 商店
安卓手机上安装 谷歌 play 商店 安卓(Android)就是现在流行的智能手机系统,它是由Google公司和开放手机联盟领导及开发.由于安卓系统的底层代码(AOSP)是开源的,以GPL和Apach ...
- Python 之Numpy应用
NumPy 数据类型 numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型.下表列举了常用 NumPy ...
- 【2017 Multi-University Training Contest - Team 9】FFF at Valentine
[链接]http://acm.hdu.edu.cn/showproblem.php?pid=6165 [题意] 一张有向图,n个点,m条边,保证没有重边和自环.询问任意两个点能否满足任何一方能够到达另 ...
- C/C++函数指针声明
前天看APUE,看到signal的声明竟然是 void (*signal(int,void(*)(int)))(int); 初看下面,还真是看不出这是啥意思.道行太浅,仅仅能看到这样的函数指针 voi ...
- BZOJ 1007 HNOI 2008 水平可见直线 计算几何+栈
题目大意:给出一些笛卡尔系中的一些直线,问从(0,+∞)向下看时能看到哪些直线. 思路:半平面交可做,可是显然用不上. 类似于求凸包的思想,维护一个栈. 先将全部直线依照k值排序.然后挨个压进去,遇到 ...