计算机图形学(二)输出图元_3_画线算法_2_DDA算法
来源:互联网 发布:数据库日常维护 编辑:程序博客网 时间:2024/05/28 03:01
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的增量(或减量)。
DDA方法计算像素位置要比直接使用直线方程(3.1 )计算的速度更快。它利用光栅特性消除了直线方程(3.1 )中的乘法,而在x或Y方向使用合适的增量,从而沿线路径逐步得到各像素的位置。但在浮点增量的连续迭加中,取整误差的积累使得对于较长线段所计算的像素位置偏离实际线段。而且该过程中的取整操作和浮点运算仍然十分耗时。我们可以通过将增量m和1/m分离成整数和小数部分,从而使所有的计算都简化为整数操作来改善DDA算法的性能。在以后将讨论用整数步长计算1 /m增量的方法。在下一节中,我们考虑既能用于直线又能用于曲线的更通用的扫描线程序。
数字微分分析仪(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);elsesteps = 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增量的方法。在下一节中,我们考虑既能用于直线又能用于曲线的更通用的扫描线程序。
0 0
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
- 计算机图形学(二)输出图元_3_画线算法_3_Bresenham画线算法
- 计算机图形学(二)输出图元_3_画线算法_1_直线方程
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_3_椭圆生成算法
- 计算机图形学(二)输出图元_4_并行画线算法
- 计算机图形学(二)输出图元_10_多边形填充区_3_内-外测试
- 计算机图形学(二)输出图元_14_OpenGL像素阵列函数_3_光栅操作
- 计算机图形学(二)输出图元_18_显示列表_3_删除 OpenGL 显示表
- 计算机图形学(二)输出图元_2_ OpenGL画线函数
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_4_中点椭圆算法(上)
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_4_中点椭圆算法(下)
- 计算机图形学(二)输出图元_7_并行曲线算法
- 计算机图形学(二)输出图元
- 中点画线算法(计算机图形学)
- 计算机图形学之画线算法
- Bresenham画线算法(计算机图形学)
- SpringMVC 基础教程 helloworld
- VC6.0 OCX模拟http/post上传文本文件
- Maven的安装与配置
- drupal中hook_menu()使用
- 巩固C语言(四)-----冒泡排序 & 二分查找 & 单次循环对二维数组赋初值
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
- 识别独立安卓设备
- 堆和栈的区别(转过无数次的文章)
- 多线程
- Android API Guides---Menu Resource
- java反射调用private方法,获取修改private属性值
- 用VBA,MATLAB,C 从小到大生成质数表(源代码)
- spring配置datasource三种方式
- 后代选择器和子选择器