最小生成树-graphics动画设计

系列文章目录

1. 最小生成树三种方法的代码实现

2.最小生成树-graphics.h动画设计


目录

系列文章目录

前言

一、graphics.h是什么

二、使用步骤

1.创建项目

2.创建框架

3.具体函数使用方法

1)图形

2)字符

3)连线

4)其他函数

4.整体代码显示

5.注意说明

总结


前言

做数据结构的课设,选的课题为最小生成树,因为常规代码太简单了,工作量不够,就想着能不能用C语言做一个最小生成树的普利姆算法和克鲁斯卡尔算法的动画形态,上网查过资料后,发现网上对这一部分的讲解简直太少了,所以就打算出一期详细的介绍一下。


一、graphics.h是什么

想做动画首先要知道graphics.h这个库,那这个是什么呢,是TC的针对DOS下的一个C语言图形库,如果要用的话应该用TC的编译器来编译,VC++环境有其它的针对Windows的图形库。本文使用Dev-Cpp6.2.1版本。在C语言的编译软件中,感觉这一版的颜色配置很棒,把百度网盘里的连接和提取码附上。

链接:https://pan.baidu.com/s/1meDOyafrzjLdgyKesdE0JA 
提取码:39ld

二、使用步骤

1.创建项目

打开dev,新建项目


先点击Multimedia,然后点击第二个Graphics.h库,选择C++语言,然后自己设定名称和项目文件夹,点击确定。会发现它的main.cpp文件里面本来就有一段代码,运行后会发现旋转五角星的图案(如下图所示),说明环境设置成功,接下来就可以写自己想写的代码了!

 2.创建框架

首先要知道的是这个库跟一般的C/C++里面的函数基本上不太一样,下面的网站里对里面的库函数有详细的介绍。库函数目录 (xege.org)

按照下面的代码,先设置标题,窗口大小,暂停是为了让窗口停留住,不然就会一闪而过。这样一个简单的窗口就完成了。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();                //暂停 
	return 0;
}

3.具体函数使用方法

本文介绍的函数仅为此次课设所用到的函数,具体的其他的函数可以参考此网站:库函数目录 (xege.org)

1)图形

以圆形为例,其他的图形可参考上面的库函数链接

circle(100,100,10): 第一个参数为横坐标,第二个为纵坐标,第三个参数为圆的直径

fillellipse(200,100,10,10): 第一个参数为横坐标,第二个为纵坐标,第三个为横向直径,第四个为纵向直径,若第三个和第四个数值不相等则为椭圆。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆   
	fillellipse(200, 100, 10, 10);   //实心圆 
	getch();
	return 0;
}

所得的图形如下图所示:

2)字符

字符和字符串输出不饿能直接使用scanf(),而应该用outtextxy函数代替

outtextxy(100,100,'A'): 第一个参数为横坐标,第二个为纵坐标,A为字符。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆 
	outtextxy(100,100,'A');    //字符 
	getch(); 
	fillellipse(200, 100, 10, 10);   //实心圆 
	outtextxy(200,100,'1');   //字符 
	getch();
	char z[] = "The diagram has been generated!";    //字符串
	outtextxy(240, 400, z);    //字符串表示
	getch(); 
	return 0;
}

 所得的图形如下:

 3)连线

line(100,100,200,100): 第一个参数为线段起始点横坐标,第二个为七十点的纵坐标,第三个为结束点的横坐标,第四个为结束点的纵坐标。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆 
	outtextxy(100,100,'A');    //字符 
	getch(); 
	fillellipse(200, 100, 10, 10);   //实心圆 
	outtextxy(200,100,'1');   //字符 
	getch();
	line(100, 100, 200, 100);   //连线
	getch();
	char z[] = "The diagram has been generated!";
	outtextxy(240, 400, z);
	getch(); 
	return 0;
}

 4)其他函数

sprintf(s, "%d", w[i]);    //将w[i]中的值以整形数的形式存入到s变量上。

clearviewport();      //清屏 

4.整体代码显示

这是整体的代码展示,其中数据是从文件中获取的,graphics.txt文件格式如下,

第一行书写顶点个数

第二行两个为一组,分别书写每个顶点的横纵坐标

第三行三个为一组,分别书写线段从第几个顶点到第几个顶点,以及两顶点之间的权值

 tree1.txt和tree.1txt文件的格式如下:

两个为一组,分别书写从第几个顶点到第几个顶点。

 整体的代码如下所示:

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	int i;
	int t, k = 65, m, n; //t为顶点数   边数
	char tem;	  //换行符  空格
	int x[60], y[60]; //横坐标   纵坐标
	int a[60], b[60], w[60];
	int a1[60], b1[60];
	int a2[60], b2[60];
	char c[60];  //顶点字符
	char s[20];   //权值输出
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图线为白色 
	setfillcolor(EGERGB(255, 255, 255));

	FILE *fp, *fp1, *fp2;
	fp = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\graphics.txt", "r");

	//顶点数
	fscanf(fp, "%d", &t);
	fscanf(fp, "%c", &tem);    //跳过换行符

	//字符
	for (i = 1; i <= t; i++) {
		c[i] = k;
		k++;
	}

	for (i = 1; i <= t; i++) {
		//图横坐标
		fscanf(fp, "%3d", &x[i]);
		fscanf(fp, "%c", &tem);
		//图纵坐标
		fscanf(fp, "%3d", &y[i]);
		fscanf(fp, "%c", &tem);    //跳过换行符
	}
	i = 1;
	while (!feof(fp)) {
		//连接关系的第一个
		fscanf(fp, "%2d", &a[i]);
		fscanf(fp, "%c", &tem);
		//连接关系的第二个
		fscanf(fp, "%2d", &b[i]);
		fscanf(fp, "%c", &tem);
		//树权值
		fscanf(fp, "%2d", &w[i]);
		fscanf(fp, "%c", &tem);
		i++;
	}
	m = i - 1; //边的总数
	getch();
	//顶点
	circle(x[1], y[1], 10); //圆圈
	outtextxy(x[1], y[1], c[1]); //顶点字符
	getch();
	for (i = 2; i <= t; i++) {
		circle(x[i], y[i], 10);
		outtextxy(x[i], y[i], c[i]);
		getch();
	}

	//连线
	for (i = 1; i <= m; i++) {
		line(x[a[i]], y[a[i]], x[b[i]], y[b[i]]);
		getch();
	}

	//权值
	for (i = 1; i <= m; i++) {
		sprintf(s, "%d", w[i]);
		outtextxy((x[a[i]] + x[b[i]]) / 2, (y[a[i]] + y[b[i]]) / 2, s);
		getch();
	}
	char z[] = "The diagram has been generated!";
	outtextxy(240, 400, z);
	getch();
	
	
	
	/*最小生成树-prim----------------------------------------------------------------------*/
	fp1 = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\tree1.txt", "r");
	setcolor(EGERGB(153,51,250)); //设置画图线为紫色
	setfillcolor(EGERGB(153,51,250));
	i = 1;
	while (!feof(fp1)) {
		//连接关系的第一个
		fscanf(fp1, "%2d", &a1[i]);
		fscanf(fp1, "%c", &tem);
		//连接关系的第二个
		fscanf(fp1, "%2d", &b1[i]);
		fscanf(fp1, "%c", &tem);
		i++;
	}
	n = i - 1;

	//顶点
	getch();
	for (i = 1; i <= n; i++) {
		fillellipse(x[a1[i]], y[a1[i]], 10, 10); //圆圈
		getch();
		fillellipse(x[b1[i]], y[b1[i]], 10, 10);
		getch();
		line(x[a1[i]], y[a1[i]], x[b1[i]], y[b1[i]]);
		getch();
	}
	char u[] = "The prim-minimum spanning tree has been generated!";
	outtextxy(220, 400, u);
	getch();
	clearviewport();   //清屏 
	getch();
	
	
	
	
	
	
	fp2 = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\tree2.txt", "r");
	setcolor(EGERGB(255, 255, 255)); //设置画图线为白色 
	setfillcolor(EGERGB(255, 255, 255));
	//顶点
	circle(x[1], y[1], 10); //圆圈
	outtextxy(x[1], y[1], c[1]); //顶点字符
	for (i = 2; i <= t; i++) {
		circle(x[i], y[i], 10);
		outtextxy(x[i], y[i], c[i]);
	}
	//连线
	for (i = 1; i <= m; i++) {
		line(x[a[i]], y[a[i]], x[b[i]], y[b[i]]);
	}
	//权值
	for (i = 1; i <= m; i++) {
		sprintf(s, "%d", w[i]);
		outtextxy((x[a[i]] + x[b[i]]) / 2, (y[a[i]] + y[b[i]]) / 2, s);
	}
	getch();



	/*最小生成树-kelusi--------------------------------------------------------------*/
	setcolor(EGERGB(30,144,255)); 
	setfillcolor(EGERGB(30,144,255));
	i = 1;
	while (!feof(fp2)) {
		//连接关系的第一个
		fscanf(fp2, "%2d", &a2[i]);
		fscanf(fp2, "%c", &tem);
		//连接关系的第二个
		fscanf(fp2, "%2d", &b2[i]) ;
		fscanf(fp2, "%c", &tem);
		i++;
	}
	m = i - 1;
		getch();
		for (i = 1; i <= m; i++) {
			line(x[a2[i]], y[a2[i]], x[b2[i]], y[b2[i]]);
			getch();
			fillellipse(x[a2[i]], y[a2[i]], 10, 10); //圆圈
			getch();
			fillellipse(x[b2[i]], y[b2[i]], 10, 10);
			getch();	
		}
		char v[] = "The krusal-minimum spanning tree has been generated!";
		outtextxy(220, 400, v);
		getch();

	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	return 0;
}

 结果如图所示:其中普利姆算法和克鲁斯卡尔算法有顺序体现。

  

 5.注意说明

1) getch()函数在此为暂停函数,与字符串里面的getch()函数不兼容,所以在此库里面不能使用include <string.h>头文件,否则会报错。

2)本篇文章所使用的代码是上一篇文章代码的延续,其中所使用的文件在上一篇代码中已经生成,如果是先运行的上一篇文章《最小生成树三种方法的代码实现》,则文件格式是匹配的,不用再修改文件格式,如果是单独运行的这篇文章的代码,需要自行设置文件格式。

总结

以上就是C语言当中graphics.h库具体的操作了,希望能够帮助到大家!

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值