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

合集下载

计算机图形学实验03

计算机图形学实验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算法画圆

图形学实验报告-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++上创建生成图形的工程,用不同算法实现了直线和圆的生成,知道了各个算法之间的优缺点。

计算机图形学圆的生成算法的实现

计算机图形学圆的生成算法的实现
pDC->SetPixel(x+x0,-y+y0,color>。
}
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

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

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

实验三:圆的生成算法的实现班级 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;}}}实验结果:。

计算机图形学--第三讲 直线与圆生成算法

计算机图形学--第三讲   直线与圆生成算法

12直线生成算法圆弧绘制算法图元的概念33.1 图元的概念为其颜色值。

3.1 图元的概念3.1 图元的概念12直线生成算法圆弧绘制算法图元的概念33.2 直线生成算法曲线和各种复杂的图形均是离散成许多直线段来绘制,因而直线是二维图形生成技术的基础。

数学上的理想直线没有宽度,是由无数个点构成的集合。

对直线进行光栅化时,只能在显示器所给定的有限个像素组成的点阵中,选择能最好地逼近于该直线的一组像素,并对这些像素进行写操作。

这就是通常所说的用显示器绘制直线,即直线的扫描转换。

直线扫描转换的主要工作:快速找出像素点阵中最近的网格点3.2 直线生成算法画一条从近直线的像素序列,并填入色彩数据的过程。

这一过程也称为直线光栅化。

需要解决的问题►连续性►粗细、亮度要均匀►像素逼近待画直线►速度3.2 直线生成算法 问题1问题3.2 直线生成算法常用的直线生成算法有三种:►►►►►►3.2 直线生成算法基本思路:是用数值方法求解微分方程的一种方法,即根据长移动,由此产生连续的像素坐标3.2 直线生成算法设起点和终点坐标分别为Δx令即第3.2 直线生成算法于是有步的结果加上一个增量得到。

该算法在方向增量为3.2 直线生成算法3.2 直线生成算法下图中,用公式(表示,但显示时要用像素来表示,即采用舍入的办法得到最靠近空心圆点的像素,用这些像素(下图中的实心圆点)来表示直线。

3.2 直线生成算法void LineDDA(int{int} }3.2 直线生成算法►►想位置的偏移;►►整运算,运行效率低且取整运算不利于硬件实现基本思路:假定直线斜率P(x p,y的中点,---如果取---如果取---M与问题转换为如何判断构造判别式假设直线方程为:则由数学知识可知有下面的关系:F(F(F(所以,欲判断Q点下方,只需要把中点并检查它的符号。

构造判别式d=F(=a(当d<0取右上方当d≥0取右方P判别式的增量算法当增量为若增量为其它斜率的情况时再将算法设计:画线从d0可以用d0算法设计:例:用中点画线法12345void MidpointLine (int x { int a, b, d} /* mid PointLine */设直线的起点坐标为的情况来说明该算法。

计算机图形学_圆弧的生成

计算机图形学_圆弧的生成
d1 DS1 DT1
2 (1 y0 R 2 ) (1 ( y0 1) 2 R 2 ) 3 2 y0 3 2R
下面给出 di 的递推公式。
d i ( xi2 yi21 R 2 ) ( xi2 ( yi 1 1) 2 R 2 ) 2 xi2 2 yi21 2 yi 1 2 R 2 1
xi 1 xi , yi 1 yi 1
代入圆的方程可得:
F ( xi 1 , yi 1 ) ( xi 1 )2 ( yi 1 )2 R2
xi ( yi 1)2 R2
F ( xi , yi ) 2 yi 1
(4-5)
2
公式(4-4)和(4-5)就是计算 F ( xi , yi ) 的递推公式。当判 别函数确定后,就可用正负法绘制圆弧。首先规定先 向右走一步。
2019年2月11日星期一
根据算法,可得Bresenham生成圆弧的程序如下: void bresenham_arc(int R,int color) { int x,y,d; x=0;y=R; d=3-2*R; while(x<y) { putpixel(x,y,color); if(d<0) d+=4*x+6; else { d+=4*(x-y)+10; y-=1; } x++; } if(x==y) putpixel(x,y,color); }
2019年2月11日星期一
判别式d: 2 2 d F M F x p 1, y p 0.5 x p 1 y p 0.5 R 2




d的初始值为: d 0 F (1, R 0.5) 1 (R 0.5) 2 R 2 1.25 R

计算机图形学划线实验报告

计算机图形学划线实验报告

计算机图形学划线实验报告《计算机图形学》实验报告实验⼀直线、圆(弧)⽣成算法⼀、实验⽬的及要求1. 了解光栅图形显⽰器的⼯作原理和特点;2. 学习C/VC环境下的基本绘图⽅法;3. 实践与巩固直线的基本⽣成算法。

4. 掌握直线扫描转换算法的原理及实现;5. 学习圆(弧)的基本⽣成算法;6. 实践圆(弧)的基本⽣成算法;7. 掌握圆弧扫描转换算法的原理及实现;⼆、理论基础1、有关直线⽣成算法有DDA(数值微分)、中点画线线算法、Bresenham⽣成算法数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。

假设起点的坐标为整数。

让x递增1,y相应递增k。

中点划线算法中若直线在x⽅向增加⼀个单位,y的增量只能在0、1之间。

假设当前像素点已经确定,下⼀像素点就只可能有两种情况,将这两点的中点带⼊直线⽅程中,通过中点在直线的上、下⽅来判断下⼀点的坐标。

Bresenham算法是通过各⾏、各列像素中⼼构造⼀组虚拟⽹络格线,按直线从起点到中点的顺序计算直线与各垂直⽹格线的交点,然后确定该列像素中与此交点最近的像素。

2、有关画圆的算法圆的扫描转换(中点画圆法)、Bresenham画圆算法圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第⼀象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。

之后通过对称画出全部圆。

Bresenham画圆算法考虑圆在第⼀象限上的点,每确定⼀像素,则下⼀像素有三种可能,通过判断右下⽅的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。

三、算法设计与分析1、数值微分法int x0=0,y0=0,x1=800,y1=400; //数值微分法,|k|<=1float dx,dy,k,x,y;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;for(x=x0;x<=x1;x++){pDC->SetPixel(x,int(y+0.5),color);y=y+k;}该程序中每⼀步的x、y值是⽤前⼀步的值加上⼀个增量来获得的。

圆、椭圆的生成算法

圆、椭圆的生成算法

姓名学号实验组实验时间2010-4-2 指导教师成绩实验项目名称圆、椭圆的生成算法实验目的通过本实验,使学生了解并掌握在光栅显示系统中园的生成和显示算法和椭圆的生成和显示算法。

实验要求1.实现在光栅显示系统中园的生成和显示算法和栅显示系统中椭圆的生成和显示算法,进一步熟悉相关开发平台。

2.掌握圆的几种算法(中点算法,二次差分算法以及Bresenham算法),并理解各种算法的优劣。

实验原理圆的中点算法算法原理:画出第二个八分园(45°-90°),利用八对称性画出其它八分园。

1.用中点算法画第二个八分园。

从当前已获得的象素递推出下一个象素。

园弧的隐函数的形式为F(x,y)=x2+y2-R2=0则园弧的正负划分性为:F(x,y)>0,(x,y)在园外;F(x,y)<0,(x,y)在园内;F(x,y)=0,(x,y)在园上。

设(xi,yi)为已确定的象素坐标,则下一个象素只能是正右方的E点或右下方的SE点。

设M是E和SE的中点,则M=(xi+1,yi-0.5):如F(M)<0,则M在园内,说明E距离圆弧更近,下一点取正右方E点;如F(M)>0,则M在园外,说明SE距离圆弧更近,F(x,y)>0F(x,y)<0 F(x,y)=0xi,yiMESE下一点取右下方SE 点;如F(M)=0,则M 在园上,下一点取E 点或SE 点。

构造判别式:d=F(M)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R2椭圆的中点算法原理:中点算法可以推广到一般二次曲线如椭圆。

中心在原点的椭圆方程为:隐函数的形式为:a=b 时,该方程表示的是圆。

椭圆具有四对称性,可只考虑第一象限的椭圆弧。

椭圆上任一点(x,y)处的法向量为:如在p 点法线两分量相等,则p 点将椭圆第一象限分成两部份,上半部份法向量在y 方向的分量比x 方向的大,在下半部份相反。

在p 点:在当前中点处,法向量(2b2 (Xp+1),2a2 (Yp-0.5))的y 分量比x 分量大,即: b2 (Xp+1) < a2 (Yp-0.5)而在下一中点,不等式改变方向,则说明椭圆弧从上部分转入下部分。

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

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

实验三圆的生成算法的实现班级 08信计学号 60姓名段丹丹分数一、实验目的与要求1. 掌握Bresenham画圆算法的基本思想。

2. 编写Bresenham算法画圆的基本函数并尽量完善。

3、熟悉圆的生成算法,掌握圆的绘制,利用TurboC来实现圆的生成算法。

3、熟悉生成圆的中点算法和正负法。

4、理解圆生成的基本原理。

二、实验步骤与内容:在光栅显示器上显示图形时,直线段或图形边界或多或少会呈锯齿状,原因是图形信号时连续,而在光栅显示系统中,用来表示图形的却是一个个离散的像素,这种用离散量表示连续两引起的失真现象称之为走样,用于减少或消除这种效果的技术称为饭走样技术。

采用反走样可适当减轻锯齿效果,但需要以额外的软件或者硬件来实现。

通常的,我们利用画图算法,在屏幕上生成任意一段八分之一圆弧,再利用图的对称性,将那段圆弧扩展为一个整1.圆的特征圆被定义为到给定中心位置(x,y)距离为r的点集。

圆心位于远点的圆有4条对称轴:分别为:x=0,y=0,x=y,x=-y.若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他7个点,这个性质叫做8对称型。

因此只要扫描转换八分之一圆弧,就可以求出整个圆弧的像素集。

2.生成圆的中点算法在第i点已经选择A时,第i+1点只能选择B或C,D为圆弧与直线BC的交点,M为线段BC的中点,M在圆内选B,M在圆外选C设圆的方程为F(x,y)=0,M在圆内时F(M)<0, M在圆外时F(M)>0 ,M在圆上时F(M)=0主要算法:设d i=F(M),则d i>0,选C;d i< = 0,选Bd i=F(x i +1,y i,r - 1/2)= (x i +1)2+(y i,r - 1/2)2- R2d i+1=F(x i+1 +1,y i+1,r - 1/2)= (x i+1 +1)2+(y i+1,r - 1/2)2- R2初始条件:(x0,y0,r)=(0,R)d0=F(x0 +1,y0,r – 1/2)=5/4-R结束条件:x i>=y i圆心为任意点(x c,y c)。

用高级语言实现圆的生成(圆的扫描转换)

用高级语言实现圆的生成(圆的扫描转换)

集美大学计算机工程学院实验报告课程名称计算机图形学教程实验名称实验三、用高级语言实现圆的生成(圆的扫描转换)实验类型设计型姓名罗忠霖学号2010810072日期11月28日地点陆大206成绩教师庄建东一、实验目的:1、培养学生动手编程解决实际问题的能力。

2、训练学生分析问题和调试程序的能力。

3、锻炼学生撰写科技实验论文的能力二、实验内容:组1:用中点画圆弧方法1.先画半径为100的1/4圆弧2.半径依次递减1个单位,再画同一个圆心的1/4圆弧3.直到半径为504.过程要有延时5.若在递减1个单位的同时,画出7种颜色,如何做?三、实验要求:1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。

1). 了解圆弧的扫描转换方法;2). 掌握圆弧的扫描转换方法的原理及其实现方法;3).掌握圆弧的生成方法;4).课时:22、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。

(2)最后准备调试程序的数据及测试方案。

3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。

(2)调试前,先运行一遍程序看看究竟将会发生什么。

(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。

4、整理实习报告实验报告1、实习内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。

3、设计:数据结构设计和核心算法设计。

主要功能模块的输入,处理(算法框架)和输出。

4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。

5、心得:包括程序的改进设想,经验和体会。

6、程序清单:源程序,其中包括变量说明及详细的注释。

四、实验环境:1.PC,CPU:P4 2.0GHz以上,内存:512M,硬盘:40GB以上;2.操作系统:Microsoft Windows 2000 /2003/XP;3.软件:VC或JAVA等。

五、实验内容及完成情况:采用中点画圆弧方法#include "graphics.h"#include "math.h"#include "stdio.h"#include "conio.h"#include "stdlib.h"void WholeCircle(int xc, int yc, int x, int y, int color){putpixel (xc + x,yc - y,color);putpixel (xc + y,yc-x,color);}void MidpointCircle (int xc, int yc, int x,int y,int d,int r, int color) {WholeCircle(xc,yc,x,y,color);while(x<=y){ if(d<0){d+=2 * x+3;x++;}else{d+=2*(x-y)+ 5;x++; y--;}WholeCircle(xc,yc,x,y,color);}}void main(){int xc=300,yc=200,r=100,color=7;int x=0, y=r,d=1-r;int driver=DETECT,mode=0;initgraph(&driver,&mode,"");printf("\n 计算1013 罗忠霖 2010810072\n");for(;y>=50;y--,color--){MidpointCircle(xc,yc,x,y,d,r,color);if(color==-1)color=7;delay(100);}getch();}运行结果:六、实验总结:1.通过本次实验,初步了解了计算机图形学在计算机图像处理,工程制图,平面设计上面的应用,2.掌握了计算机绘制圆的几种算法,圆的生成算法,圆的生成算法,和圆的参数生成方法。

圆及圆弧生成算法

圆及圆弧生成算法
当xi+1= xi, yi+1= yi-1时,
F (xi1, yi1) (xi xc )2 ( yi 1 yc )2 R2 (xi xc )2 ( yi yc )2 2( yi xc ) 1 F (xi , yi ) 2( yi xc ) 1
结论——第一个1/4圆弧的正负法算法:
已知圆心坐标为(xc,yc),半径为R,F (x, y) (x xc )2 ( y yc )2 R2
起始点(x0,y0) x0=xc y0=yc+R
F( x0 , y 0 ) 0
若F(xi,yi) ≤0 (点在内侧,下一点选外侧)
xi+1= xi+1, yi+1= yi
移动到V点
Xi+1=xi yi+1=yi-1 Δi+1 = Δi-2yi+1 +1
P(xi,yi)
V(xi,yi-1)
H(xi+1,yi)
D(xi+1,yi-1)
正负法绘制的圆
Bresenham法绘制的圆
圆弧的Bresenham算法的优点:起点和终点准确,分布均匀,计算简单。
举例: 画圆心为(0,0),半径R=8的四分之一的圆弧
则 F (xi1, yi1) (xi1 xc )2 ( yi1 yc )2 R2 当xi+1= xi+1, yi+1= yi时,
F (xi1, yi1) (xi 1 xc )2 ( yi yc )2 R2 (xi xc )2 ( yi yc )2 2(xi xc ) 1 F (xi , yi ) 2(xi xc ) 1
归纳总结:

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

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

洛阳理工学院实验报告用纸(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画圆算法最终效果图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.调试、编译、运行程序。
相关文档
最新文档