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

Bresenham画线算法

本来在word中是有右下数的,一编辑在csdn中编辑就没有了。

   
               
   

Bresenham画线算法是由Bresenham提出的一种精确而有效的光栅线生成算法,该算法仅仅使用增量整数计算。另外Bresenham算法还可用于显示圆和其他曲线。图3.8和图3.9给出了绘制线段的屏幕局部。垂直轴表示扫描线位置,水平轴标识像素列。在这个例子中,我们以单位x间隔取样,并且需要确定每次取样时两个可能的像素位置中的哪一个更接近于线路径。从图3.8中的左端点开始,需要确定下一个取样像素位置是(11, 1l)还是(1 1, 12)。类似地,图3.9则给出了像素位置(50,50)为左端点的具有负斜率的线段。此时,需要确定下一个像素位置是((51,
50)还是((51, 49)。为了解决这些问题,Bresenham算法将对整型参数的符号进行检测,整型参数的值正比于两像素与实际线段之间的偏移。

为了说明Bresenham方法,首先考虑斜率小于1的直线的扫描转换过程,沿线路径的像素位置由以单位x间隔的取样来确定。从给定线段的左端点(xo,yo)开始,逐步处理每个后继列(x位置),并在其扫描线y值最接近线段的像素上绘出一点:图3.10显示了这个过程的第k步。假如已经决定要显示的像素在(xk ,yk),那么下一步需要确定在列Xk+1 = Xk+1上绘制哪个像素,是在位置(xk+1 , yk) ,还是位置(xk+1,yk+1)

在取样位置xk+1,我们使用dlower和dupper,来标识两个像素与数学上线路径的垂直偏移(参见图3.11),在像素列位置xk +1处的直线上的y坐标可计算为

那么

要确定两像素中哪一个更接近线路径,需要测试这两个像素偏移的差:

通过重新安排等式(3.13)可获得画线算法第k步的决策参数pk,从而仅使用整数进行计算。

设△y和△x分别为两端点的垂直和水平偏移量,令m = △y/△x,将决策参数定义为

pk的符号与dlower - dupper,的符号相同(因为例子中△x >0),参数c是一常量,其值为2△y + △x (2b-1),它与像素位置无关,且会在循环计算pk时被消除。假如yk处的像素比yk+ 1的像素更接近于线段(即dlower < dupper),那么参数pk是负的。此时,绘制下面的像素;反之,绘制上面的像素。

直线上的坐标会沿x或y方向的单位步长而变化。因此,可以利用递增整数运算得到后继的决策参数值。在k+1步,决策参数可以从等式(3.14)计算得出:

将上述方程减去等式(3.14),可以得到

但是xk+1 = xk+1,因而得到

其中,yk+1-yk取0或1,取决于参数pk的符号。

决策参数的递归运算在线段的坐标端点开始的每个整数x位置进行,起始像素位置(xo,yo)的第一个参数po通过等式(3.14)及m = △y/△x计算得出

我们可以将正斜率小于1的线段的Bresenham画线算法概括为以下步骤。常遗2△y和2△y-2△x对每条进行扫描转换的直线只计算一次,因此该系统仅进行这两个常量之间的整数加减法。

:

|m| < 1时的Bresenham画线算法

1.输人线段的两个端点,并将左端点存储在(xo,yo)中;

2.将(xo,yo)装入帧缓存,画出第一个点;

3.计算常量△x 、△y 、2△y和2△y-2△x,并得到决策参数的第一个值:

4.从k=0开始,在沿线路径的每个xk处,进行下列检测:

如果pk<0,下一个要绘制的点是(xk+1,yk+1),并且

5.重复步骤4, xk-1

例3.1  Bresenham画线算法

为了演示上述算法,我们绘制这样一条线段:端点为(20, 10)和(30,18)该线段的斜率为0.8且

那么初始决策参数数的值为

计算后续决策参数的增量为

图3.12中给出了沿这条线路径生成的像素点。

下列程序中给出了斜率为0 < m < 1.0的Bresenham画线算法的实现。首先将线段的端点像素位置输入程序,然后从左端点到右端点绘制像素。

#include<stdlib.h>
#include<math.h>

/*Bresenham line-drawing procedure for |m|<1.0. */
void lineBres(int x0,int y0,int xEnd,int yEnd)
{
    int dx = fabs(xEnd - x0),dy = fabs(yEnd - y0);
    int p = 2*dy - dx;
    int twoDy = 2*dy, twoDyMinusDx = 2*(dy - dx);
    int x,y;

/*Determine which endpoint to use as start position.*/
if(x0 > xEnd){
    x = xEnd;
    y = yEnd;
    xEnd = x0;
}
else{
    x = x0;
    y = y0;
}
setPixel(x,y);
while(x<xEnd){
  x++;
if(p < 0)
  p += twoDy;
else{
  y++;
  p += twoDyMinusDx;
}
  setPixel(x,y);
}

}

通过考虑xy平面各种八分和四分区域间的对称性,Bresenham算法对任意斜率的线段具有通用性。对于斜率为正值且大于1.0的线段,只要交换x和y方向的规则,即沿y方向以单位步长移动并计算最接近线路径的连续x值。当然,也可以改变程序,使之能从任何端点开始绘制像素,假如正斜率线段的初始位置是右端点,那么在从右至左的步进中,x和y都将递减。为了确定无论从任何端点开始都能绘制相同的像素,当候选像素相对于线段的两个垂直偏移相等时dlower  =
 dupper,我们总是选择其中较高(或较低)的像素。对于绘制负斜率的线段,除非一个坐标递减而另一个递增,否则程序是类似的。最后,可以分别处理下列特殊情况:水平线(△y = 0)、垂直线(△x = 0)和对角线|△x| = |△y|,它们都可直接装入帧缓存而无需进行画线算法处理。

时间: 2024-08-09 20:12:37

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

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

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

计算机图形学(二)输出图元_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之间的任意实数,所以计算

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

计算机图形学(二)输出图元_20_章节总结(上)

输出图元章节总结 发了好久第2章终于结束了,本章中讨论的输出图元为使用直线.曲线.填充区域.单元阵列样式和文本构造图形提供了基本的工具.我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元. 用于沿线段路径绘制像素的三种方法是DDA算法.Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的.沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成.任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现. 圆和椭圆采用中点算

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

计算机图形学和OpenGL(二)坐标系和绘制点线函数

这节开始前我们先了解一下图元的概念.图形软件包中用来描述各种图形元素的函数称为图形输出原语,也称图元(primitive).而描述对象几何要素的输出图元一般称为几何图元.点和线是最简单的几何图元,本节就会简单介绍点和线段的绘制方法. 一.坐标系统. 坐标系统一般分为屏幕坐标和OpenGL中的绘图坐标. 在上一节中我们简单的写了个示例程序,程序中介绍了gluOrtho2D命令.我们可以利用该命令设定一个二维笛卡尔坐标系.该函数的四个变量制定的是显示图形x和y坐标范围.所以我们可以使用下面代码制定一

计算机图形学(三种画线算法)

第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示图形,需要发展一套与之相适应的算法. 3.研究内容: 1>直线段的扫描转换算法 2>多边形的扫描转换与区域填充算法 3>裁剪算法 4>反走样算法 5>消隐算法 一.直线段的扫描转换算法 1.为了显示一条直线,就在光栅显示器上用离散的像素点逼近直线,所以我们就要知道这些像素点的坐标

计算机图形学DDA画线法+中点画线法+Bresenham画线法

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件

上一篇文章我们讲述MFC绘制图形的基本函数,包括绘制直线.绘制矩形.绘制椭圆及绘制文字,同时通过绕圆旋转和矩形平移简单的理解了图形学知识.这篇文章我将介绍鼠标响应和键盘响应,通过这些事件让学生实现一个类似画图的简单软件,同时充分发挥学生想象,自己创作东西.        前文:       [计算机图形学课程]一.MFC基本绘图函数使用方法 一. MFC工程创建及鼠标响应 新建一个MFC 单文档的应用程序"MousePic". 然后,选择"View(视图)"->