计算机图形学(二)输出图元_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增量的方法。在下一节中,我们考虑既能用于直线又能用于曲线的更通用的扫描线程序。

时间: 2024-10-10 22:19:23

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

计算机图形学(二)输出图元_3_画线算法_1_直线方程

画线算法 场景中的直线段由其两端点的坐标位置来定义.要在光栅监视器上显示一线段,图形系统必须先将两端点投影到整数屏幕坐标,并确定离两端点间的直线路径最近的像素位置.接下来将颜色值装人帧缓存相应的像素坐标处.视频控制器从帧缓存读出写入的颜色值并绘制屏幕像素.这一过程将一线段数字化为一组离散的整数位置.一般而言,这些位置是实际线路径的近似.例如,计算出的线位置(10.48, 20.51)转换为像素位置(10, 21).坐标值舍入到整数,引起除水平和垂直以外所有线段的阶梯效应("锯齿形"),

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

Bresenham画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                         Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算.另外Bresenham算法还可用于显示圆和其他曲线.图3.8和图3.9给出了绘制线段的屏幕局部.垂直轴表示扫描线位置,水平轴标识像素列.在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径.从图3.

计算机图形学之数字微分分析画线算法

现代计算机绘制,我们程序员经常会碰到画图的编程问题,并且现在的画图的API很多,换句话说,图形API非常丰富,从TC的graphic到Windows的GDI/GDI+,以及跨平台的开放标准OpenGL.这些API都提供了基本的绘图函数,如绘制直线,圆以及椭圆之类的. 画直线的算法也叫做直线的光栅化,我们知道,我们的计算机显示的屏幕实际上是一个个的像素组成的,绘图算法就是要在逼近直线的像素上进行着色输出. 是选择直线两端点变化较大的一个方向,从起始点开始,逐次递推得到着色的结果. DDA算法的流程

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

通过获取窗口句柄,然后获取窗口DC,然后画图 1 #include <Windows.h> 2 #include <stdio.h> 3 4 //桌面画线 5 void drawLine() 6 { 7 //获取控制台窗口 8 //HWND hwnd = GetConsoleWindow(); 9 //获取输出 10 //HDC hdc = GetDC(hwnd); 11 //获取桌面窗口 12 HWND hwnd = GetDesktopWindow(); 13 //获取输出 1

计算机图形学第四章练习——画饼图

计算机图形学第四章后边示例代码里有一段画饼图的练习,画出来是这样的 中间有一段中心画圆法未实现,搜集了网上资料补全并执行了这段代码,作为openGL的学习练习 #include <GL/glut.h> #include <stdlib.h> #include <math.h> GLsizei winWidth = 400, winHeight = 300; const GLdouble twoPi = 6.283185; class scrPt { public: GL

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

引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚至看了不少cg的语法之后,我们还是很迷茫,UNITY_MATRIX_MVP到底是个什么矩阵?它和v.vertex相乘出来的又是什么玩意?当这些问题困扰我们很久之后,我们才发现,原来我们是站在浮沙上筑高台,根基都没有打牢当然不可能盖得起高楼大厦了. 那根基是什么呢?大牛曰,计算机图形学. shader

计算机图形学(二)输出图元_2_ OpenGL画线函数

 OpenGL画线函数 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义.在OpenGL中,和选择一个点位置一样,我们使用glVertex函数选择单个端点的坐标位置.我们使用一对glBegin/g1End来引入一串端点位置.有三个OpenGL符号常量可用于指定如何把这一串端点位置连接成一组直线段.默认情况下,每一符号常量显示白色实线. 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段.通常,这会导致一组未连接的线段,除非重复某些坐标位置.

计算机图形学(二)输出图元_4_并行画线算法

并行画线算法 本来在word中是有右下数的,一编辑在csdn中编辑就没有了.                            上面讨论过的线段生成算法顺序地确定像素位置.而利用并行计算机,则可通过将计算分割到可用的多个处理器中来得到线段的像素位置.分割问题的一种解决方法是将现有的顺序算法放到多个处理器上.我们也可以寻找其他处理办法,从而使像素位置能以并行方式有效地计算.在设计并行算法中,重要的是要考虑平衡可用处理器间的处理负载. 给定np个处理器,我们可以通过把线段分割成np个子段,并在每

计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法

OpenGL曲线函数 生成圆和椭圆等基本曲线的函数并未作为图元功能包含在OpenGL核心库中.但该库包含了显示Bezier样条的功能,该曲线是由一组离散点定义的多项式.OpenGL实用库(GLU)中包含有球面和柱面等三维曲面函数以及生成B样条的函数,它是包含简化Bezier曲线的样条曲线的总集.我们可以使用有理B样条显示圆.椭圆和其他二维曲线.此外,OpenGL实用工具包(GLUT)中还有可以用来显示某些三维曲面(如球面.锥面和其他形体)的函数.然而,所有这些函数比本章中介绍的基本图元应用得更多