长春大学。
目录。1. 直线的bresenham算法原理1
1.1中点bresenham算法2
1.2改进的bresenham算法3
2. 程序运行结果9
3. 总结11
4. 参考资料12
5. 附录13
1. 直线的bresenham算法原理。
1.1中点bresenham算法。
给定直线的两个端点,可得到直线方程f(x,y)=y-kx-b=0且。
这时直线将平面分为三个区域:对于直线上的点,f(x,y)=0;对于直线上方的点,f(x,y)>0;对于直线下方的点,f(x,y)<0。
由bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,如下图所示。
假定0≤k≤1,由于x是最大位移方向,因此每次在x方向上加1,y方向上或加1,或加0.假设当前点是p,则下一个点在与中选一。以m表示与的中点,即。
又设q是理想直线与垂直直线x=+1的交点;显然,若m在q的下方,则离直线近,应取为下一个像素;否则取。
如前所述,直线方程为f(x,y)=y-kx-b。欲判断q在m上方还是下方,只要把m代入f(x,y),并判断它的符号即可。
构造判别式如下:
当<0时,m在直线下方,故应取。当》0时,则应取正右方的。当=0时,二者一样合适,可以随便取一个。我们约定取,即。
当<0时,取右上方像素,欲判断再下一个像素应取哪一个,应计算。
此时,的增量为1-k。
当≥0时,取正右方像素,要判断再下一个像素应取哪一个,应计算。
此时,的增量为-k。
下面计算的初值。显然,直线的第一个像素在直线上,因此相应的的初始值计算如下:
由于我们使用的只是的符号,因此可以用2代替来摆脱小数。此时算法只涉及整数运算。这样,0≤k≤1时,bresenham算法的绘图过程如下:
1 输入直线的两端点;
2 计算初始值,,;
3 绘制点(x,y)。判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),d更新为d+2-2;否则(x,y)更新为(x+1,y),d更新为d-2;
4 当直线没有画完时,重复步骤③,否则结束。
0≤k≤1时bresenham算法绘制直线的程序(仅包含整数运算)如下:
void midbresenhamline(int x0,int y0,int x1,int y1,int color)
int dx,dy,upincre,downincre,x,y;
if(x0>x1)
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
d=dx-2*dy;
upincre=2*dx-2*dy; downincre=-2*dy;
while(x<=x1)
putpixel(x,y,color);
x++;if(d<0)
else d+=downincre;
1.2改进bresenham算法。
虽然中点bresenham算法是一种效率很高的算法,但也还有改进的余地。当然,其基本原理仍然是每次在最大位移方向上走一步,二另一个方向上走步是不走步取决于误差项的判别。为叙述简单,同样定0≤k≤1的直线段(k=/)其端点为。
于是这样考虑该直线段的绘制:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,交点与网格线之间的误差为,根据确定该列网格中与此交点最近的像素点。当》0.
5时,直线更接近于像素点;当<0.5时,更接近于像素点;当=0.5时,与上述两像素点一样接近,约定取,即。
其中的关键在于误差项,它的初始值为0,每走一步有。
一旦y方向上走了一步,就把它减去1(此时可能出现负误差,这表明交点在所取网格点之下)。为方便计算,令。则当》0时,下一像素的y坐标增加1;否则,下一像素的y坐标不增,即有。
此时,的初值为-0.5,每走一步有。当》0时,将减1.
改进的bresenham算法还有一个缺点:在计算直线斜率与误差时,要用到小数与除法,不利于硬件实现。因此改进如下:
由于算法中只用到误差项的符号,于是可以用2e来替换e。这样就能获得整数bresenham算法且可避免除法。其算法步骤如下:
1 输入直线的两端点;
计算初始值,,e =,
绘制点(x,y)。
e更新为e+2。判断e的符号,若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2;否则(x,y)更新为(x+1,y);
当直线没有画完时,重复步骤③,否则结束。
0≤k≤1时改进的bresenham算法绘制直线的程序如下:
void bresenhamline(int x0,int y0,int x1,int y1,int color)
int x,y,dx,dy,e;
dx=x1-x0;
dy=y1-y0;
e=-dx;x=x0;y=y0;
while(x<=x1)
putpixel(x,y,color);
x++;e=e+2*dy;
if(e>0)
2. 程序运行结果。
3. 总结。
通过这次课程设计,使我们加深了对bresenham算法的了解和应用。增强了我们的实践能力,对以后的学习和工作有很大帮助。
参考资料(列出5个)
[1] 陆枫,何云峰编著。《计算机图形学基础(第2版)》
5. 附录:源程序**清单。
/ :interface of the ctestview class
#if !defined(afx_testview_h__a75fdcfb_621c_4e38_a154_c344803e6372__included_)
#define afx_testview_h__a75fdcfb_621c_4e38_a154_c344803e6372__included_
#if _msc_ver > 1000
#pragma once
#endif //msc_ver > 1000
#include ""对话框头文件。
#include ""
class ctestview : public cview
protected: /create from serialization only
ctestview();
declare_dyncreate(ctestview)
/ attributes
public:
ctestdoc* getdocument();
/ operations
public:
void mbline();bresenham函数。
void getmaxy();获得屏幕的最大x值函数。
void getmaxx();获得屏幕的最大y值函数。
void circlepoint(double x,double y);/八分法画圆子函数。
void mbcircle();bresenham算法。
/ overrides
// classwizard generated virtual function overrides
//}afx_virtual
/ implementation
public:
virtual ~ctestview();
#ifdef _debug
virtual void assertvalid() const;
virtual void dump(cdumpcontext& dc) const;
#endif
protected:
double x0, y0, x1, y1;//直线的起点和终点坐标。
int maxx,maxy;//屏幕x和y的最大坐标。
double r;//圆的半径。
/ generated message map functions
protected:
//}afx_msg
declare_message_map()
计算机图形学作业样本
长春大学。目录。1.直线的bresenham算法原理1 1.1中点bresenham算法2 1.2改进的bresenham算法3 2.程序运行结果9 3.总结11 4.参考资料12 5.附录13 1.直线的bresenham算法原理。1.1中点bresenham算法。给定直线的两个端点,可得到直线方...
计算机图形学作业
2010上半年计算机图形学第二次作业。一。填空题 40分,每空1分 1.在opengl里,实现平移 旋转 缩放的函数分别是 gltranslateglrotateglscale 要设置这些矩阵需在 模视变换 模式下,调用 glmatrixmode gl modelview 函数来实现。2.在open...
计算机图形学作业答案
第一章序论。第二章图形系统。1 什么是图像的分辨率?解答 在水平和垂直方向上每单位长度 如英寸 所包含的像素点的数目。2 计算在240像素 英寸下640 480图像的大小。解答 640 240 480 240 或者 8 3 2英寸。3 计算有512 512像素的2 2英寸图像的分辨率。解答 512 ...