计算机图形学圆的生成算法的实现
- 格式:doc
- 大小:274.50 KB
- 文档页数:9


1 实验三:圆的生成算法的实现
班级 08信计2 学号 64 姓名刘辉 分数
一、实验目的和要求
1.理解圆生成的基本原理,掌握几种常见的圆生成算法。
2.利用Visual C++ 实现圆生成的中点画圆的算法。
3.利用Visual C++ 实现圆的Bresenham算法。
4.简单了解其他算法。
二、实验内容:
1.利用中点画图算法,在屏幕上生成任意一段圆弧。
2.利用图的对称性,将(1)题生成的圆弧扩展为一个整圆。
3.利用bresebham算法设计出一段圆弧。
三、实验步骤:
1.预习教材关于圆的生成原理。
2.仿照教材关于圆生成的中点画圆算法和bresenham算法,使用C++实现该算法。
3.调试、编译、运行程序。
利用bresenham算法生成圆的代码:
#include
#include
#include
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)
{ 2 int x =type = 0;/*初始横坐标为原点*/
int y = radius; /*初始纵坐标远离原点*/
int delta = 2*(1-radius);
int direction;
while (y >= 0)
计算机科学与技术学院
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)。这时可以把改点带入所在直线方程,可以观察该中点与直线的位置关系。若F(M)>0,则直线的改点上方,所以下一像素点应取P2点,否则取P1点。此后将该点作为基点,以此类推直到(x1,y1)将得到的各点扫描出来即可。
- 1 - C语言随机数求圆周率
圆周率是一个神秘而又神奇的数学常数,它是圆的周长与直径的比值,通常用希腊字母π表示。在数学中,π是无理数,它的小数部分是无限不循环的,因此也被称为无限小数。
在计算机科学中,圆周率也是一个非常重要的数值常数。它被广泛应用于计算机图形学、密码学、物理学、统计学等领域。因此,如何高效地计算圆周率成为了一个热门话题。
在本文中,我们将介绍一种使用C语言随机数求圆周率的方法。这种方法简单易懂,代码量较小,是初学者学习C语言的好方法。
首先,让我们来看一下圆周率的计算公式:
π = 4 * (1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ...)
这个公式是莱布尼茨级数的一种形式,它可以用来计算π的近似值。但是,这个公式的计算复杂度较高,因为它需要计算无限多个分数。
接下来,让我们来看一种更加简单的方法:蒙特卡罗方法。
蒙特卡罗方法是一种随机模拟方法,它通过随机抽样来计算数值。在计算圆周率时,我们可以随机生成一些点,并统计落在圆内的点的个数和总点数。根据圆的面积和正方形的面积的比值,可以计算出圆周率的近似值。
具体来说,我们可以在一个正方形内随机生成n个点,然后统计落在圆内的点的个数k。根据圆的面积和正方形的面积的比值, - 2 - 我们可以得到以下公式:
π ≈ 4 * k / n
这个公式是基于概率统计原理的,它的精度和n的大小有关。当n越大时,计算出的π的近似值越接近真实值。
接下来,让我们来看一下如何用C语言实现这个算法。
首先,我们需要用C语言生成随机数。C语言提供了rand()函数来生成伪随机数。这个函数返回一个0到RAND_MAX之间的整数,RAND_MAX是一个常数,它通常是32767。
然后,我们需要将随机数映射到正方形内的某个点上。假设正方形的边长为2,圆的直径为2,圆心在正方形的中心,我们可以用以下公式来计算随机点的坐标:
计算机图形学——圆的扫描转换(基本光栅图形算法)
与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。本篇博客将讨论圆弧⽣成的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步:x
0=0,y
0=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),选择道理同上。