基于C语言的花朵绘制程序设计报告文档格式.docx
《基于C语言的花朵绘制程序设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《基于C语言的花朵绘制程序设计报告文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
2.1.1功能简介
因为在VC下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows编程,所以Windows绘图太复杂了。
因此,我们想给大家一个更好的学习平台,就是VC方便的开发平台和TC简单的绘图功能,于是就有了这个EasyX库。
如果您刚开始学C语言,或者您是一位教C语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。
2.1.2图形数据包组成
(1)putpixel()画像素点函数
功能:
函数putpixel()在图形模式下屏幕上画一个像素点。
用法:
函数调用方式为voidputpixel(intx,inty,intcolor);
说明:
参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。
此函数相应的头文件是graphics.h
返回值:
无
(2)getpixel()返回像素色函数
函数getpixel()返回像素点颜色值。
该函数调用方式为intgetpixel(intx,inty);
参数x,y为像素点坐标。
函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数)。
这个函数相应的头文件为graphics.h
返回一个像素点色彩值。
(3)line()画线函数
函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。
该函数调用方式为voidline(intstartx,intstarty,intendx,intendy);
参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。
此函数相应的头文件为graphics.h
(4)lineto()画线函数
函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。
此函数调用方式为voidlineto(intx,inty);
参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。
该函数对应的头文件为graphics.h
(5)linerel()相对画线函数
函数linerel()使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。
这个函数调用方式为voidlinerel(intdx,intdy);
参数dx,dy分别是水平偏移距离和垂直偏移距离。
函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。
无
(6)setlinestyle()设置线型函数
setlinestyle()为画线函数设置当前线型,包括线型、线图样和线宽。
setlinestyle()函数调用方式为voidsetlinestyle(intstly,unsignedpattern,intwigth);
参数style为线型取值,也可以用相应名称表示。
。
参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中“1”位对应的像素显示,因此,pattern=0xFFFF,则画实线;
pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。
若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。
这个函数的头文件是graphics.h
(7)getlinesettings()获取线型设置函数
函数getlinesettings()用当前设置的线型、线图样和线宽填写linesettingstype型结构。
函数调用方式为voidgetlinesettings(structlinesettingstype*info);
此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。
linesettingstype型结构定义如下:
structlinesettingstype{
intlinestyle;
unsignedupattern;
intthickness;
};
其中linestyle用于存放线型,线型值为中的各值之一。
upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。
thickness为线宽值存放的变量。
getlinesettings()函数对应的头文件为graphics.h
返回的线型设置存放在info指向的结构中。
(8)setwritemode()设置画线模式函数
函数setwritemode()设置画线模式
函数调用方式为voidsetwritemode()(intmode);
参数mode只有两个取值0和1,若mode为0,则新画的线将覆盖屏幕上原有的图形,此为缺省画线输出模式。
如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。
调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。
setwritemode()函数对应的头文件是graphics.h
(9)rectangle()画矩形函数
函数rectangle()用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。
此函数调用方式为voidrectangle(intleft,inttop,intright,intbottom);
参数left,top是左上角点坐标,right,bottom是右下角点坐标。
如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真
(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。
这个函数对应的头文件为graphics.h
(10)函数bar()画条函数
函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。
bar()函数调用方式为voidbar(intleft,inttop,intright,intbottom);
说明:
参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。
注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。
这应的头文件为graphics.h
(11)bar3d()画条块函数
函数bar3d()使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填充色填充该三维条块的表面。
此函数调用方式为voidbar3d(intleft,inttop,intright,intbottom,intdepth,inttopflag);
参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。
参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。
深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:
1)。
参数topflag相当于一个布尔参数,如果设置为1(真)那么条块上放一顶面;
若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。
要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色。
bar3d()函数对应的头文件为graphics.h
无
(12)drawpoly()画多边形函数
函数drawpoly()用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。
此函数调用方式为voiddrawpoly(intpnumber,int*points);
参数pnumber为多边形的顶点数;
参数points指向整型数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。
显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。
另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。
drawpoly()函数对应的头文件为grpahics.h
(13)getaspectratio()获取纵横比函数
函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。
此函数调用方式为voidgetaspectratio(intxasp,intyasp);
参数xasp指向的变量存放返回的x方向比例系数;
参数yasp指向的变量存放返回的y方向比例系数。
通常y方向比例系数为10000,x方向比例系数不大于10000(这是因为大多数屏幕像素高比宽长)。
注意:
纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。
但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。
纵横比可用于其它几何图形,目的是校正和显示图形。
getaspectratio()函数对应的头文件为graphics.h
返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。
(14)circle()画圆函数
函数circle()使用当前绘图色并以实线画一个完整的圆。
用法:
该函数调用方式为voidcircle(intx,inty,intradius);
说明:
参数x,y为圆心坐标,radius为圆半径,用像素个素表示。
注意:
调用circle()函数画圆时不用当前线型。
不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。
此函数对应的头文件为graphics.h
返回值:
(15)arc()画圆弧函数
功能:
函数arc()使用当前绘图色并以实线画一圆弧。
函数调用方式为voidarc(intx,inty,intstartangle,intendangle,intradius);
参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。
圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。
同往常一样,360度与0度重合。
角度按逆时针方向增加,但并不要求终止角一定比起始角大。
例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。
大于360度可作为参数,它将被化到0度 ̄360度范围里。
函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。
此函数中,屏显纵横比可自动调节。
arc()函数对应的头文件为graphics.h
无
2.2conio.h
conio.h不是C标准库中的头文件,在Cstandardlibrary,ISOC和POSIX标准中均没有定义。
conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
大部分DOS,Windows3.x,PharLap,DOSX,OS/2orWin32平台上的C编译器提供此文件,UNIX和Linux平台的c编译器通常不包含此头文件。
2.3Sleep()函数
函数名:
sleep
功能:
执行挂起一段时间
用法:
unsignedsleep(unsignedseconds);
3系统设计
3.1需求分析
3.1.1功能需求
应用C语言的图形数据包Graphics.h中相关函数,首先绘制一个花瓣逐渐(间隔0.5秒)开放的花朵;
然后依次绘制第二朵、第三朵、……,直至绘制出一束花朵后停止
3.1.2编程环境
VC++6.0(带有Easyx插件)
3.2功能简述
3.2.1Initgraph()
initgraph()
初始化图形系统
函数原型:
voidfarinitgraph(intfar*graphdriver,intfar*graphmode,charfar*pathtodriver);
graphdriver是上涨指向图形驱动序号变量的指针;
graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。
pathtodriver表示存放图形驱动文件的路径。
3.2.2Initgraph()
Initgraph()
该函数用指定的颜色值来设置当前的背景色,如果指定的颜色值超出了当前设备的表示范围,则设置为最近似的、设备可以表示的颜色。
原背景色的COLORREF值。
3.2.3cleardevice()
cleardevice
清除图形屏幕
无。
3.2.4main()
r=d*(1+1/48*sin(24*i))*(1+sin(3*i));
/*设置花朵半径,使其呈周期性变化。
其中1/48用来改变半径变化幅度,24与3用来改变变化周期*/
x=r*cos(0.3*i+PI/60);
/*设置连线坐标X轴的变化,呈周期性变化。
其中0.3改变周期,PI/60改变初始位置*/
y=r*sin(0.3*i+PI/60);
/*设置连线坐标Y轴的变化,呈周期性变化。
4功能实现
总结与体会:
总结:
本次的学年设计我们组题目是基于c语言的花朵绘制(用graphics.h函数),主要是用c语言编写一个程序使其在计算机显示出不同的花瓣,最后出现一束漂亮的花。
由于我们之前没有接触过graphics.h函数。
于是我们就从网上、相关书籍找到相应知识,对graphics.h函数进行学习和运用,并在老师的指导下,我们最终很好的完成了本次的学年设计!
学年设计最大的一个问题就是程序,如何编写一个简单而又实用的程序是一个挑战。
因为我们不知道在编写程序的过程中会遇到什么样的问题,所以在编写程序之前我们已经做了还算很充分得准备,但尽管如此,我们在编写程序以及运行程序的过程中还是遇到了很多棘手的问题。
首先是这个程序中要用到很多之前我们没有了解过的有关绘图的函数,我们必须要先熟悉了解这些函数的特性,然后才能对其加以运用。
然而在理解这些函数过程中,并没有想象的那么顺利,也出现了很多问题,不过在老师的帮助下,还有我们通过网络的学习,总算对这些函数有了深刻的了解,并可以进行熟练地运用,通过这些我们才能在编程的道路上走得很顺利。
不过除了我们不了解的函数外,仍有一些不大不小的问题困扰着我们。
有一些明显的程序错误,不过仍有一些语法上的错误。
针对这些问题,我们对程序进行了反复的修改,然后运行,再修改,在运行。
就这样,经过我们不断的实验,一个完整的程序算编写出来了。
不过由于我们的程序比较简短,我们又对其进行了一些简单的修改,使其看起来不那么短小,并且实现的功能又有些增加。
体会:
一周的时间很快就这样过去了,作为c语言graphics.h库函数初学者的我们,在一周的时间内完成基于c语言的花朵绘制的开发、设计并实现相应的要求。
对于这个结果,我们组的每个成员都非常开心,因为我们都对此次设计做出了一些贡献,我们享受开心团队合作的快乐,在设计过程中我们有过分歧,做过讨论,请教过老师,不过最终我们统一了意见,共同努力,很好的完成了老师给我们的题目。
俗话说“三个臭皮匠,顶个诸葛亮”,这就是团队的力量!
尽管这次的课程设计的内容我们在书本上没有学过太多,但是我们每个人都抱有很认真的学习态度。
对我们来说,完成老师给定的任务固然很重要,但我个人认为我们学习的过程更加重要。
现在觉得自己掌握的c语言知识比课堂上学到的多很多,同时对其他编程语言的学习也有了一定的帮助。
此次的学年设计,我体会到了学习并不一定要从课堂上,只要我们有认真学习的态度以及意识,从哪里都能学到我们没有学过的知识。
另外,团队的合作也很重要,因为每个人都知道自己要做什么,所以我们的学年设计才能完成的很好。
除了这些,我还想说在以后的学习道路上,我们肯定会遇到这样或那样的问题,只要我们保持一颗勇敢的心,无论遇到什么困难,都不要轻言放弃,只有这样我们才能学到更多的知识。
参考文献:
【1】何钦铭,颜晖.C语言程序设计.【M】.杭州:
浙江科技出版社,2004.73-110
【2】
附录
#include<
graphics.h>
conio.h>
math.h>
#definePI3.14159
voidmain()
{
intm=400,n=200,d=80;
floatr,x,y;
initgraph(800,800);
//创建绘图窗口
setbkcolor(WHITE);
//设置背景色为白色
cleardevice();
//清屏
for(inta=0;
a<
10;
a++)
{
for(doublei=0;
i<
=36;
i+=PI/360)
{
r=d*(1+1/48*sin(24*i))*(1+sin(3*i));
x=r*cos(0.3*i+PI/60);
y=r*sin(0.3*i+PI/60);
if(a%5==0)
setcolor(RED);
if(a%5==1)
setcolor(BLUE);
if(a%5==2)
setcolor(GREEN);
if(a%5==3)
setcolor(YELLOW);
if(a%5==4)
setcolor(MAGENTA);
line(m,n,m+x,n+y);
}
d=d-5;
Sleep(500);
}
getch();
closegraph();
}
致谢
在查阅大量文献和深入校园进行实地调查走访,并且经过不断的思考和反复的修改之后,我们的终于设计出了该作业的雏形。
后来,在杨传建老师的带领下我们便在此基础上对其进行深入拓展。
将其结构严谨化,功能优越化。
为此,我们整个团队深深感谢杨传建老师给我们带来的帮助。
希望在今后我们可以和杨传建老师在学习上的契合度不断优越,从而赢取累累硕果。
评语:
评阅教师签名:
年月日
成绩