实验1:Bresenham算法

合集下载

实验报告文档

实验报告文档
accept=TRUE;
done=TRUE;
}else if((code0.all&code1.all)!=0){
done=TRUE;
}else{
if(code0.all!=0){
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);
printf("x = %d , y = %d \n",x,y);
对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。
1、分区编码
延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代 码值如图中所示。
2、判别
根据C1和C2的具体值,可以有三种情况:
(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。
(3)不属于上面两种情况,均需要求交点。
3、求交点
假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。
实验
类型
设计型
综合型
创新型








1.实验内容

Bresenham算法画圆并填充实验报告 09009202 陶园

Bresenham算法画圆并填充实验报告 09009202 陶园

计算机图形学实验报告实验二Bresenham算法画圆并填充学号:09009202 姓名:陶园成绩:东南大学计算机科学与工程学院二〇一一年十一月一.实验题目Bresenham算法画圆并填充二.算法思想1.首先,真实的线条是连续的,但是计算机中的线条是离散的,是由很多点组成的,那么画线的重点就是如何高效地找到这些离散的点来更好地画出想要的图形。

2.实验要求用Bresenham算法实现画圆。

那么首先先要了解Bresenham算法是一种什么算法。

经过查阅,我找到Bresenham直线算法和画圆算法。

直线是圆的基础。

Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。

这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。

是计算机图形学中最先发展出来的算法。

Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。

为了简便起见,考虑一个圆心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。

Bresenham直线算法流程图圆的八对称性所以,只需要知道圆上的一个点的坐标 (x, y) ,利用八对称性,就能得到另外七个对称点的坐标。

和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆。

Bresenham画圆算法的流程图三.源代码#include "stdlib.h"#include "math.h"#include <gl/glut.h>//按坐标画点void draw(GLint xCoord, GLint yCoord){glBegin(GL_POINTS);//以点的形式glVertex2i(xCoord, yCoord);//在(xCoord, yCoord)坐标下画点glEnd();glFlush();//强制刷新}void Circle(GLint x,GLint y){int a=abs(x);//将x的绝对值赋给aint b=abs(y);//将y的绝对值赋给bint c=a*-1;//使c=a的相反数int d=b*-1;//使d=b的相反数draw(x, y); draw(y, x);draw(-x, y); draw(y, -x);draw(x, -y); draw(-y, x);draw (-x, -y); draw(-y, -x);//按照圆的对称性以圆心为对称点将四个象限的圆周画出for(int i=c;i<=a;i++){for(int j=d;j<=b;j++){draw(i,j);}}//以a,b,c,d为边界用点填充该圆}//主函数void BresenhamCircle(GLint r){int d, d1, d2, direct;GLint x,y;x=0;y=r;d = 2*(1-r);while(y>=0){Circle(x,y);if(d < 0){d1 = 2* (d+ y) -1;if(d1 <=0)direct = 1;elsedirect = 2;}else{if( d > 0){d2 = 2*(d-x)-1;if(d2 <= 0)direct = 2;elsedirect = 3;}elsedirect = 2;}switch(direct){case 1:x++;d+=2*x + 1;break;case 2:x++; y--;d+=2*(x-y+1) + 1;break;case 3:y--;d+=-2*y + 1;break;}}}void RenderScene(void){BresenhamCircle(50);//主函数调用}//当窗口大小改变时由GLUT函数调用void ChangeSize(GLsizei width, GLsizei Height){GLfloat aspectRatio;if (Height == 0){Height = 1;}glViewport(0, 0, width, Height);//指定视口矩形左下角glMatrixMode(GL_PROJECTION);//指定当前矩阵,对投影矩阵应用随后的矩阵操glLoadIdentity();// 装载单位矩阵aspectRatio = (GLfloat)width / (GLfloat) Height;if (width <= Height){glOrtho(-100.0, 100.0, -100.0 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);}else{glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);}glMatrixMode(GL_MODELVIEW);//指定当前矩阵,对模型视景矩阵堆栈应用随后的矩阵操作glLoadIdentity();// 装载单位矩阵}//主程序入口void main(void){glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置初始显示模式,指定单缓存窗口,指定RGB 颜色模式的窗口glutCreateWindow("圆");//创建窗口,窗口名称为“圆”glutDisplayFunc(RenderScene);//进行画图glutReshapeFunc(ChangeSize);//重画回调函数glutMainLoop();//进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环}四.结果截屏五.出现问题及解决方案1.对于如何填充整个圆一开始没有好的方法,后来决定每画一个点,就将该横坐标的所有纵坐标点画出,从下到上,整个填充圆从中间到两边形成。

Bresenham快速画直线算法_20140523

Bresenham快速画直线算法_20140523

Bresenham快速画直线算法一、算法原理简介:算法原理的详细描述及部分实现可参考:http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html假设以(x, y)为绘制起点,一般情况下的直观想法是先求m = dy /dx(即x每增加1,y的增量),然后逐步递增x, 设新的点为x1 = x + j, 则y1 = round(y + j * m)。

可以看到,这个过程涉及大量的浮点运算,效率上是比较低的(特别是在嵌入式应用中,DSP可以一周期内完成2次乘法,一次浮点却要上百个周期)。

下面,我们来看一下Bresenham算法,如Fig. 1,(x, y +ε)的下一个点为(x, y + ε + m),这里ε为累加误差。

可以看出,当ε+m < 0.5时,绘制(x + 1, y)点,否则绘制(x + 1, y + 1)点。

每次绘制后,ε将更新为新值:ε = ε + m ,如果(ε + m) <0.5 (或表示为2*(ε + m) < 1)ε = ε + m – 1, 其他情况将上述公式都乘以dx, 并将ε*dx用新符号ξ表示,可得ξ = ξ + dy, 如果2*(ξ + dy) < dxξ = ξ + dy – dx, 其他情况可以看到,此时运算已经全变为整数了。

以下为算法的伪代码及实例:起点:(x1,y1)=(0,0),终点:(x2,y2)=(5,3)ξ← 0, y ← y1For x ← x1 to x2 doPlot Point at (x, y)If (2(ξ + dy) < dx)ξ←ξ + dy; y←y;Elsey ← y + 1,ξ←ξ + dy – dxEnd Ifx ←x+1;End For二、画图步骤如下:起点:(x1,y1)=(0,0),终点:(x2,y2)=(5,3); dx=5; dy=3;ξ=0;第一步:(1)ξ=0;x=x1=0; y=y1=0; 画点(x1,y1)=(0,0);(2)2(ξ + dy)= 2(0 + 3)=6>dx=5; 因此:y2=y+1=1; ξ=ξ+dy–dx=0+3-5=-2;X2=x1+1=1;第二步:(1)ξ=-2;x=x2=1; y=y2=1; 画点(x2,y2)=(1,1);(2)2(ξ + dy)= 2(-2 + 3)=2<dx=5; 因此:y3=y=1; ξ=ξ+dy=-2+3=1; X3=x+1=2;第三步:(1)ξ=1;x=x3=2; y=y3=1; 画点(x3,y3)=(2,1);(2)2(ξ + dy)= 2(1 + 3)=8>dx=5; 因此:y4=y+1=2; ξ=ξ+dy-dx=1+3-5=-1; X4=x+1=3;第四步:(1)ξ=-1;x=x4=3 y=y4=2; 画点(x4,y4)=(3,2);(2)2(ξ + dy)= 2(-1+ 3)=4<dx=5; 因此:y5=y=2; ξ=ξ+dy=-1+3=2; X5=x+1=4;第五步:(1)ξ=2;x=x5=4; y=y5=2; 画点(x5,y5)=(4,2);(2)2(ξ + dy)= 2(2 + 3)=10>dx=5; 因此:y6=y+1=3; ξ=ξ+dy-dx=2+3-5=0; X6=x+1=5;第六步:(1)ξ=0;x=x6=5; y=y6=3; 画点(x6,y6)=(5,3);x1x2x3x4x5x6三、算法的注意点:在实际应用中,我们会发现,当dy > dx或出现Fig.2 右图情况时时,便得不到想要的结果,这是由于我们只考虑dx > dy,且x, y的增量均为正的情况所致。

bresenham算法实现直线段插值函数

bresenham算法实现直线段插值函数

在计算机图形学中,Bresenham算法是一种用于在离散坐标系上绘制直线段的算法。

它是一种高效的算法,能够准确地计算出直线段上的所有像素点,使得在计算机屏幕上显示出直线段来。

Bresenham算法的实现可以帮助我们更好地理解画线原理,并且在计算机视觉、图像处理等领域有着广泛的应用。

1. Bresenham算法的原理Bresenham算法是通过计算直线段的斜率来确定每个像素点的位置。

具体来说,它利用了直线的对称性和整数的特性,通过计算像素点与真实直线的距离来判断下一个像素点应该取的位置。

这样可以避免使用浮点运算,使得算法更加高效。

2. 实现Bresenham算法的关键步骤在实现Bresenham算法时,需要考虑以下几个关键步骤:- 初始化各个变量,包括起始点(x0, y0)和终点(x1, y1),以及斜率的计算值,例如dx和dy。

- 根据斜率的正负情况,确定每个像素点的增量步长,以便在遍历过程中准确计算出像素点来。

- 利用对称性和整数特性,进行迭代计算,逐步确定直线段上的所有像素点的位置。

3. Bresenham算法的优缺点Bresenham算法作为一种离散直线段插值算法,具有以下几个优点:- 算法简单高效,节省存储空间和运算时间。

- 可以高效地解决像素化显示问题,避免了浮点运算的复杂性。

- 在硬件上实现时,只需少量的资源就能完成计算,适合嵌入式系统和图形处理器。

然而,Bresenham算法也存在一些缺点,比如对于曲线的绘制就不太奏效,因为它是基于直线段的形式来处理的。

4. 我对Bresenham算法的理解在我看来,Bresenham算法是一种经典的离散直线段插值算法,其思想简洁高效。

它通过逐步迭代的方式,计算出直线段上的所有像素点位置,使得在计算机屏幕上显示出直线段来更加精确。

这种算法的实现可以帮助我们更好地理解画线的原理,对于理解计算机图形学和计算机视觉都有着重要的意义。

总结起来,Bresenham算法作为一种高效的离散直线段插值算法,具有着重要的理论和实际价值。

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

画圆形(Bresenham算法)

画圆形(Bresenham算法)

画圆形(Bresenham算法)下⾯先简要介绍常⽤的画圆算法(Bresenham算法),然后再具体阐述笔者对该算法的改进。

⼀个圆,如果画出了圆上的某⼀点,那么可以利⽤对称性计算余下的七段圆弧:Plot(x,y),Plot(y,x),Plot(y,-x),Plot(x,-y),Plot(-x,-y),Plot(-y,-x),Plot(-y,x),Plot(-x,y)。

1、Bresenham 画圆算法。

Bresenham算法的主要思想是:以坐标原点(0,0)为圆⼼的圆可以通过0度到45°的弧计算得到,即x从0增加到半径,然后利⽤对称性计算余下的七段圆弧。

当x从0增加到时,y从R递减到。

设圆的半径为R,则圆的⽅程为:f(x,y)=(x+1)2+y2-R2=0 (1)假设当前列(x=xi列)中最接近圆弧的像素已经取为P(xi,yi),根据第⼆卦限1/8圆的⾛向,下⼀列(x=xi+1列)中最接近圆弧的像素只能在P的正右⽅点H(xi+1,yi)或右下⽅点L(xi+1,yi-1)中选择,如图1所⽰。

Bresenham画圆算法采⽤点T(x,y)到圆⼼的距离平⽅与半径平⽅之差D(T)作为选择标准,即D(T)=(x+1)2+y2-R2 (2)通过⽐较H、L两点各⾃对实圆弧上点的距离⼤⼩,即根据误差⼤⼩来选取,具有最⼩误差的点为绘制点。

根据公式(2)得:对H(xi+1,yi)点有:D(H)=(xi+1)2+yi2-R2;对L(xi+1,yi-1)点有:D(L)=(xi+1)2+(yi-1)2-R2;根据Bresenham画圆算法,则选择的标准是:如果|D(H)|<|D(L)|,那么下⼀点选取H(xi+1,yi);如果|D(H)|>|D(L)|,那么下⼀点选取L(xi+1,yi-1);如果|D(H)|=|D(L)|,那么下⼀点可以取L(xi+1,yi-1),也可以选取H(xi+1,yi),我们约定选取H(xi+1,yi)。

圆绘制算法实验报告

圆绘制算法实验报告

一、实验背景圆是几何图形中最基本的图形之一,在计算机图形学中,绘制圆是图形处理的基础。

本实验旨在通过实现圆的绘制算法,加深对计算机图形学基本概念和方法的理解,提高编程能力。

二、实验目的1. 掌握圆的基本绘制方法;2. 熟悉Bresenham算法和中点算法的原理;3. 理解并实现圆的绘制算法;4. 分析不同算法的优缺点,提高算法选择能力。

三、实验内容1. Bresenham算法画圆2. 中点算法画圆四、实验原理1. Bresenham算法画圆Bresenham算法是一种光栅扫描算法,用于绘制圆、椭圆、直线等图形。

该算法的基本思想是:根据圆的几何特性,计算出每个像素点是否应该被绘制。

对于圆的绘制,我们可以利用以下公式:\[ x^2 + y^2 = r^2 \]其中,\( x \) 和 \( y \) 分别表示圆上一点的横纵坐标,\( r \) 表示圆的半径。

Bresenham算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 2x - y \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。

2. 中点算法画圆中点算法是一种基于Bresenham算法的改进算法,它利用圆的对称性,减少了计算量。

中点算法的步骤如下:(1)初始化参数:设置起始点(0, r),终止点(r, 0),步长 \( p \);(2)计算判别式 \( p = 1 - 2x \);(3)根据判别式的值,更新 \( x \) 和 \( y \) 的值;(4)重复步骤(2)和(3),直到 \( x = y \);(5)绘制圆。

五、实验步骤1. 创建一个OpenGL窗口,用于显示绘制的圆;2. 使用Bresenham算法绘制圆;3. 使用中点算法绘制圆;4. 比较两种算法的绘制效果,分析优缺点;5. 编写代码实现两种算法,并进行测试。

计算机图形学实验数值微分(DDA)法中点画线法Bresenham算法

计算机图形学实验数值微分(DDA)法中点画线法Bresenham算法

计算机图形学实验数值微分(DDA)法中点画线法Bresenham算法实验名称数值微分(DDA)法、中点画线法、Breenham算法实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:1.了解数值微分(DDA)法、中点画线法、Breenham算法的基本思想;2.掌握数值微分(DDA)法、中点画线法、Breenham算法的基本步骤;二、实验原理:1.数值微分(DDA)法y1y0k已知过端点P00,y(某的直线段L:y=k某+b,直线斜率为(某0),P11,y1)某1某0某从某的左端点0开始,向某右端点步进。

步长=1(个象素),计算相应的y坐标y=k某+b;取象素点(某,round(y))作为当前点的坐标。

2.中点画线法当前象素点为(某p,yp)下一个象素点为P1或P2设M=(某p+1,yp+0.5),为p1与p2之中点,Q为理想直线与某=某p+1垂线的交点。

将Q与M的y坐标进行比较。

当M在Q的下方,则P2应为下一个象素点;当M在Q的上方,应取P1为下一点。

构造判别式:d=F(M)=F(某p+1,yp+0.5)=a(某p+1)+b(yp+0.5)+c,其中a=y0-y1,b=某1-某0,c=某0y1-某1y0。

当d<0,M在L(Q点)下方,取右上方P2为下一个象素;当d>0,M在L(Q点)上方,取右方P1为下一个象素;当d=0,选P1或P2均可,约定取P1为下一个象素;但这样做,每一个象素的计算量是4个加法,两个乘法。

d是某p,yp的线性函数,因此可采用增量计算,提高运算效率。

若当前象素处于d0情况,则取正右方象素P1(某p+1,yp),要判下一个象素位置,应计算d1=F(某p+2,yp+0.5)=a(某p+2)+b(yp+0.5)=d+a;增量为a。

若d<0时,则取右上方象素P2(某p+1,yp+1)。

要判断再下一象素,则要计算d2=F(某p+2,yp+1.5)=a(某p+2)+b(yp+1.5)+c=d+a+b;增量为a+b。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验1:Bresenham算法
实验题目:
Bresenham直线扫描算法的实现
实验内容及要求:
实现绘制各种情况直线的Bresenham算法,并将实现的算法应用于任意多边形的绘制,要求多边形的顶点由键盘输入或鼠标拾取,绘制的多边形顶点要准确,图形应该封闭。

要求掌握Bresenham算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

实验原理:
1、Bresenham基本算法:
过各行各列象素中心构造一组虚拟网格线。

按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。

设直线方程为:
其中k=dy/dx。

因为直线的起始点在象素中心,所以误差项d的初值d0=0。

X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。

一旦d≥1,
就把它减去1,这样保证d在0、1之间。

当d≥0.5时,最接近于当前象素的右上方象素()
当d<0.5时,更接近于右方象素()。

为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。

当e≥0时,取当前象素(x i,y i)的右上方象素();
而当e<0时,更接近于右方象素()。

可以改用整数以避免除法。

d d
d
d
k
y
x
x
k
y
y
i
i
i
i
i
+
=
-
+
=
+
+
)
(
1
1
1
1
,
+
+i
i
y
x
i
i
y
x,
1+
1
1
,
+
+i
i
y
x
i
i
y
x,
1+
Bresenham算法代码如下:
void Bresenhamline(int x1, int y1, int x2, int
y2,CDC *pDC)
{ //对于所有直线均按照从左至右的方向绘制
int x,y,d,dx,dy,right,rightleft;
if(x1>x2){
int tempx,tempy;
tempx=x1;x1=x2;x2=tempx;
tempy=y1;y1=y2;y2=tempy;
}
//根据斜率的情况不同而绘制
if(y1==y2){//斜率为0的情况
for(x=x1;x<=x2;x++)
pDC->SetPixel(x,y1,2);
}
else if(x1==x2){//直线为垂直的情况
if(y1>y2){ //使直线按从下往上画
int tempy=y1;
y1=y2;y2=tempy;
}
for(y=y1;y<=y2;y++)
pDC->SetPixel(x1,y,2);
}
else{
dy=y2-y1;
dx=x2-x1;
if(abs(dy)==abs(dx)){////斜率为1或-1时
x=x1;y=y1;
if(dy<0){//斜率为1
for(;y>=y2;y--){
x++;
pDC->SetPixel(x,y,2);
}
}//斜率为1
else{//斜率为-1
for(;y<=y2;y++){
x++;
pDC->SetPixel(x,y,2);
}
}//斜率为-1
}
else if(abs(dy)<abs(dx)){//斜率的绝对值小于1时
if(dy>0&&dx>0){//斜率为正时
right=-2*dy;
rightleft=2*dx-2*dy;
d=dx-2*dy;
x=x1;y=y1;
while(x<=x2){
pDC->SetPixel(x,y,2);
x++;
if(d<0){
y++;
d=d+rightleft;
}else{
d=d+right;
}
}
}//斜率为正时
else {//斜率为负时
right=2*dy;
rightleft=2*dy-2*dx;
d=2*dy-dx;
x=x1;y=y1;
while(x<=x2){
pDC->SetPixel(x,y,2);
x++;
if(d<0){
y++;
d=d+rightleft;
}else{ d=d+right;
}
}
}//斜率为负时
}//斜率的绝对值小于1时 else{////斜率的绝对值大于1时 if(dy>0&&dx>0){//斜率为正时 right=2*dx; rightleft=2*dx-2*dy; d=2*dx-dy; x=x1;y=y1; while(y<=y2){ pDC->SetPixel(x,y,2); y++; if(d>=0){ x++;
d=d+rightleft;
}else{ d=d+right;
}
}
}//斜率为正时
else{//斜率为负时 right=-2*dx; rightleft=-2*dx-2*dy; d=-2*dx-dy; x=x1;y=y1; while(y>=y2){
pDC->SetPixel(x,y,2);
y--; if(d<0){
x++;
d=d+rightleft;
}else{ d=d+right;
}
}
}//斜率为负时
}//斜率的绝对值大于1时
}//斜率的所有情况
}
void CBresenhamView::OnDraw(CDC* pDC) {
CBresenhamDoc* pDoc = GetDocument(); ASSERT_V ALID(pDoc);
Bresenhamline(10,10,500,50,pDC);
// TODO: add draw code for native data here }
2、实验步骤: 1) 新建工程文件
2) 打开
下resenhamView.cpp
3) 在// CBresenhamView drawing 代码后
添加以上代码。

4)运行成功
更改绘制坐标Bresenhamline(10,10,500,50,pDC) 可以改变直线斜率,还能通过直线的连接绘制多边形。

如:
//绘制多边形
Bresenhamline(10,10,500,10,pDC);
Bresenhamline(10,10,10,100,pDC);
Bresenhamline(10,100,600,120,pDC);
Bresenhamline(500,10,600,120,pDC);
实验总结:
Bresenham算法是一种很方便很实用很简单的算法,它对任意斜率的直线段具有通用性。

对于斜率为正且大于1的直线段,只需交换x和y之间的规则。

对于负斜率,除了一个坐标递减而另一个坐标递增外,其余的程序是类似的。

另外,水平、垂直和斜率的绝对值为1的直线可以直接装入帧缓冲储存器而无须进行画线算法处理。

相关文档
最新文档