计算机图形学作业样本

发布 2022-09-07 20:42:28 阅读 5242

长春大学。

目录。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 ...