模糊控制c语言言,图可能有点糊。。

图 C语言图的建立及BFS,DFS遍历 - 为程序员服务
为程序员服务
C语言图的建立及BFS,DFS遍历
#include &stdio.h&
#include &malloc.h&
#include &stdlib.h&
#define MAX 20
//图可以存储的最大节点数为20;
struct tnode
struct tnode *//指向下一个临节点
//存放邻节点在数组中的位置
struct node
//存放节点的值
struct tnode *//指向邻节点
struct picture
struct node nd[MAX];
//声明一个节点数组
//图中的节点数
//建立的图的类型
struct picture * createpicture();
int search(struct picture *p,int value);//查找value在nd数组中的位置
void bfs(struct picture * q,int i,int visit[]); //广度优先遍历
void dfs(struct picture * q,int i,int visit[]);//深度优先遍历
void traversedfs(struct picture *p);
void traversebfs(struct picture *p);
int main()
struct picture *p;
p=createpicture();
getchar();
printf(&现在将对图进行遍历,若使用广度优先遍历,请输入a,若使用深度优先遍历请输入b,清屏请输入c,退出请输入d:\n&);
scanf(&%c&,&a);
if(a=='a')
printf(&深度优先遍历如下:\n&);
traversebfs(p);
if(a=='b')
printf(&广度优先遍历如下:\n&);
traversedfs(p);
if(a=='c')
system(&cls&);
if(a=='d')
struct picture * createpicture()
int i,j,k,l;//l中存放返回的节点在数组中的位置
struct picture *p;
p=(struct picture *)malloc(sizeof(struct picture));
struct tnode *
printf(&请输入你要建立的图中的节点数以及图的类型(a表示无向图b表示有向图):\n&);
scanf(&%d %c&,&i,&a);
p-&count=i;
printf(&请依次输入各节点的值(每输完一个节点的值按回车结束):\n&);
for(i=0;i&p-&i++)
scanf(&%d&,&j);
p-&nd[i].valu=j;
p-&nd[i].link=NULL;
for(i=0;i&p-&i++)
printf(&输入与数据值为%d的节点相邻的节点的数据值(每输完一个节点的值按回车结束),若不再含有相邻的值请输入-1\n&,p-&nd[i].valu);
scanf(&%d&,&k);
l=search(p,k);
t=(struct tnode *)malloc(sizeof(struct tnode));
t-&data=l;
t-&next=p-&nd[i].
p-&nd[i].link=t;
printf(&无此数据值!\n&);
//getchar();
int search(struct picture *p,int value)
for(i=0;i&p-&i++)
if(value==p-&nd[i].valu)
return -1;
void traversedfs(struct picture *p)
int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
for(i=0;i&p-&i++)
visit[i]=0;
for(i=0;i&p-&i++)
if(visit[i]==0)
dfs(p,i,visit);
//getchar();
void dfs(struct picture * q,int i,int visit[])//i表示数组的下标值visit的下标与p中的下标是一一对应的关系
struct tnode *
printf(&%d\n&,q-&nd[i].valu);
visit[i]=1;
w=q-&nd[i].
while(w!=NULL)
if(visit[w-&data]==0)
dfs(q,w-&data,visit);
void traversebfs(struct picture *p)
int visit[MAX];//申明一个标志数组,将其初始值置为0,0表示该节点未被访问过,1表示该节点被访问过
for(i=0;i&p-&i++)
visit[i]=0;
for(i=0;i&p-&i++)
if(visit[i]==0)
bfs(p,i,visit);
//getchar();
void bfs(struct picture * q,int i,int visit[])
struct tnode *w;
int a[MAX];//声明一个队列
visit[i]=1;
printf(&%d\n&,q-&nd[i].valu);
r++;//进行入队操作
while(f!=r)
f++;//岀队操作
w=q-&nd[v].
while(w!=NULL)
if(visit[w-&data]==0)
visit[w-&data]=1;
printf(&%d\n&,q-&nd[w-&data].valu);
您可能的代码
相关聚客文章
荣誉:1217
相关专栏文章C语言模糊查询问题_百度知道
C语言模糊查询问题
我有一个结构体,结构体里面有姓名,英文名,性别,年龄等,假设有一个名字叫张三,英文名Elmo,性别男,年龄17,我查询三或是张,就会查出张三这个结构体以及所有包括关键词的结构体,我查询17也会查出张三这个结构体以及所有包括17的结构体,性别也是一样,...
我有更好的答案
举例:struct human { char name[20],ename[20],sex[3], } table[1024];输入查找的字段 char fstr[128]; scanf(&%s&,fstr);将当前需要判别的结构所有字段输出到一个字符串:char str[128];sprintf(str,&%s%s%s%d&,table[i].name,table[i].ename,table[i].sex,table[i].age);这样字符串的内容如同:&张三Elmo男17&然后在上述字符串中用strstr函数查找子串,如果返回值不为NULL则找到:if ( strstr(str,fstr) )
{ //显示此记录 }
采纳率:83%
来自团队:
为您推荐:
其他类似问题
模糊查询的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。四、图形和图像函数(一) 像素函数&&& 56. putpiel() 画像素点函数&&& 57. getpixel()返回像素色函数(二) 直线和线型函数&&& 58. line() 画线函数&&& 59. lineto() 画线函数&&& 60. linerel() 相对画线函数&&& 61. setlinestyle() 设置线型函数&&& 62. getlinesettings() 获取线型设置函数&&& 63. setwritemode() 设置画线模式函数(三)、多边形函数&&& 64. rectangle() 画矩形函数&&& 65. bar() 画条函数&&& 66. bar3d() 画条块函数&&& 67. drawpoly() 画多边形函数(四)、 圆、弧和曲线函数&&& 68. getaspectratio()获取纵横比函数&&& 69. circle()画圆函数&&& 70. arc() 画圆弧函数&&& 71. ellipse()画椭圆弧函数&&& 72. fillellipse() 画椭圆区函数&&& 73. pieslice() 画扇区函数&&& 74. sector() 画椭圆扇区函数&&& 75. getarccoords()获取圆弧坐标函数(五)、 填充函数&&& 76. setfillstyle() 设置填充图样和颜色函数&&& 77. setfillpattern() 设置用户图样函数&&& 78. floodfill() 填充闭域函数&&& 79. fillpoly() 填充多边形函数&&& 80. getfillsettings() 获取填充设置函数&&& 81. getfillpattern() 获取用户图样设置函数(六)、图像函数&&& 82. imagesize() 图像存储大小函数&&& 83. getimage() 保存图像函数&&& 84. putimage() 输出图像函数
四、图形和图像函数&& 对许多图形应用程序,直线和曲线是非常有用的。但对有些图形只能靠操作单个像素才能画出。当然如果没有画像素的功能,就无法操作直线和曲线的函数。而且通过大规模使用像素功能,整个图形就可以保存、写、擦除和与屏幕上的原有图形进行叠加。(一) 像素函数
56. putpixel() 画像素点函数功能: 函数putpixel() 在图形模式下屏幕上画一个像素点。用法: 函数调用方式为void putpixel(int x,int y,int color);说明: 参数x,y为像素点的坐标,color是该像素点的颜色,它可以是颜色符号名,也可以是整型色彩值。&&&&&& 此函数相应的头文件是graphics.h返回值: 无例: 在屏幕上(6,8)处画一个红色像素点:&& putpixel(6,8,RED);
57. getpixel()返回像素色函数功能: 函数getpixel()返回像素点颜色值。用法: 该函数调用方式为int getpixel(int x,int y);说明: 参数x,y为像素点坐标。&&&&&& 函数的返回值可以不反映实际彩色值,这取决于调色板的设置情况(参见setpalette()函数)。&&&&&& 这个函数相应的头文件为graphics.h返回值: 返回一个像素点色彩值。例: 把屏幕上(8,6)点的像素颜色值赋给变量color。&& color=getpixel(8,6);
(二) 直线和线型函数&& 有三个画直线的函数,即line(),lineto(),linerel()。这些直线使用整型坐标,并相对于当前图形视口,但不一定受视口限制,如果视口裁剪标志clip为真,那么直线将受到视口边缘截断;如果clip为假,即使终点坐标或新的当前位置在图形视口或屏幕极限之外,直线截断到屏幕极限。&& 有两种线宽及几种线型可供选择,也可以自己定义线图样。下面分别介绍直线和线型函数。
58. line() 画线函数功能: 函数line()使用当前绘图色、线型及线宽,在给定的两点间画一直线。用法: 该函数调用方式为void line(int startx,int starty,int endx,int endy);说明: 参数startx,starty为起点坐标,endx,endy为终点坐标,函数调用前后,图形状态下屏幕光标(一般不可见)当前位置不改变。&&&&&& 此函数相应的头文件为graphics.h返回值: 无例: 见函数60.linerel()中的实例。
59. lineto() 画线函数功能: 函数lineto()使用当前绘图色、线型及线宽,从当前位置画一直线到指定位置。用法: 此函数调用方式为void lineto(int x,int y);说明: 参数x,y为指定点的坐标,函数调用后,当前位置改变到指定点(x,y)。&&&&&& 该函数对应的头文件为graphics.h返回值: 无例: 见函数60.linerel()中的实例。
60.linerel() 相对画线函数功能: 函数linerel() 使用当前绘图色、线型及线宽,从当前位置开始,按指定的水平和垂直偏移距离画一直线。用法: 这个函数调用方式为void linerel(int dx,int dy);说明: 参数dx,dy分别是水平偏移距离和垂直偏移距离。&&&&&& 函数调用后,当前位置变为增加偏移距离后的位置,例如,原来的位置是(8,6),调用函数linerel(10,18)后,当前位置为(18,24)。返回值:无例: 下面的程序为画线函数调用实例:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& setcolor(15);&& line(66,66,88,88);&& lineto(100,100);&& linerel(36,64);&& getch();&& restorecrtmode();}
61. setlinestyle() 设置线型函数功能: setlinestyle() 为画线函数设置当前线型,包括线型、线图样和线宽。用法: setlinestyle() 函数调用方式为void setlinestyle(int stly,unsigned pattern,int width);说明: 参数style为线型取值,也可以用相应名称表示,如表1-10中所示。&&&&&& 参数pattern用于自定义线图样,它是16位(bit)字,只有当style=USERBIT_LINE(值为1)时,pattern的值才有意义,使用用户自定义线图样,与图样中位对应的像素显示,因此,pattern=0xFFFF,则画实线;pattern=0x9999,则画每隔两个像素交替显示的虚线,如果要画长虚线,那么pattern的值可为0xFF00和0xF00F,当style不为USERBIT_LINE值时,虽然pattern的值不起作用,但扔须为它提供一个值,一般取为0。&&& 参数wigth用来设定线宽,其取值见表1-11,表中给出了两个值,即1和3,实际上,线宽取值为2也是可以接受的。&&& 若用非法参数调用setlinestyle()函数,那么graphresult()会返回错误代码,并且当前线型继续有效。&&& Turbo C提供的线型与线宽定义在头文件graphics.h中,表1-10和1-11分别列出了参数的取值与含义。
表1-10& 线型-----------------------------------------------------&& 名&&&&&&& 称&&&&& 取 值&&&&&&&& 含&&& 义-----------------------------------------------------&& SOLID_LINE&&&&&&&&& 0&&&&&&&&&&&& 实线&& DOTTED_LINE&&&&&&&& 1&&&&&&&&&&&& 点线&& CNTER_LINE&&&&&&&&& 2&&&&&&&&&&&& 中心线&& DASHED_LINE&&&&&&&& 3&&&&&&&&&&&& 虚线&& USERBIT_LINE&&&&&&& 4&&&&&&&&&&&& 用户自定义线型-----------------------------------------------------
表1-11 线宽-----------------------------------------------------------&& 名&&&&&&&& 称&&&&&&&&&&& 取& 值&&&&& 说&& 明-----------------------------------------------------------&& NORM_WIDTH(常宽)&&&&&&&&&& 1&&&&&&&& 一个像素宽(缺省值)&& THICK_WIDTH(加宽)&&&&&&&&& 3&&&&&&&& 三个像素宽-----------------------------------------------------------
这个函数的头文件是graphics.h返回值: 无例: 下面的程序显示了BC中所提供的线型图样:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& for(i=0;i&4;i++)&& {&&&&& setlinestyle(i,0,1);&&&&& line(i*50,200,i*50+60,200)&& }&& getch();&& restorecrtmode();}
62. getlinesettings() 获取线型设置函数功能: 函数getlinesettings() 用当前设置的线型、线图样和线宽填 写linesettingstype型结构。用法: 函数调用方式为void getlinesettings(struct linesettingstype *info);说明: 此函数调用执行后,当前的线型、线图样和线宽值被装入info指向的结构里,从而可从该结构中获得线型设置。&& linesettingstype型结构定义如下:&& struct linesettingstype {&&&&&&&&&&&&&&&&& };&& 其中linestyle用于存放线型,线型值为表1-10中的各值之一。&& upattern用为装入用户自定义线图样,这是16位字,每一位等于一个像素,如果哪个位被设置,那么该像素打开,否则关闭。&& thickness为线宽值存放的变量,可参见表1-11。&& getlinesettings()函数对应的头文件为graphics.h返回值: 返回的线型设置存放在info指向的结构中。例: 把当前线型的设置写入info结构:&& struct l&& getlinesettings(&info);
63.setwritemode() 设置画线模式函数功能: 函数setwritemode() 设置画线模式用法: 函数调用方式为 void setwritemode()(int mode);说明: 参数mode只有两个取值0和1,若mode为0,则新画的线将复盖屏幕上原有的图形,此为缺省画线输出模式。如果mode为1,那么新画的像素点与原有图形的像素点先进行异或(XOR)运算,然后输出到屏幕上,使用这种画线输出模式,第二次画同一图形时,将擦除该图形。调用setwritemode()设置的画线输出模式只影响函数line(),lineto(),linerel(),recangle()和drawpoly()。&&&&&& setwritemode()函数对应的头文件是graphics.h返回值: 无例: 设置画线输出模式为0:&& setwritemode(0);
(三)、多边形函数&& 对多边形,无疑可用画直线函数来画出它,但直接提供画多边形的函数会给用户很大方便。最常见的多边形有矩形、矩形块(或称条形)、多边形和多边形块,我们还把长方形条块也放到这里一起考虑,虽然它不是多边形,但它的特例就是矩形(块)。下面直接介绍画多边形的函数。
64. rectangle() 画矩形函数功能: 函数rectangle() 用当前绘图色、线型及线宽,画一个给定左上角与右下角的矩形(正方形或长方形)。用法: 此函数调用方式为void rectangle(int left,int top,int right,int bottom);说明: 参数left,top是左上角点坐标,right,bottom是右下角点坐标。如果有一个以上角点不在当前图形视口内,且裁剪标志clip设置的是真(1),那么调用该函数后,只有在图形视口内的矩形部分才被画出。&&&&& 这个函数对应的头文件为graphics.h返回值: 无例: 下面的程序画一些矩形实例:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgrpah(&driver,&mode,"");&& rectangle(80,80,220,200);&& rectangle(140,99,180,300);&& rectangle(6,6,88,88);&& rectangle(168,72,260,360);&& getch();&& restorecrtmode();}
65. bar() 画条函数功能: 函数bar()用当前填充图样和填充色(注意不是给图色)画出一个指定上左上角与右下角的实心长条形(长方块或正方块),但没有四条边线)。用法: bar()函数调用方式为void bar(int left,int top,int right,int bottom);说明: 参数left,topright,bottom分别为左上角坐标与右下角坐标,它们和调用函数rectangle()的情形相同,调用此函数前,可用setfillstyle()或setfillpattern()设置当前填充图样和填充色。注意此函数只画没有边线的条形,如果要画有边线的的条形,可调用下面的函数bar3d()来画,并将深度参数设为0,同时topflag参数要设置为真,否则该条形无顶边线。&&&&& 这 应的头文件为graphics.h返回值: 无例: 见函数bar3d()中的实例。& 66.bar3d() 画条块函数功能: 函数bar3d() 使用当前绘图色、线型及线宽画出三维长方形条块,并用当前填充图样和填 充色填充该三维条块的表面。用法: 此函数调用方式为void bar3d(int left,int top,int right,int bottom,int depth,int topflag);说明: 参数left,top,right,bottom分另为左上角与右下角坐标,这与bar()函数中的一样。参数depth为条块的深度,以像素为单位,通常按宽度的四分之一计算。深度方向通过屏显纵横比调节为约45度(即这时x/y比设置为1:1)。参数topflag相当于一个布尔参数,如果设置为1(真)那么条块上放一顶面;若设置为0(假),则三维条形就没有顶面,这样可使多个三维条形叠加在一起。要使图形更加美观,可利用函数floodfill()或setfillpattern()来选择填充图样和填充色(参见本小节(五)填充函数 )。&&&&& bar3d()函数对应的头文件为graphics.h返回值: 无例: 下面的程序画一个条形和条块:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& setfillstyle(SOLID-FILL,GREEN);&& bar(60,80,220,160);&& setfillstyle(SOLID-FILL,RED);&& bar3d(260,180,360,240,20,1);&& getch();&& restorecrtmode();}
67. drawpoly() 画多边形函数功能: 函数drawpoly() 用当前绘图色、线型及线宽,画一个给定若干点所定义的多边形。用法: 此函数调用方式为void drawpoly(int pnumber,int *points);说明: 参数pnumber为多边形的顶点数;参数points指向整型数组,该数组中是多边形所有顶点(x,y)坐标值,即一系列整数对,x坐标值在前。显然整型数组的维数至少为顶点数的2倍,在定义了多边形所有顶点的数组polypoints时,顶点数目可通过计算sizeof(polypoints)除以2倍的sizeof(int)得到,这里除以2倍的原因是每个顶点有两个整数坐标值。另外有一点要注意,画一个n个顶点的闭合图形,顶点数必须等于n+1,并且最后一点(第n+1)点坐标必须等于第一点的坐标。&& drawpoly()函数对应的头文件为grpahics.h返回值: 无例: 下面的程序画一个封闭星形图与一个不封闭星形图:#include&graphics.h&void main(){&& int driver,&& static int polypoints1[18]={100,100,110,120,100,130,120,125,140,140,130,120,&& 140,110,120,115,100,100};&& static int polypoints2[18]={180,100,210,120,200,130,220,125,240,140,230,120,&& 240,110,220,115,220,110};&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& drawpoly(9,polypoints1);&& drawpoly(9,polypoints2);&& getch();&& restorecrtmode();}
(四)、 圆、弧和曲线函数&& 在一个屏幕上画得很圆的图形到另一个屏幕上可能被压扁或拉长,这是因为每一种显示卡与之相应的显示模式都有一个纵横比。纵横比是指像素的水平方向大小与垂直方向大小的比值。如VGA显示卡由于偈素基本上是正方形,所以纵横比为1.000。&& 为了保证几何图形基本按预计情况显示在屏幕上,用屏显的纵横比来计算和纠正不同硬件及显示卡产生的畸变。计算纵横比所需要的水平方向和垂直方向的比例系数可调用函数getaspectratio()获得。
68. getaspectratio()获取纵横比函数功能: 函数getaspectratio()返回x方向和y方向的比例系数,用这两个整型值可计算某一特定屏显的纵横比。用法: 此函数调用方式为void getaspectratio(int xasp,int yasp);说明: 参数xasp指向的变量存放返回的x方向比例系数;参数yasp指向的变量存放返回的y方向比例系数。通常y方向比例系数为10 000, x方向比例系数不大于10 000(这是因为大多数屏幕像素高比宽长)。&& 注意纵横比自动用作下面函数arc(),circle()和pieslice()中的标尺因子,使屏幕上圆或弧正常显示。但用ellipse()函数画椭圆必须调用本函数获取纵横比作为标尺因子,否则不予调整。纵横比可用于其它几何图形,目的是校正和显示图形。&& getaspectratio()函数对应的头文件为graphics.h返回值: 返回x与y方向比例系数分别存放在xasp和yasp所指向的变量中。例: 下面的程序显示纵横比:&& int xasp,&&&& getaspectratio(&xasp,&yasp);&& aspectratio=xasp/&& printf("aspect ratio: %f",aspectratio);
69. circle()画圆函数功能: 函数circle()使用当前绘图色并以实线画一个完整的圆。用法:该函数调用方式为void circle(int x,int y,int radius);说明: 参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。&& 不同于ellipse()函数,只用单个半径radius参数调用circle()函数,故屏显纵横比可以自动调节,以产生正确的显示图。&& 此函数对应的头文件为graphics.h返回值: 无例: 画六个同心圆,圆心在(100,100)。#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& circle(100,100,10);&& circle(100,100,20);&& circle(100,100,30);&& circle(100,100,40);&& circle(100,100,50);&& circle(100,100,60);&& getch();&& restorecrtmode();}
70. arc() 画圆弧函数功能: 函数arc()使用当前绘图色并以实线画一圆弧。用法: 函数调用方式为void arc(int x,int y,int startangle,int endangle,int radius);说明: 参数x,y为圆心坐标,startangle与endangle分别为起始角与终止角,radius为半径。圆心坐标和半径以像素个数给出,起始角和终止角以度为单位,0度位于右边,90度位于顶部,180度位于左边,底部是270度。同往常一样,360度与0度重合。角度按逆时针方向增加,但并不要求终止角一定比起始角大。例如指定300度和90度分别为起始角和终止角,与指定300度和450度分别为起始角和终止角可画出相同的弧。大于360度可作为参数,它将被化到0度 ̄360度范围里。函数arc()能画封闭圆,只要取起始角为0度,终止角为360度即可。此函数中,屏显纵横比可自动调节。&& arc()函数对应的头文件为graphics.h返回值: 无例: 以(200,200)为圆心,100为半径,从0度到120度画圆弧:#include&graphics.hvoid main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&drivwer,&mode,"");&& setcolor(WHITE);&& arc(200,200,0,120,100);&& getch();&& restorecrtmode();}
71. ellipse()画椭圆弧函数功能: 函数ellipse()使用当前绘图色画一椭圆弧。用法: 该函数调用方式为void ellipse(int x,int y,int startangle,int endangle,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& int xradius,int yradius);说明: 参数x,y为椭圆中心坐标,startangle和endangle为给定的起始角和终止角,xradius与yradius为椭圆的x轴半径与y轴半径,如果startangle为0 ,endangle等于360度,那么画出的是个完整的椭圆。ellipse()函数不同于arc()和circle()函数,屏显纵横比不能自动调节。若需要的是成比例的半径而不是特定的像素距离,则y轴距离必须调节为yradius*aspectratio(y轴半径乘以纵横比)。&& 此函数对应的头文件为graphics.h返回值: 无例: 在屏幕上画一个鸡蛋形的椭圆。#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& ellipse(200,100,0,360,80,40);&& getch();&& restorecrtmode();}
72. fillellipse() 画椭圆区函数功能: 函数fillellipse()使用当前绘图色画一椭圆,然后用当前填充色图样和填充色填充所画的椭圆。用法: 此函数调用方式为void fillellipse(int x,int y,int xradius,int yradius);说明: 参数x,y为椭圆中心坐标,xradius,yradius为水平轴半径和垂直轴半径。&&&&&& 这个函数对应的头文件为graphics.h返回值: 无例: 画一填充椭圆:#include&graphics.h&#include&stdio.h&#define R 60void main(){&& int driver,&& int xasp,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& fillellipse(getmaxx()/2,getaxy()/2,66,44);&& getaspectratio(&xasp,&yasp);&& fillellipse(R,R,R,R*(long)xasp/(long)yasp);&& getch();&& closegraph();}
73. pieslice() 画扇区函数功能: 函数pieslice()使用当前绘图色画一圆弧,并把弧两端与圆心分别连一直线段(即半径),然后用当前填图样和填充色进行填充,即得扇区。用法: 这个函数调用方式为void pieslice(int x,int y,int startangle,int endangle,int radius);说明: 函数pieslice()的操作类似于arc()函数(即同调用参数一样,只是函数名不同),因此调用此函数的详细说明参见函数arc()的相应内容。该函数对屏显纵横比能自动调节进行补偿。&& pieslice()函数对应的头文件为graphics.h返回值:无例: 显示一个扇形图,每45度为一个不同的扇区:#include&graphics.h&void main(){&& int driver,&& int i,start,&& driver=DETECT;&& mode=0;&& initgraph(&driver,mode,"");&& start=0;&& end=45;&& for(i=0;i&8;i++)&& {&&&&& setfillstyle(SOLID_FILL,i);&&&&& pieslice(260,200,start,end,100);&&&&& start+=45;&&&&& end+=45;&& }&& getch();&& restorecrtmode();}
74. sector() 画椭圆扇区函数功能: 函数sector()先用当前绘图色画椭圆扇形轮廓,然后用当前填充图样和填充色进行填充,即得椭圆扇区。用法: 该函数调用方式为void sector(int x,int y,int startangle,int endangle,int xradius,int yradius);说明: 参数x,y为椭圆中心坐标,startangle和endangle为起始角与终止角,xradius与yradius是水平轴半径和垂直轴半径即长短轴。当startangle为0,endangle为360度时,调用此函数可画得一个完整的椭圆区。角度增加方向为反时针方向。设定填充图样和填充色,用setfillstyle()或setfillpattern()函数,若画轮廓线或填充扇区出现错误,则graphresult()函数返回值-6。对屏显纵横比,sector()函数不能自动调节补偿。返回值: 无例: 画出两个椭圆扇区:#include&graphics.h&#include&stdio.h&#define R 80void main(){&& int driver,&& int xasp,&& initgraph(&driver,&mode,"");&& sector(getmaxx()/2,getmaxy()/2,0,656,R,R);&& getaspectratio(&xasp,&yasp);&& setctor(getmaxx()/2,getmaxy()/2,180,135,R,R*(long)xasp/(long)yasp);&& getch();&& closegraph();}
75. getarccoords()获取圆弧坐标函数功能: 函数getarccoords()将最后一次调用arc()或ellipse()画的圆弧或椭圆弧的起终点坐标和中心坐标填入arccoordstype型结构里,进而从该结构中获取这些坐标值。用法: getarccoords()函数调用方式为void getarccoords(struct arccoordstype *coordsp);说明: 调用此函数填写coordsp指向的结构,从而获得起终点坐标和中心坐标值。它们可用于画弦、半径以及其它与圆弧端点相连的直线等。pieslice()函数就要用到这些值。如果最后一次调用的函数是circle(),那么getarccoords()将返回圆心坐标和起终点坐标即圆的位置。&& arccoordstype型结构定义如下:&& struct arccoordstype {&&&&& int x,y;&&&&& int xstart,ystart,xend,&& };&& 其中,x,y存放中心坐标;xstart,ystart,xend,yend分别存放起终点坐标。&& 值得注意的是,结构里起终点(xstart,ystart)与(xend,yend)坐标是像素值,不是角度值,这和调用arc()或ellipse()函数所用的不一样。当然中心坐标(x,y)与调用函数时所用的是一样的。&& 这个函数的头文件是graphics.h返回值: 返回最后一次调用圆或椭圆函数的相应起终点与中心坐标值,并存放在coordsp指向的结构里。例: 下面的程序画圆心在(100,100)的四分之一圆弧,然后于弧两端点之间连一直线。#include&graphics.h&void main(){&& int driver,&& struct ar&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& arc(100,100,0,90,88);&& getarccoords(&arcinfo);&& line(arcinfo.xstart,arcinfo.ystart,arcinfo.xend,arcinfo.yend);&& getch();&& restorecrtmode();}
(五)、 填充函数&& 前面已经涉及到了用填充图样和填充色填充图形的问题,如调用pieslice()画扇区就要用填充图样与填充色来填充区域。那么怎样设置填充图样和填充色呢?我们只要简单地学习并练习一下就会掌握其方法。下面介绍用于设置填图样与填充色、建立用户自己的填充图样与填充封闭区域的几个常用函数。
76. setfillstyle() 设置填充图样和颜色函数功能:setfillstyle()设置填充图样和颜色函数功能: 函数setfillstyle()为各种图形函数设置填充图样和颜色。用法: 函数调用方式为void setfillstyle(int pattern,int color);说明: 参数pattern的值为填充图样,它们在头文件graphics.h中定义,详见表1-12所示。&& 参数color的值是填充色,它必须为当前显示模式所支持的有效值。&& 填充图样与填充色是独立的,可以是不同的值。
表1-12 填充图样-------------------------------------------------------------------&& 填充图样符号名&&&&&&&& 取值&&&&&&&&&&& 说明-------------------------------------------------------------------&& EMPTy_FILL&&&&&&&&&&&&&& 0&&&&&&&& 用背景色填充区域(空填)&& SOLID_FILL&&&&&&&&&&&&&& 1&&&&&&&& 用实填充色填充(实填)&& LINE_FILL&&&&&&&&&&&&&&& 2&&&&&&&& ----填充&& LTSLASH_FILL&&&&&&&&&&&& 3&&&&&&&& ///填充&& SLASH_FILL&&&&&&&&&&&&&& 4&&&&&&&& ///用粗线填充&& BKSLASH_FILL&&&&&&&&&&&& 5&&&&&&&& \\\用粗线填充&& LTBKSLASH_FILL&&&&&&&&&& 6&&&&&&&& \\\填充&& HATCH_FILL&&&&&&&&&&&&&& 7&&&&&&&& 网格线填充&& xHATCH_FILL&&&&&&&&&&&&& 8&&&&&&&& 斜网格线填充&& INTEREAVE_FILL&&&&&&&&&& 9&&&&&&&& 间隔点填充&& WIDE_DOT_FILL&&&&&&&&&&& 10&&&&&&& 大间隔点填充&& CLOSE_DOT_FILL&&&&&&&&&& 11&&&&&&& 小间隔点填充&& USER_FILL&&&&&&&&&&&&&&& 12&&&&&&& 用户定义图样填充-------------------------------------------------------------------
&& 除了EMPTy_FILL,所有填充图样都使用当前填充色,填充图样USER_FILL只有在用函数setfillpattern()已经建立一个用户定义的填充图样后才能使用。&& 此函数对应的头文件为graphics.h返回值: 无例: 下面的程序用HATCH_FILL填充一个矩形:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,mode,"");&& setcolor(GREEN);&& rectangle(80,200,200,300)&& setfillstyle(HATCH_FILL,RED);&& floodfill(160,240,GREEN);&& getch();&& restorecrtmode();}
77. setfillpattern() 设置用户图样函数功能: 函数setfillpattern() 设置用户的填充图样以供fllodfill(),fillpoly()填充函数等使用。用法: 此函数调用方式为void setfillpattern(char *pattern,int color);说明: 参数color设置填充图样的颜色。参数pattern指向一字符数组,该数组至少8个字节长,它定义了一个8像素*8像素的用户填充图样。例如:&& char diamond[8]={0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00};&& diamond为8个字节的数组,每个字节对应于填充图样中的8个像素,字节中的1位,画出一个由color设定颜色的像素,字节中的0位则不画。实际上,diamond数组定义了一个7*7的小钻石图样,右边和底部都留有一个像素的边缘。&& 调用setfillpattern()设置用户填充图样后,必须调用setfilstyle()函数,使USER_FILL值成为当前填充图样。&& 这个函数对应的头文件为graphics.h返回值: 无例:建立一个用户填充图样,并用它填充一个矩形:#include&graphics.h&void main(){&& int driver,&& static char p[8]={10,20,30,40,50,60,70,80};&& driver=DETECT;&& mode=0;&& initgraph(&driver,mode,"");&& setcolor(GREEN);&& rectangle(80,200,220,300);&& setfillpattern(p.RED);&& floodfill(160,260,GREEN);&& getch();&& restorecrtmode();}
78. floodfill() 填充闭域函数功能: 函数floodfill()用当前填充图样和填充色填充一个由特定边界颜色(通常是当前绘图色)定义的有界封闭区域。用法: 该函数调用方式为void floodfill(int x,int y,int bordercolor);说明: 这里参数(x,y)为指定填充区域中的某点,如果点(x,y)在该填充区域之外,那么外部区域将被填充,但受图形视口边界的限制。如果直线定义的区域出现间断,那么将导致泄漏,即使很小的间断,也将导致泄漏。也就是说,间断将引起区域外被填充。&& 参数bordercolor为闭区域边界颜色,若可能的话,建议尽量用下面函数fillpoly()代替floodfill(),以便和将来的版本保持兼容。&& 如果出错,graphresult()函数将返回错误代码-7(flood填充内存不足)。&& 此函数对应的头文件为graphics.h返回值: 无例: 用floodfill() 函数填充一个具有交叉阴影线的品红色椭圆:#include&graphics.h&void main(){&& int driver,&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& ellipse(188,88,0,360,100,60);&& setfillstyle(cHATCH_FILL,MAGENTA);&& floodfill(188,88,WHITE);&& getch();&& restorecrtmode();}
79. fillpoly() 填充多边形函数功能: 函数fillpoly()用当前绘图色、线型及线宽画出给定点的多边形,然后用当前填充图样和填充色填充这个多边形。用法: 此函数调用方式为void fillpoly(int pointnum,int *points);说明: fillpoly()的调用形式与drawpoly()的一样,其参数含义相同。该函数中pointnum为所填充多边形的顶点数,points指向存放所有顶点坐标的整型数组。有时顶点数目是通过过计算sizeof(整型数组)除以两倍的sizeof(int)然后得到的,之所以除以两倍的sizeof(int)是因为每个顶点需要两个整型坐标。注意,fillpoly()是通过连接起点和终点将图形封闭起来,然后填充被包围的区域。与floodfill()不同的是,fillpoly()所用的填充方法不依靠边界连续的轮廓来确定填充区域。这样间断的线型是允许的,并且可以很简单地填充多边形确定的区域,包括在新的边界范围内任何其它图形上重画。如果出错,graphresult()函数将返回错误代码-6(Scan填充内存不足)。&& 这个函数对应的头文件为graphics.h返回值: 无例:用红色间隔点填充一个正方形:#include&graphics.h&void main(){&& int driver,& && static int points[]={100,100,100,200,200,200,100,100};&& driver=DETECT&& mode=0;&& initgraph(&driver,mode,"");&& setfillstyle(INTERLEAVE_FILL,RED);&& fillpoly(4,points);&& getch();&& restorecrtmode();}
80. getfillsettings() 获取填充设置函数功能: 函数getfillsettings()将当前填充图样值(符号名或等价值)和填充颜色值(符号名或等价值)填入fillsettingstyle型结构里,从而从该结构中获得当前填充设置(填充图样和填充色)。用法: 这个函数调用方式为void getfillsettings(struct fillsettingstype *info);说明: 函数里fillsettingstype 型结构定义如下:&& struct fillsettingstype {&&&&&&&&&&&&&&&&&& };&& 注意,结构中变量pattern只用于存取一个预先定义的填充图样值,而不是填充图样元素,填充图样及等价值在前面表1-12中已经列出。结构变量color用来存储填充颜色值,它是当前显示模式的有效颜色值之一。&& getfillsettings()函数相应的头文件是graphics.h返回值:返回当前填充图样和填充色的值,并装入info指向的结构里。例: 下面的程序把当前填充图样和填充色的值写入fillinfo结构中:&& struct fills&& getfillsettings(&fillinfo);
81. getfillpattern() 获取用户图样设置函数功能: 函数getfillpattern()返回上一次调用setfillpattern()设置的用户定义的填充图样。用法: 此函数调用方式为void getfillpattern(char *pattern);说明: 函数一旦调用,就会把定义当前用户填充图样的8个字节填入pattern所指向的数组,该数组必须至少8字节长,用户图样以8个8位字节的模式排列,如果还没有调用setfillpattern()设置用户定义的填充图样,那么函数将填入数组元素的值全为0xff。&& getfillpattern()函数对应的头文件为graphics.h返回值: 返回用户定义填充图样的8个字节数据(注意不是填充图样元素),并存放在pattern指向的数组里。例: 显示组成当前用户填充图样的各字节内容:#include&graphics.h&void main(){&& int driver,&& char fp[8];&&&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& getfillpattern(fp);&& for(i=0;i&8;i++) printf("%d",fp[i]);&& getch();&& restorecrtmode();}
(六)、图像函数&& 图像复制、擦除以及一般对屏幕图像的操作,这对应用程序是非常有用的,对动画制作是必不可少的。BC提供了以下几个图像操作函数。
82. imagesize() 图像存储大小函数功能: 函数imagsize()返回存储一块屏幕图像所需的内存大小(即字节数)。用法: 此函数调用方式为unsigned imagsize(int left,int top,int right,int bottom);说明: 参数(left,top)为所定义的一块图像屏幕左上角,(right,bottom)为其右下角。&& 函数调用执行后,返回存储该块屏幕所需要的字节数。如果所需要字节数大于64KB,那么将返回-1。imagesize()函数一般与下面getimage()函数联用。&& 这个函数对应的头文件为graphics.h返回值: 返回一块图像屏幕存储所需的字节数,如果大于64KB,则返回-1。例: 确定左上角(10,10)与右下角(100,100)所定义的屏幕图像所需的字节数:&&&& size=imagesize(10,10,100,100);
83. getimage() 保存图像函数功能: 函数getimage()保存左上角与右下角所定义的屏幕上像素图形到指定的内存区域。用法: 该函数调用方式为void getimage(int left,int top,int right,int bottom,void *buf);说明: 函数中参数(left,top)为要保存的图像屏幕的左上角,(right,bottom)为其右下角,buf指向保存图像的内存地址。调用getimage()保存屏幕图像,可用imagesize()函数确定保存图像所需字节数,再用malloc()函数分配存储图像的内存(内存分配必须小于64KB),还可以用下面函数putimage()输出getimage()保存的屏幕图像。&& 这个函数对应的头文件为graphics.h返回值: 无例: 把带有两对角线的矩形拷贝到屏幕其它位置上:#include&garphics.h&#include&stdlib.h&#include&conio.h&void main(){&& int driver,&&&& void *&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& sector(15);&& rectangle(20,20,200,200);&& setcolor(RED);&& line(20,20,200,200);&& setcolor(GREEN);&& line(20,200,200,20);&& getch();&& size=imagesize(20,20,200,200);&& if(size!=-1){&&&&& buf=malloc(size);&&&&& if(buf){&&&&&&&& getimage(20,20,200,200,buf);&&&&&&&& putimage(100,100,buf,COPy_PUT);&&&&&&&& putimage(300,50,buf,COPy_PUT);&&&&& }&& }&& outtext("press a key");&& getch();&& restorecrtmode();}
84. putimage() 输出图像函数功能: 函数putimage()将一个先前保存在内存中的图像输出到屏幕上。用法: 此函数调用方式为void putimage(int left,int top,void *buf,int ops);说明: 参数(left,top)为输出屏幕图像的左上角,即输出图像的起始位置。buf指向要输出的内存中图像。参数ops控制图像以何种方式输出到屏幕上。表1-13给出了图像输出方式。
表1-13& 图像输出方式--------------------------------------------------------------------&& 输出方式符号名&&&&& 取值&&&&&&&&&&&&&& 含&&&& 义--------------------------------------------------------------------&& COPy_PUT&&&&&&&&&&&&& 0&&&&&&&& 图像输出到屏幕上,取代原有图像&& xOR_PUT&&&&&&&&&&&&&& 1&&&&&&&& 图像和原有像素作异或运算&& OR_PUT&&&&&&&&&&&&&&& 2&&&&&&&& 图像和原有像素作或运算&& AND_PUT&&&&&&&&&&&&&& 3&&&&&&&& 图像和原有像素作与运算&& NOT_PUT&&&&&&&&&&&&&& 4&&&&&&&& 把求反的位图像输出到屏幕上--------------------------------------------------------------------
1) COPy_PUT输出方式&& 图像中每个像素都直接绘制到屏幕上,取代原有图像像素,包括空白的图像像素(背景)。完全空白的图像可以用来擦除其它图像或屏幕的一部分。但通常选择xOR_PUT输出方式擦除原有图像。2)xOR_PUT输出方式&& 原有屏幕每个像素与相应的图像字节作“异或”运算,其结果画到屏幕上。当某一图像和屏幕上原有图像作“异或”运算时,屏幕显示的是两个图像的合成。若相同的图像作异或运算,将有效地擦除该图像,留下原始屏幕。这种输出方式,对动画制作是非常有用的。3)OR_PUT输出方式&& 每个图像字节和相应的屏幕像素作“或”运算,再将结果画到屏幕上,这种输出方式也叫“两者取一”。记住,像素中的每位和图像中的每位作“或”运算,这样所得结果是背景和图像的彩色合成图像。4)AND_PUT输出方式&& 选择AND_PUT图像输出方式时,屏幕像素和图像字节中都显示的位,运算后仍显示,例如,星图像中的空白背景擦除了方块轮廓以及填充色,只有星图像复盖着的方块留下,即运算后,显示两者相同的图像。5)NOT_PUT输出方式&& NOT_PUT输出方式,除了把图像的每位求反---图像中所有黑的像素(0000)变成了白色(1111),其它方面与COPy_PUT相同。背景图像被重画后将消失。&& putimage()函数对应的头文件为garphics.h返回值: 无例: 下面的程序说明了imagesize(),getimage()和putimage()函数的调用方法:#include&graphics.h&#include&conio.h&#include&stdlib.h&void box(int ,int,int,int,int);void main(){&& int driver,&&&& void *&& driver=DETECT;&& mode=0;&& initgraph(&driver,&mode,"");&& box(20,20,200,200,15);&& setcolor(RED);&& line(20,20,200,200);&& setcolor(GREEN);&& line(20,200,200,20);&& getch();&& size=imagesize(20,20,200,200);&& if(size!=-1)&& {&&&&& buf=malloc(size);&&&&& if(buf){&&&&&&&& getimage(20,20,200,200,buf);&&&&&&&& putimage(120,120,buf,COPy_PUT);&&&&&&&& putimage(280,60,buf,COPy_PUT);&&&&& }&& }&& outtext("Press a key");&& getch();&& restorecrtmode)(;}void box(int startx,int starty,int endx,int endy,int color){&& setcolor(color);&& rectangle(startx,starty,endx,endy);}图像函数是对屏幕图像操作进行讨论的,但对屏幕图形同样适用。实际上,屏幕图形也是一种特定的屏幕图像,它可称为外形屏幕图像或称轮廓屏幕图像。因此图像与图形不必区分。
阅读(...) 评论() &

我要回帖

更多关于 模糊查找c语言 的文章

 

随机推荐