《计算机图形学》实验报告模板(圆的扫描转换)

合集下载

计算机图形学实验报告模板

计算机图形学实验报告模板

巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。

由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。

DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。

特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。

同时也熟练运用OpenGL基本的绘图函数。

p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。

特别是对于DDA,Bresenham和画圆算法。

其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。

而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。

而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。

而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类似。

另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。

计算机图形学--全部实验的实验报告

计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。

二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。

任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。

实验2 圆的扫描转换

实验2  圆的扫描转换

实验2 圆的扫描转换一、实验要求基本要求用Bresenham画圆算法实现圆的绘制。

提高要求用Bresenhamg画圆算法实现奥运会五环标志的绘制。

二、实验报告对下列内容逐项填写,适当添加空白页。

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

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

为什么只计算八分圆周上的点就可以了。

和直线算法类似,圆也有一个“八对称性”。

显然,我们只需要知道了圆上的一个点的坐标 (x, y) ,利用八对称性,我们马上就能得到另外七个对称点的坐标。

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

2.程序流程图2.源程序清单和结果画圆的程序int d,x,y,x0,y0,r=100;d=3-2*r; x=0; y=r; x0=200; y0=200; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB(0,0,0)); if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB(0,0,0)); pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,0)); pDC->SetPixel(-x+x0,y+y0,RGB(0,0,0)); pDC->SetPixel(-y+x0,x+y0,RGB(0,0,0)); pDC->SetPixel(-y+x0,-x+y0,RGB(0,0,0)); pDC->SetPixel(y+x0,x+y0,RGB(0,0,0)); pDC->SetPixel(y+x0,-x+y0,RGB(0,0,0)); }五环程序int d,x,y,x0,y0,r=53;d=3-2*r; x=0; y=r; x0=200; y0=200; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));pDC->SetPixel(-y+x0,x+y0,RGB(0,0,255));pDC->SetPixel(-y+x0,-x+y0,RGB(0,0,255));pDC->SetPixel(y+x0,x+y0,RGB(0,0,255));pDC->SetPixel(y+x0,-x+y0,RGB(0,0,255));}d=3-2*r; x=0; y=r; x0=320; y0=200; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB(0,0,0));if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB(0,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(0,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(0,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(0,0,0));pDC->SetPixel(y+x0,x+y0,RGB(0,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(0,0,0));}d=3-2*r; x=0; y=r; x0=440; y0=200; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));}d=3-2*r; x=0; y=r; x0=260; y0=260; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB(255,255,0));if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB(255,255,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,255,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,255,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,255,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,255,0));pDC->SetPixel(y+x0,x+y0,RGB(255,255,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,255,0));}d=3-2*r; x=0; y=r; x0=380; y0=260; //(x0,y0)圆心坐标while(y>=x){ pDC->SetPixel(x+x0,y+y0,RGB( 0,255,0));if(d<0)d=d+4*x+6;elsed=d+4*x-4*y+10,y--;x++;pDC->SetPixel(x+x0,-y+y0,RGB( 0,255,0));pDC->SetPixel(-x+x0,-y+y0,RGB( 0,255,0));pDC->SetPixel(-x+x0,y+y0,RGB( 0,255,0));pDC->SetPixel(-y+x0,x+y0,RGB( 0,255,0));pDC->SetPixel(-y+x0,-x+y0,RGB( 0,255,0));pDC->SetPixel(y+x0,x+y0,RGB( 0,255,0));pDC->SetPixel(y+x0,-x+y0,RGB( 0,255,0));}4.实验总结Bresenham确实是一种很快速的的算法。

计算机图形学——圆的扫描转换(基本光栅图形算法)

计算机图形学——圆的扫描转换(基本光栅图形算法)

计算机图形学——圆的扫描转换(基本光栅图形算法)与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。

本篇博客将讨论圆弧⽣成的3个主要算法,正负法、Bresenham 法和圆的多边形迫近法,在介绍算法时,只考虑圆⼼在原点,半径为R的情况。

⼀、正负法1、基本原理假设已选取Pi-1为第i-1个像素,则如果Pi-1在圆内,就要向圆外⽅向⾛⼀步;若已在圆外就要向圆内⾛⼀步。

总之,尽量贴近圆的轮廓线。

2、正负法的具体实现1)圆的表⽰:设圆的圆⼼为(0,0),半径为R,则圆的⽅程为:F(x,y)=x2+y2–R2=0当点(x,y)在圆内时,F(x,y)<0。

当点(x,y)在圆外时,F(x,y)>0。

2)实现步骤第1步:x0=0,y0=R第2步:求得Pi(x i,y i)后找点P i+1的原则为:当P i在圆内时(F(xi,yi)≤0),要向右⾛⼀步得P i+1,这是向圆外⽅向⾛去。

取x i+1= x i+1, y i+1= y i当P i在圆外时(F(xi,yi)>0),要向下⾛⼀步得P i+1,这是向圆内⽅向⾛去,取x i+1= x i, y i+1= y i-1⽤来表⽰圆弧的点均在圆弧附近且 F(xi, yi)时正时负假设已经得到点(x i, y i),则容易算出F(x i, y i),即确定了下⼀个点(x i+1, y i+1),则如何计算F(x i+1, y i+1),以确定下下个点(x i+2, y i+2)?分为两种情况:右⾛⼀步后:x i+1=x i+1,y i+1=y i,此时:F(x i+1, y i+1)=x i+12+y i2-R2=x i2+y i2-R2+2x i+1 = F(x i, y i)+2x i+1下⾛⼀步后:x i+1=x i,y i+1=y i-1, 此时:F(x i+1, y i+1)=x i2+(y i-1)2-R2= F(x i, y i)-2y i+1由此可得:确定了F(xi+1, yi+1)之后,即可决定下⼀个点(xi+2, yi+2),选择道理同上。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。

通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。

在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。

首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。

这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。

然后,在实验中我们学习了图形的变换。

变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。

我们可以通过平移、旋转、缩放等变换来改变图形。

变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。

在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。

变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。

最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。

在实验中,我们学习了透视投影和正交
投影两种方式。

透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。

而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。

在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。

通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。

在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。

计算机图形学实验报告一

计算机图形学实验报告一

计算机图形学实验报告⼀实验⼀直线、圆、椭圆的⽣成算法⼀、实验⽬的与内容⽬的:利⽤实验使我对所学的图形⽣成算法加深印象,并且练习书写规范的实验报告格式。

1、了解VC编程环境中常⽤控件命令和绘图函数,掌握处理图形的基本⽅法;2、实现直线⽣成算法:数值微分法、中点画线法、Bresenham画线法;3、实现圆的⽣成算法:简单画圆法、中点画圆法、Bresenham画圆法;4、实现椭圆⽣成算法:中点画椭圆法。

⼆、实验前准备:算法分析使⽤开发环境VC++6.0,建⽴⼯程MFC AppWizard exe,选择单⽂档。

进⼊IDR_MAINFRAME,编辑菜单栏,对需要处理的菜单项标题“建⽴类向导”,添加消息映射函数,在映射的函数处添加相应算法的程序代码,就可以完成整个程序。

算法的学习和理解是图形学学习的重要部分,以下对各种算法进⾏分析和总结:1、DDA算法⽣成直线斜率是DDA算法的关键,⽤两点坐标很容易可以得到斜率k,但这⾥要注意k是float。

如果k的绝对值在0和1之间,每次画点x++,y+k再进⾏四舍五⼊(因为x此时⽐y的变化快)。

否则,y++。

也就是为了保持每次+k(或1/k)要⼩于1。

不⽤对k的正负有太多考虑,例如point1(100,100),point2(200,200),可能得到k=-1,这时我们就从point1开始画点,所得的结果是相同的。

2、中点画线法判别式是中点画线法的关键,(0<=k<=1)判别式是为了判断下⼀个点是在当前点正右边还是右上⽅,是和中点⽐较的结果。

d的含义下⼀个点到中点的垂直距离,它的正负可以做下⼀个位置的判断。

初值:d = 2*a + b,增量:上⼀个点d>=0,则d+2*a,上⼀个点d<=0,则d+2*(a+b)。

3、Bresenham算法⽣成直线由误差d的符号来决定下⼀个像素是在正右⽅合适右上⽅。

d的实际意义是实际点到模拟点的垂直距离,我们让它保持在1以内(>=1时,做-1)。

《计算机图形学》实验4实验报告

《计算机图形学》实验4实验报告

实验4实验报告格式实验报告格式《计算机图形学》实验4实验报告实验报告实验题目:参数曲线绘制实验内容:1 圆的参数曲线绘制。

2显式数学曲线描绘程序。

显式数学曲线描绘程序。

3贝赛尔曲线绘制。

贝赛尔曲线绘制。

编写程序调用验证之。

编写程序调用验证之。

参考资料:1 circleParam.java2 explicitCurve.java3 BezierLine.java4 数学曲线绘制.ppt 和实验3的参考ppt基本概念:(详细叙述自己对实验内容的理解)(详细叙述自己对实验内容的理解)(1)圆的参数曲线绘制: 圆的参数曲线绘制就是按照圆的定义,利用步长,圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示得在显示域上每一点的位置,然后绘制,圆是图形中经常使用的元素,圆是图形中经常使用的元素,圆被定义为所有离一中心位置圆被定义为所有离一中心位置),(yc xc 距离为给定值距离为给定值R 的点集,其函数方程为:222)()(R yc y xc x =-+-参数方程为:{)20(cos sin p £<+=+=t tR Xc X t R Yc Y根据已知的Xc 和Yc ,以及t 可以确定一个圆。

可以确定一个圆。

(2)显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照方程要求在固定的点画点,然后连接成一条线,例如如果曲线的方程式:c bx ax y ++=2,利用这个公式的递推演算,我们依次从-x 到+x 来绘制。

来绘制。

(3)贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。

它是应用于二维图形应用程序的数学曲线。

它是应用于二维图形应用程序的数学曲线。

曲线的定义有四个点:曲线的定义有四个点:曲线的定义有四个点:起始起始点、终止点(也称锚点)以及两个相互分离的中间点。

滑动两个中间点,贝塞尔曲线的形状会发生变化。

例如下面的公式:)10)(()(0,££=å=t t B p t p ni n i i算法设计:(详细叙述自己设计的的算法)(详细叙述自己设计的的算法)(1)圆的算法设计:本例体现的主要是圆的快速算法,这里的主要算法是:本例体现的主要是圆的快速算法,这里的主要算法是:{)20(cos sin p £<+=+=t t R Xc X t R Yc Y t 是圆的某一点与X 轴之间的夹角。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。

通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。

二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。

开发环境为 PyCharm。

三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。

它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。

Bresenham 算法则是一种基于误差的直线生成算法。

它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。

在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。

2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。

通过不断迭代计算中点的位置,逐步生成整个圆。

在实现过程中,需要注意边界条件的处理和误差的计算。

3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。

旋转变换是围绕一个中心点将图形旋转一定的角度。

缩放变换则是改变图形的大小。

通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。

4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。

扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。

在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。

四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。

根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。

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

实验报告
课程名称计算机图形学
实验(实训)名称圆的扫描转换
班级信息与计算科学2009级姓名学号
同组者
实验(实训)日期完成日期
本实验(实训)所用学时统计
预习实验(实训)报告总计评阅意见:成绩
实验报告
一、实验目的
1、掌握用中点画圆法进行圆的扫描转换方法;
2、掌握用Bresenham画圆法进行圆的扫描转换方法;
3、理解中点画圆法与Bresenham画圆法的区别;
二、算法原理介绍
1、中点画圆算法
假设x坐标为xp的各像素点中,与该圆弧最近者已确定,为P(xp,yp),那么,下一个与圆弧最近的像素只能是正右方的P1(xp+1,yp),或右下方的P2
(xp+1,yp-1)两者之一。

令M为P1和P2的中点,易知M的坐标为(xp+1,yp-0.5)。

显然,若M在圆内,则P1离圆弧近,应取为下一个像素;否则应取P2。

判别式d:
d = F(M)=F(xp+1,yp-0.5)=(xp+1)^2+(yp-0.5)^2-R^2
d的初始值为:
d0 = F(1,R-0.5)=1+(R-0.5)^2-R^2=1.25-R
在d≥0的情况下,取右下方像素P2,
d = F(xp+2,yp-1.5)=(xp+2)^2+(yp-1.5)^2-R^2=d+2(xp-yp)+5
在d<0的情况下,取正右方像素P1,
d = F(xp+2,yp-0.5)=(xp+2)^2+(yp-0.5)^2-R^2=d+2xp+3
2、 Bresenham画圆算法
假设生成圆心在坐标原点,半径为r,从x=0到x=y的1/8圆弧。

xi+1=xi +1
相应的y则在两种可能中选择:
y=yi,或者y=yi-1
选择的原则是考察理想的y值是靠近yi还是靠近yi-1
判别式:
d i+1=2(xi+1)2+yi2+(yi-1)2-2r2
判断式d的初始值为:
d0= 3-2r。

如果d i+1>=0,则y=yi-1,
di+2 =d i+1 + 4(xi- yi)+10
如果d i+1<0,则y=yi,
d i+2 =d i+1+ 4x i+6
三、程序源代码
1、中点画圆算法
#include"graphics.h"
#include"math.h"
#include"conio.h"
main()
{
void MidPointCircle(int,int);/*定义主函数变量,MidPointCircle中点画圆算法函数*/
int gdriver,gmode; /*gdriver和gmode分别表示图形驱动器和模式*/
gdriver=DETECT; /*DETECT是自动选择显示模式*/
initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");/*图形驱动文件的路径*/ MidPointCircle(200,YELLOW); /*定义圆的半径和颜色*/
getch();/*getch();会等待你按下任意键,再继续执行下面的语句*/
closegraph();/*关闭图形系统*/
return(0); /*返回值为0*/
}
void MidPointCircle(int r,int color) /*定义函数变量半径和颜色*/
{ int x,y;
float d; /*float类型中小数位数为7位,即可精确到小数点后7位 */
x=0; y=r; d=1.25-r;
while(x<y) /*满足条件x<y时进入循环,不满足跳出*/
{ if(d<0)
{d+=2*x+3; x++;}
else { d+=2*(x-y)+5; x++; y--;}
putpixel(x+200,y+200,color); putpixel(y+200,x+200,color);
putpixel(200-x,y+200,color); putpixel(y+200,200-x,color);
putpixel(200+x,200-y,color); putpixel(200-y,x+200,color);
putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);
/* putpixel 在指定位置画一像素*/
}
}
2、 Bresenham画圆算法
#include"graphics.h"
#include"math.h"
#include"conio.h"
main()
{
void Bresenham_Circle(int,int);/* Bresenham_Circle为 Bresenham画圆算法函数*/
int gdriver,gmode;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:\\tc3.0\\BGI");
Bresenham_Circle(200,YELLOW); /*定义圆的半径和颜色*/
getch();
closegraph();
return(0);
}
void Bresenham_Circle(int R,int color)
{ int x,y,delta,delta1,delta2,direction;
x=0;
y=R;
delta=2*(1-R);
while(y>=0) /*满足条件y>=0时进入循环,不满足跳出*/
{
putpixel(x+200,y+200,color); putpixel(y+200,x+200,color); putpixel(200-x,y+200,color); putpixel(y+200,200-x,color); putpixel(200+x,200-y,color); putpixel(200-y,x+200,color); putpixel(200-x,200-y,color); putpixel(200-y,200-x,color);
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta1<=0)direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0) direction=2;
else direction=3;
}
else
direction=2;
switch (direction)/*switch语句,即“切换”语句;case即“情况*/ {
case 1:x++;
delta+=2*x+1;
break;/*执行 break 语句会退出当前循环或语句*/
case 2:x++;
y--;
delta+=2*(x-y+1);
break;
case 3: y--;
delta+=(-2*y+1);
break;
}
}
四、实验结果
图1中点画圆算法生成的圆半径r=200,颜色为黄色
图2 Bresenham画圆算法生成的圆
半径R=200,颜色为黄色
五、总结与体会
通过运用 C 语言环境下的图像显示设置,本次实验我学会了用中点画圆法、Bresenham 画圆法进行圆的扫描转换,更加深刻的理解了中点画圆法、Bresenham 画圆法进行圆的扫描转换的生成原理。

掌握了中点画圆、Bresenham画圆算法及其特点。

能够应用中点画圆算法、Bresenham画圆算法,编程实现画圆的功能。

六、参考文献
1、计算机图形学
2、C语言。

相关文档
最新文档