计算机图形学画圆实验报告
计算机图形学报告

淮阴工学院计算机科学系实验报告书课程名:《计算机图形学》题目:实验2圆或椭圆的绘制班级:学号:姓名:1、实验内容或题目1、通过实验,进一步理解和掌握DDA和中点算法;2、掌握以上算法生成直线段、椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段、椭圆或圆的绘制。
2、实验目的与要求用DDA算法或中点(Besenham)算法实现直线段、椭圆或圆的绘制。
3、实验步骤与源程序⑴实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。
⑵源代码#include "stdio.h"#include "conio.h"#include "graphics.h"#include<time.h>#include<math.h>void ellipsepoint(long x0,long y0,long x,long y,long color){putpixel((int)(x0+x),(int)(y0+y),(int)color);putpixel((int)(x0-x),(int)(y0+y),(int)color);putpixel((int)(x0+x),(int)(y0-y),(int)color);putpixel((int)(x0-x),(int)(y0-y),(int)color);}void midpointellipse(long x0,long y0,long a,long b,long color) {long x,y,d,sa,sb,xp,yp;sa=a*a,sb=b*b;xp=(long)((float)sa/(float)sqrt((float)(sa+sb)));yp=(long)((float)sb/(float)sqrt((float)(sa+sb)));x=0,y=b,d=sa+4*sb-4*sa*b;while(x<xp){if(d<0){d=d+4*sb*(2*x+3);x++;}else{d=d+4*sb*(2*x+3)+4*sa*(2-2*y);x++;y--;}ellipsepoint(x0,y0,x,y,color);}x=a,y=0,d=4*sa+sb-4*a*sb;while(y<yp){if(d<0){d=d+4*sa*(2*y+3);y++;}else{d=d+4*sa*(2*y+3)+4*sb*(2-2*x);y++;x--;}ellipsepoint(x0,y0,x,y,color);}}main(){clock_tstart=clock(),end,t;intgraphdriver=VGA,graphmode=VGAHI;initgraph(&graphdriver,&graphmode,"");midpointellipse(300,200,300,180,RED);end=clock();t=end-start;printf("%d\n",t);getch();closegraph();}4、测试数据与实验结果(可以抓图粘贴)5、结果分析与实验体会在这次实验中,我们遇到了很多困难,刚开始我们在实现圆的绘制时,调试后,要么就是没有图形,要么就是在左上角有个四分之一的圆,在其过程中,代码也改了好多次。
三次贝塞尔曲线画圆

三次贝塞尔曲线画圆贝塞尔曲线是一种数学表达方式,由法国数学家皮耶尔·贝塞尔在19世纪提出。
它可以用于描述平滑曲线,并且在计算机图形学、动画设计以及工程绘图等领域得到了广泛应用。
正因如此,贝塞尔曲线的研究与应用,成为了众多数学爱好者探索的方向。
然而,你有没有想过,用三次贝塞尔曲线能够画出一个完美的圆呢?通过数学的推理与实践,证明了用三次贝塞尔曲线可以准确地绘制出一个圆形。
让我们一起进入数学的世界,探寻其中的奥秘。
首先,我们需要了解什么是三次贝塞尔曲线。
三次贝塞尔曲线由四个点决定,分别为起始点P0、控制点P1、控制点P2和终止点P3。
起始点和终止点是曲线的端点,而控制点则决定了曲线的形状。
要绘制一个圆形,我们可以先确定圆的四个象限的中点,分别称为顶点A、B、C和D。
将这四个顶点连接起来,即可形成一个矩形。
然后,我们需要计算出控制点的坐标,使得贝塞尔曲线通过圆的四个顶点,并且在圆的切线处平滑过渡。
假设圆的半径为r,我们可以得到控制点的坐标如下:点A的控制点为(A.x, A.y + r * ?? / ??)点B的控制点为(B.x + r * ?? / ??, B.y)点C的控制点为(C.x, C.y - r * ?? / ??)点D的控制点为(D.x - r * ?? / ??, D.y)现在,我们已经确定了绘制圆所需的所有点的坐标。
接下来,使用这些点来绘制三次贝塞尔曲线。
在计算机图形学中,三次贝塞尔曲线的绘制通常使用参数t的变化来实现。
我们可以将0≤t≤1作为参数的范围,通过改变t的值,可以逐步绘制贝塞尔曲线。
数学表达式如下:X(t) = (1-t)^3 * P0.x + 3 * (1-t)^2 * t * P1.x + 3 * (1-t) * t^2 * P2.x + t^3 * P3.xY(t) = (1-t)^3 * P0.y + 3 * (1-t)^2 * t * P1.y + 3 * (1-t) * t^2 * P2.y + t^3 * P3.y其中,P0、P1、P2和P3分别为起始点、控制点、控制点和终止点的坐标。
计算机图形学--圆的生成算法的实现

计算机图形学--圆的生成算法的实现实验三 圆的生成算法的实现班级 信计 学号51姓名 程芳超 分数一、实验目的和要求:1、掌握圆的生成算法的基本原理2、熟悉圆的生成算法,利用Turbor 实现中点画圆算法、圆的Bresenham 算法。
二、实验内容:1、熟悉圆上的8个对称点的算法,利用中点画圆算法画圆并在屏幕上显示出来;2、使用Bresenham 画圆法生成一个圆;3、利用line()函数画圆:.圆的参数方程222(0)(0)x x y y r +++=;圆心为o(x0,y0)。
以下为各程序的实现代码: 1、中点画圆算法:运行结果为:#include "Conio.h"#include "graphics.h"#include "stdio.h"#include "math.h"#define closegr closegraph#define xo 300#define yo 250#define DELTA 1.0#define max 100typedef struct{int x; int y;}Point;typedef struct{int pointNum;Point *vertices;}Polygon;void initgr(void){int gd = DETECT, gm = 0;registerbgidriver(EGAVGA_driver);initgraph(&gd, &gm, "");}void putpixels(int x,int y,int color,int n) { int i,j;for(i=-n/2;i<=n/2;i++)for(j=-n/2;j<=n/2;j++)putpixel(x+j,y+i,color);}void putpixelt(int x,int y,int color,int i) {int a[8]={1,1,1,1,0,0,0,0};if(a[i%8])putpixel(x,y,color);}void EllipsePoints(int x,int y,int color) {putpixel(xo+x,yo+y,color);putpixel(xo-x,yo+y,color);putpixel(xo+x,yo-y,color);putpixel(xo-x,yo-y,color);}void CirclePoints(int x,int y,int color) {putpixel(xo+x,yo+y,color);putpixel(xo+y,yo+x,color);putpixel(xo-y,yo+x,color);putpixel(xo-x,yo+y,color);putpixel(xo+y,yo-x,color);putpixel(xo+x,yo-y,color);putpixel(xo-x,yo-y,color);putpixel(xo-y,yo-x,color);}void MidPointCircle1(int radius,int color) {int x,y;float d;x=0; y=radius; d=5.0/4-radius;CirclePoints(x,y,color);while(y>x){if(d<=0)d+=2.0*x+3;else{d+=2.0*(x-y)+5;y--;}x++;CirclePoints(x,y,color);}}main(){initgr();cleardevice();MidPointCircle1(150,4);getch();closegraph();}运行结果为:2圆的Bresenham算法:#include <graphics.h>#include <stdio.h>#include <conio.h>#include<math.h>void BresenhamCircle(xc,yc,radius,color) int xc,yc, radius,color;{int x,y,d;x=0 ;y=radius ;d=3-2*radius ;while(x<y){plot_circle_points(xc,yc,x,y,color) ; if(d<0)d+=4*x+6;else{d+=4*(x-y)+10;y--;}x++;}if(x==y)plot_circle_points(xc,yc,x,y,color) ;}plot_circle_points(xc,yc,x,y,color)int xc,yc,x,y,color;{putpixel(xc+x,yc+y,color);putpixel(xc-x,yc+y,color);putpixel(xc+x,yc-y,color);putpixel(xc-x,yc-y,color);putpixel(xc+y,yc+x,color);putpixel(xc-y,yc+x,color);putpixel(xc+y,yc-x,color);putpixel(xc-y,yc-x,color);}main(){int a,b,c,e ;int graphdriver=DETECT ;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();a=300;b=300;c=150;e=3;BresenhamCircle(a,b,c,e );getch();closegraph();}运行结果为:3、利用line()函数画圆#include <stdio.h>#include <stdlib.h>#include <math.h>#include <conio.h>#include <graphics.h>main(){int i,r,xx[46],yy[46],x0,y0; float t=360/45*3.14/180;int gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,""); cleardevice();setbkcolor(14);setcolor(4);x0=300;y0=250;r=200;for(i=0;i<46;i++){xx[i]=x0+r*cos(i*t);yy[i]=y0-r*sin(i*t);}for(i=0;i<45;i++)line(xx[i],yy[i],xx[i+1],yy[i+1]);settextstyle(1,0,5);outtextxy(300,200,"O");line(300,250,500,250);getch();closegraph();return 0;}运行结果为:三、实验结果分析1、显示圆上的8个对称点的算法如下:void CirclePoints(int x,int y,int color) {putpixel(x,y,color);putpixel(y,x,color);putpixel(-x,y,color);putpixel(y,-x,color);putpixel(x,-y,color);putpixel(-y,x,color);putpixel(-x,-y,color);putpixel(-y,-x,color);}若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他七个点,因此要扫描转换1/8圆弧就可以求出表示整个圆弧的像素集。
圆绘制算法实验报告

一、实验背景圆是几何图形中最基本的图形之一,在计算机图形学中,绘制圆是图形处理的基础。
本实验旨在通过实现圆的绘制算法,加深对计算机图形学基本概念和方法的理解,提高编程能力。
二、实验目的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. 编写代码实现两种算法,并进行测试。
《计算机图形学》实验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 轴之间的夹角。
计算机图形学实习报告bresenham画圆算法

计算机图形学实习报告实习时间:2016年4月6日学院:专业名称:学号:姓名:实习地点:一、实习目的熟悉Visual C++开发环境,能够自己搭建OpenGL图形开发框架,并用C/C++语言实现Bresenham画圆算法。
通过本实验教学环节,可以使学生对图元生成算法的实现过程、验证方法有一个初步的了解,通过实现Bresenham画圆算法,理解图元的参数表示法、光栅扫描、显示输出的概念。
实验的基本要求是:利用Visual C++开发环境,搭建OpenGL Win32控制台图形开发框架,完成Bresenham画圆算法程序的输入、编译和调试运行。
二、实习内容与过程1.Visual C++开发环境熟悉;2.了解Win32控制台开发框架,并搭建OpenGL Win32控制台图形开发框架,如图1-1;图1-1添加OpenGL库3.完成Bresenham画圆算法程序的输入、编译和运行,在屏幕上输出实现结果,Bresenham画圆算法改写如图1-2所示,运行结果如图1-3;图1-2部分Bresenham算法代码图1-3运行结果4.掌握程序调试的方法;5.修改算法参数,查看结果的不同,如图1-4;图1-4修改参数运行结果三、出现问题及解决方法1.在搭建OpenGL图形开发框架时,刚开始不知道在哪里加入“opengl32.lib glu32.lib”,后来在“Bresenham解决方案→属性→链接器→输入→附加依赖项”中进行加入,完成了OpenGL图形开发框架的搭建。
2.刚开始不知道如何利用Bresenham算法画两个圆,后来直接在drawCircle()函数中多次调用bresenhamcircle()函数就可以了,还可以修改相关参数,如图2-1:图2-1四、实习体会这次实习,主要是熟悉Visual C++开发环境,能够自己搭建OpenGL图形开发框架,并用C/C++语言实现Bresenham画圆算法。
在这次实习中加深了对图元生成算法的实现过程、验证方法的了解,也通过实现Bresenham画圆算法,理解了图元的参数表示法、光栅扫描、显示输出的概念,渐渐地开始自己思考实现想要实现的功能。
计算机学实验报告(画圆)

计科本082班李凤艳学号0804402214一、实验名称计算机画圆二、实验目的通过上机实验编程实现计算机画圆,充分理解体会学习,图形学学画图的原理,加深印象。
三、实验内容实现计算机画圆四、源程序由于系统自动生成很多代码,大部分都一样,在此程序中省略,只列出一些关键实现代码。
void CMovecircleView::OnDraw(CDC* pDC){CMovecircleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect Rect;GetClientRect(&Rect);CDC MemDC;CDC Picture;CBitmap Bitmap,*OldBitmap;//CBitmap Bitmap;//CBitmap &OldBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);MemDC.CreateCompatibleDC(pDC);OldBitmap=MemDC.SelectObject(&Bitmap);MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.SetBkMode(TRANSPARENT);MemDC.SetTextColor(RGB(255,255,255));MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.TextOut(100,50,"欢迎来到计算机图形学");pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);}void CMovecircleView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultm_bLButtonDown = TRUE; // 设左鼠标键按下为真m_pStart = point;SetCapture(); // 设置鼠标捕获CView::OnLButtonDown(nFlags, point);}void CMovecircleView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default ReleaseCapture();if (m_bLButtonDown){CDC* pDC = GetDC(); // 获取设备上下文pDC->SelectStockObject(NULL_BRUSH);pDC->SelectObject(pLinePen); // 选择笔pDC->SetROP2(R2_COPYPEN); // 设置为覆盖绘图方式CPoint center; // 圆心//calculate the centercenter.x=(float(m_pStart.x+point.x))/2;center.y=(float(m_pStart.y+point.y))/2;// nRadius is a class member, doublenRadius=sqrt(double(point.y-m_pStart.y)*(point.y-m_pStart.y)+(point.x-m_pStart.x)*(point.x-m_pStart.x))/2;pDC->Ellipse(center.x-nRadius, center.y-nRadius, center.x+nRadius, center.y+nRadius);ReleaseDC(pDC); // 释放设备上下文m_bLButtonDown = FALSE; // 重设左鼠标键按下为假m_bErase = FALSE; // 重需要擦除为假}CView::OnLButtonUp(nFlags, point);}void CMovecircleView::OnMouseMove(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default if(m_bLButtonDown==TRUE){CDC* pDC = GetDC(); // 获取设备上下文pDC->SelectObject(pGrayPen); // 选取灰色笔pDC->SelectStockObject(NULL_BRUSH);pDC->SetROP2(R2_XORPEN); // 设置为异或绘图方式if (m_bErase){ // need to erasepDC->Ellipse(old_center.x-nRadius,old_center.y-nRadius,old_center.x+nRadius, old_center.y+nRadius);}else // 需要擦除为假m_bErase = TRUE; // 设需要擦除为真CPoint center;center.x=(float(m_pStart.x+point.x))/2;center.y=(float(m_pStart.y+point.y))/2;nRadius=sqrt((double)(point.y-m_pStart.y)*(point.y-m_pStart.y)+(point.x-m_pStart.x)*(point.x-m_pStart.x))/2;pDC->Ellipse(center.x-nRadius, center.y-nRadius, center.x+nRadius, center.y+nRadius);old_center=center;ReleaseDC(pDC); // 释放设备上下文}CView::OnMouseMove(nFlags, point);}五、运行结果六、实验小结这是计算机图形学的第一次实验,通过本次实验我掌握了图形学画图的基本方法以及一些操作的基本要求,在试验中碰到了一些问题,通过同学之间互动,顺利解决了。
计算机图形学实验三:圆的生成算法的实现

实验三:圆的生成算法的实现班级 08信计学号 20080502069 姓名分数一、实验目的和要求1、理解圆的基本原理。
2、掌握几种常见的圆生成算法。
3、利用TurboC实现圆生成的中点画圆算法。
4、理解圆生成的基本原理,掌握几种常见的圆生成算法。
5、利用Visual C++ 实现圆生成的中点画圆的算法。
6、利用Visual C++ 实现圆的Bresenham算法。
7、简单了解其他算法。
二、实验内容:1.利用中点画图算法,在屏幕上生成任意一段圆弧。
2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。
3.利用bresebham算法设计出一段圆弧。
三、实验步骤:1.预习教材关于圆的生成原理。
2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。
3.调试、编译、运行程序。
四、实验结果分析:1.这里用圆生成的中点画圆算法为例来绘制一个圆。
程序代码:#include<graphics.h>#include<conio.h>void circlepoints(int x,int y,int color){int m,n;float xasp,yasp;float aspectratio;m=200;n=200;getaspectratio(&xasp,&yasp);aspectratio = xasp/yasp;putpixel(x+m,y*aspectratio+n,color);putpixel(y+m,x*aspectratio+n,color);putpixel(-y+m,x*aspectratio+n,color);putpixel(-x+m,y*aspectratio+n,color);putpixel(y+m,-x*aspectratio+n,color);putpixel(x+m,-y*aspectratio+n,color);putpixel(-x+m,-y*aspectratio+n,color);putpixel(-y+m,-x*aspectratio+n,color); }void midpointcircle(int r,int c){int x,y;float d;x=0; y=r; d=5.0/4-r;circlepoints(x,y,c);while(y>x){if(d<=0)d+=2.0*x+3;else{d+=2.0*(x-y)+5;y--;}x++;circlepoints(x,y,c);}}void main(){int a,b;int graphdriver = DETECT;int graphmode = 0;initgraph(&graphdriver,&graphmode,"");cleardevice();a= 200; b= 200;midpointcircle(a,b);getch();closegraph();}运行结果:2.利用bresenham算法生成圆的代码:#include<graphics.h>#include<stdio.h>#include<conio.h>void BresenhemCircle(int centerx, int centery, int radius, int color, int type);void main(){int drive=DETECT,mode;int i,j;initgraph(&drive,&mode,"");BresenhemCircle(300,200,100,150,0);getch();closegraph();}void BresenhemCircle(int centerx, int centery, int radius, int color, int type){int x =type = 0;/*初始横坐标为原点*/int y = radius; /*初始纵坐标远离原点*/int delta = 2*(1-radius);int direction;while (y >= 0){getch();if (!type)/*执行*/{/*在上半圆画两点*/putpixel(centerx+x, centery+y, color);putpixel(centerx-x, centery+y, color);/*在下半圆画两点*/putpixel(centerx-x, centery-y, color);putpixel(centerx+x, centery-y, color);getch();}else{line(centerx+x, centery+y, centerx+x, centery-y); line(centerx-x, centery+y, centerx-x, centery-y); getch();}if (delta < 0){if ((2*(delta+y)-1) < 0)direction = 1;elsedirection = 2;}else if(delta > 0){if ((2*(delta-x)-1) > 0)direction = 3;elsedirection = 2;}elsedirection=2;switch(direction){case 1:x++;delta += (2*x+1); break;case 2:x++;y--;delta += 2*(x-y+1); break;case 3:y--;delta += (-2*y+1); break;}}}实验结果:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
洛阳理工学院实验报告用纸
(2)画理想圆流程图如图-1:
图-1:画理想圆流程图
(3)中点画圆法
图-2 中点画圆法当前象素与下一象素的候选者
数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
(4)Bresenham画圆法
Bresenham画线法与中点画线法相似,,它通过每列象素中确定与理想直线最近的象素来进行直线的扫描的转换的。
通过各行,各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的的象素。
该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求对象。
假设x列的象素已确定,其行下标为y。
那么下一个象素的列坐标必为x+1。
而行坐标要么不变,要么递增1。
是否递增1取决于如图所示的误差项d的值。
因为直线的起始点在象素中心,所以误差项d的初始值为0。
X下标每增加1,d的值相应递增直线的斜率值,即d=d+k(k=y/x为直线斜率)。
一旦d>=1时,就把它减去,这样保证d始终在0、1之间。
当d>0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d<0.5时,更接近于象素(x+1,y),当d=0。
5时,与上述二象素一样接近,约定取(x+1,y+1)。
令e=d-0。
5。
则当e>=0时,下一象素的y下标增加1,而当e〈0时,下一象素的y下标不增。
E的初始值为-0.5.
(二)实验设计
画填充点流程图,如图-3:
图-3:圆的像素填充过程NS图
画理想圆,记录圆心坐标,计算半径大小,并记录
是否开始填充
否
是
初始化计数器、标志变量,设置最大计数值
调用Bresenha m画圆算法
否
是
填充标记是否为真
(While)计数变量小于最大计数值
循环变量temp + 1
填充计算出来的temp个坐
标点
计算需要填充坐标数组的
前temp个坐标
附录
图-4 Bresenham画圆算法最终效果图。