计算机图形学实验三:圆的生成算法的实现
计算机图形学实验03

计算机图形学实验03
《计算机图形学》实验报告
圆(椭圆)的生成算法
一、实验教学目标与基本要求
1.实现圆的生成算法;
2.实现椭圆的生成算法;
二、实验课程内容 (2学时)
1.写出完整的圆的Bresenham生成算法;
2.写出完整的椭圆的中点生成算法;
三、算法思想
1.圆的Bresenham生成算法:
如果我们构造函数 F(_,y)=_+y-R,则对于圆上的点有F(_,y)=0,对于圆外的点有F(_,y)_gt;0,对于圆内的点F(_,y)_lt;0 。
与中点画线法一样,构造判别式:d=F(M)=F(_p+1,yp-0.5)=(_p+1)+(yp-0.5)-R。
若d_lt;0,则应取P1为下一象素,而且再下一象素的判别式为:
222d=F(_p+2,yp-0.5)=(_p+2)+(yp-0.5)-R=d+2_p+3
若d≥0,则应取P2为下一象素,而且下一象素的判别式为:
d=F(_p+2,yp-1.5)=(_p+2)+(yp-
1.5)-R=d+2(_p-yp)+5我们这里讨论的第一个象素是(0,R),判别式d的初始值为:d0=F(1,R-0.5)=1.25-R。
为了进一步提高算法的效率,将上面的算法中的浮点数改写成整数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。
2.椭圆的中点生成算法:
椭圆中点生成算法是将椭圆在第一象限中分为两个部分:
1)对于斜率绝对值小于1的区域内在_方向取单位量;
2)对于斜率绝对值大于1的区域内在y方向取单位量;
斜率可以通过椭圆的标准方程中获得为K = - (ry_ry)__/(r__r_)_y;这里中点椭圆222222222。
计算机图形学-设计算法绘制直线与圆

信息与计算科学专业基础课ComputerReport Of course 计算机图形学课程实验报告实验题目设计算法绘制直线与圆班级姓名学号指导教师日期实验说明 试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。
试验地点: 教九楼401 数学系机房实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。
实验内容实验题一实验题目1).用DDA 法在屏幕上画一条具有三个像素宽的直线段L1。
要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。
2).将课堂所讲的斜率0<K<1的中点画线算法推广到斜率K>1、-1<K<0和K<-1的情况,编写一通用的中点画线算法。
实验目的和意义1.了解如何利用C 语言和图形函数进行绘图;2. 熟悉并掌握C 语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 通过对Turbo C 进行图形程序设计的基本方法的学习,能绘制出简单的图形;4. 熟悉并掌握DDA 法在屏幕上画一条具有三个像素宽的直线段L1以及通用的中点画线算法。
通过DDA 法及用的中点画线算法,了解图形系统初始化、图形系统关闭和图设计算法绘制直线与圆实验2形模式的控制,并熟练运用图形坐标的设置,包括定点、读取光标以及图形颜色的设置。
程序制作步骤(包括算法思想、算法流程图等)1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf 、scanf 语句控制线段的端点坐标和画线颜色的自由输入;2. DDAline:设直线之起点为(x1,y1),终点为(x2,y2),则斜率k 为: 则有:⑴.可通过计算由x 方向的增量x ∆引起y 的改变生成直线。
计算机图形学-三种直线生成算法及圆的生成算法

计算机科学与技术学院2013-2014学年第一学期《计算机图形学》实验报告班级:110341C学号:110341328姓名:田野教师:惠康华成绩:实验(一):平面图形直线和圆的生成一、实验目的与要求1.在掌握直线和圆的理论基础上,分析和掌握DDA生成直线算法、中点生成直线算法、Bresenham生成直线算法、中点画圆算法、Bresenham圆生成算法。
2.熟悉VC6.0MFC环境,利用C语言编程实现直线和圆的生成。
3.比较直线生成三种算法的异同,明确其优点和不足。
同时了解圆的生成算法适用范围。
二、实验内容1.掌握VC6.0环境中类向导和消息映射函数的概念,并且为本次实验做好编程准备工作。
2. 用C语言进行编程实现上述算法,并且调试顺利通过。
3. 在MFC图形界面中显示不同算法下的图形,并且注意对临界值、特殊值的检验。
完成后保存相关图形。
三、算法分析➢DDA直线生成算法描述:1)给定一直线起始点(x0,y0)和终点(x1,y1)。
分别计算dx=x1-x0,dy=y1-y0。
2)计算直线的斜率k=dy/dx。
当|k|<1时转向3);当|k|<=1时,转向4);3)当x每次增加1时,y增加k。
即(xi,yi)→(xi+1,yi+k)。
直到xi增加到x1。
并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对y坐标要进行int(y+0.5)取整运算。
结束。
4)对y每次增加1时,x增加1/k,即(xi,yi)→(xi+1/k,yi+1)。
直到yi增加到y1. 并且每次把得到的坐标值利用系统函数扫描显示出来。
但要注意对x坐标要进行int(x+0.5)取整运算。
结束。
➢中点生成算法描述:算法基本思想:取当前点(xp,yp),那么直线下一点的可能取值只能近的正右方点P1(xp+1,yp)或者P2(xp+1,yp+1)。
为了确定好下一点,引入了这两点中的中点M(xp+1,yp+0.5)。
这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。
图形学实验报告-Bresenham算法画圆

计算机图形学实验报告姓名:张晓波学号:090081322010 年10月实验1 实用OpenGL 绘制二维图形实验目的1.进一步了解OpenGL程序的框架。
2.掌握利用OpenGL绘制简单视图的方法。
3.利用OpenGL中的Bresenham算法直接利用像素点绘制图形。
实验要求1.明确实验目的,按实验内容及基本步骤完成实验。
2.在实验过程中,结合思考与探究中的问题,通过实验进行理解。
3.理解并掌握本实验的内容。
实验内容及基本步骤1.绘制圆形分析:利用Bresenham算法,可以在自定了第一个点之后算出下一个点的位置,由于要保证斜率小于1,而且只在一个象限内绘制,所以找出的只是1/8圆弧,因此在找点的时候,利用对称性,同时找到8个点,进行绘制。
void Circle(int r){int x=0,y=r; //初始点int d=0; //声明决策变量d=3-2*r;while(x<=y){CircleVertex(x,y);//画圆上点FillCircle(x,y); //选取对应点,用矩形填充if(d<0)d=d+4*x+6;else{d=d+4*(x-y)+10;y --;}x++;}}void CircleVertex(int x, int y){glBegin(GL_POINTS);glVertex2f( x, y);//右上角glVertex2f(- x, y);//左上角glVertex2f( x,- y);//右下角glVertex2f(- x,- y);//左下角//上下侧四个点glVertex2f( y, x);//右上角glVertex2f(- y, x);//左上角glVertex2f( y,- x);//右下角glVertex2f(- y,- x);//左下角//左右侧四个点glEnd();}试验结果如下:2.填充圆形分析:在一次寻找确定出8个点之后,可以将其上下两端的点作为一组,左右两端的点作为一组分别绘制实心四边形。
计算机图形学--圆的生成算法的实现

计算机图形学--圆的生成算法的实现实验三圆的生成算法的实现班级信计学号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#include#include#includevoid 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)< p="">{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#include#include#include#includemain(){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圆弧就可以求出表示整个圆弧的像素集。
直线、圆、椭圆的生成算法

计算机科学与技术学院2012-2013学年第一学期《计算机图形学》实验报告班级:100341C学号:100341328姓名:魏然教师:惠康华成绩:实验项目:直线、圆、椭圆的生成算法一、实验目的与要求(1)了解Visual C++等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境(IDE)下进行图形处理程序的设计方法。
(2)熟练掌握直线的3种扫描转换算法:DDA算法,中点算法和Bresenham算法。
(3)掌握中点画圆算法、圆的Brensenham算法和椭圆的中点算法。
二、实验内容(1)在Visual C++环境中设计MFC单文档程序,利用消息处理函数,搭建能运行图形算法程序的平台。
(2)在平台中使用已有的点、线、圆等绘图函数,设计一个平面图形。
Visual C++基本绘图函数可参考有关文献。
(3)根据教材中给定的算法,实现直线段的3种生成算法:DDA算法,中点法和Bresenham算法。
(4)根据教材中给定的算法,实现圆与椭圆的生成算法。
三、重要算法分析(一)、直线的生成1、DDA算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义整型变量x,y,i;浮点数dx,dy,k;根据数学算法得到斜率k,k=dy/dx,其中dx=(float)(x1-x0),dy=(float)(y1-y0);定义x=x0;y=y0;通过对x和y各增加一个小增量,计算下一步的x、y值。
当k的绝对值小于1的时候,标记一个像素点,像素点的坐标为(x,int(y+0.5),c),y=y+k,如果x=x i,则停止;当k的绝对值大于或等于1的时候,标记一个像素点,像素点的坐标为(int(x+0.5),y,c),x=x+1/k,如果y=y i,则停止;2、中点算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义浮点数:a,b,d1,d2,d,x,y;假设直线方程f(x,y)=ax+by+c=0,则a=y0-y1;b=x1-x0;判别式d=2*a+b;d1=2*a;d2=2*(a+b);定义x=x0;y=y0;标记像素点(x,y,c);x值逐一增加,y值取决于d;当d大于等于0的时候,取正右方的点,上一步的d值加d1;当d小于0的时候,取右上方的点,上一步的d值加d2;3、Bresenham算法定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色;定义整型变量 i,x,y,dx,dy;整型变量:k,e;dx=x1-x0,dy=y1-y0;e=-dx;定义x=x0;y=y0;标记像素点(x,y,c),x逐一增加,e=e+2*dy,其中如果e>=0,则y增加,e=e-2*dx, 如果x=x i,则停止;(二)、圆的生成1、中点画圆定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,d;使x=0,y=r,d=1-r;标记像素点(x,y,c);当x<=y的时候,如果d<0,则d=d+2*x+3;否则d=d+2*(x-y)+5,y逐一减;x逐一增加,标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);2、Bresenham画圆定义圆的中点和圆弧颜色:整型变量 x0=?, y0=?,r=?,c=颜色,x,y,e;浮点数e,d;使x=0,y=r,e=3-2*r;当x<=y的时候,如果e<0,则e=e+4*x+6,x逐一增加;否则e=e+4*(x-y)+10,x逐一增加,y逐一减;标记像素点(x+x0,y+y0,c);标记像素点(-x+x0,y+y0,c);标记像素点(-x+x0,-y+y0,c);标记像素点(x+x0,-y+y0,c);标记像素点(y+x0,x+y0,c);标记像素点(-y+x0,x+y0,c);标记像素点(-y+x0,-x+y0,c);标记像素点(y+x0,-x+y0,c);四、程序运行截图图1 直线的生成图2 圆的生成五、总结与调试经验通过本次试验,我初步了解了怎样在计算机上进行图形处理,并且学会了怎样在Visual C++上创建生成图形的工程,用不同算法实现了直线和圆的生成,知道了各个算法之间的优缺点。
计算机图形学圆的生成算法的实现

}
ReleaseDC(pDC>。
}
四、实验结果分析
调试是程序成功后,运行结果如下:中点算法生成的圆<蓝色圆弧)如图3-2,Bresenham算法生成的圆<黑色圆弧)如图3-3,中点算法生成的椭圆如图3-4。xHAQX74J0X
图3-2 中点法画圆效果图
pDC->SetPixel(-y+x0,-x+y0,c>。
pDC->SetPixel(y+x0,-x+y0,c>。
}
ReleaseDC(pDC>。
}
中点算法画椭圆。设中心在 ,长半轴为 ,短半轴为 。其VC程序设计代码如下:
void CMyView::OnMidpointellispe(>
{
CDC *pDC=GetDC(>。
pDC->SetPixel(y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,x+y0,color>。
pDC->SetPixel(-y+x0,-x+y0,color>。
pDC->SetPixel(y+x0,-x+y0,color>。
}
ReleaseDC(pDC>。
}
Bresenham算法画圆。利用Bresenham画圆算法画出圆心在 、半径为R的圆,其VC程序设计代码如下:jLBHrnAILg
实验三圆的生成算法的实现
班级 08信计2班 学号20080502054姓名曲凯歌分数
计算机图形学-直线、圆、椭圆的生成

2014-9-5
中点画线法
假设直线方程为:ax+by+c=0 其中a=y0-y1, b=x1-x0, c=x0y1-x1y0 由常识知:
F x, y 0 F x, y 0 F x, y 0 点在直线上面 点在直线上方 点在直线下方
P2
Q
P=(xp,yp) P1
2014-9-5 浙江大学计算机图形学 28
圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制 1/8 圆的中点 Bresenham 算法原理,根据对称 性可以绘制整圆 。
2014-9-5 浙江大学计算机图形学 22
设图中xi列上已用(xi,yir)作为表示直线的点, 又设B点是直线上的点,其坐标为(xi+1,yi+1),显然 下一个表示直线的点( xi+1,yi+1,r)只能从图中的C 或者D点中去选。设A为CD边的中点。 若B在A点上面 则应取D点作为( xi+1,yi+1,r),否则应取C点。
P=(xp,yp ) P1 浙江大学计算机图形学
16
中点画线法
若d<0->M在直线下方->取P2; 此时再下一个象素的判别式为 d2= F(xp+2, yp+1.5) =a(xp+2)+b(yp+1.5)+c = a(xp +1)+b(yp +0.5)+c +a +b =d+a+b ; 增量为a+b
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;
direction = 3; else direction = 2; } else direction=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; } } } 实验结果:
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; else direction = 2; } else if(delta > 0) { if ((2*(delta-x)-1) > 0)
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, in生成算法的实现
班级 08信计 一、实验目的和要求
1、理解圆的基本原理。 2、掌握几种常见的圆生成算法。 3、利用TurboC实现圆生成的中点画圆算法。 4、理解圆生成的基本原理,掌握几种常见的圆生成算法。 5、利用Visual C++ 实现圆生成的中点画圆的算法。 6、利用Visual C++ 实现圆的Bresenham算法。 7、简单了解其他算法。
四、实验结果分析:
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);
学号 20080502069 姓名
分数
二、实验内容:
1.利用中点画图算法,在屏幕上生成任意一段圆弧。 2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。 3.利用bresebham算法设计出一段圆弧。
三、实验步骤:
1.预习教材关于圆的生成原理。 2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。 3.调试、编译、运行程序。