使用EasyX库用C语言设计一个绘制多边形的程序。并且满足以下要求:用鼠标左键可以绘制任意个多边形;过程中要显示绘制路径,鼠标右键结束绘制,绘制结束后 ,填充多边形内部; 按键盘S键将已绘制完成的多边形坐标保存到文件中,按键盘L键从文件中读取已保存的多边形坐标,再显示在界面上。
时间: 2024-04-02 12:35:05 浏览: 140
好的,以下是实现该程序的代码:
```c
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 1000 // 最大顶点数
#define FILE_NAME "polygons.txt" // 保存多边形坐标的文件名
// 定义多边形结构体
typedef struct {
int num_vertices; // 顶点数
int x[MAX_VERTICES]; // 顶点的x坐标
int y[MAX_VERTICES]; // 顶点的y坐标
} Polygon;
Polygon polygons[MAX_VERTICES]; // 存放多边形的数组
int num_polygons = 0; // 已绘制的多边形数
// 绘制多边形
void DrawPolygon(Polygon *poly) {
int i;
moveto(poly->x[0], poly->y[0]); // 将光标移动到第一个顶点处
for (i = 1; i < poly->num_vertices; i++) {
lineto(poly->x[i], poly->y[i]); // 依次连接每个顶点
}
}
// 保存多边形坐标到文件中
void SavePolygons() {
int i, j;
FILE *fp = fopen(FILE_NAME, "w");
if (!fp) {
return;
}
fprintf(fp, "%d\n", num_polygons); // 先保存多边形数
for (i = 0; i < num_polygons; i++) {
fprintf(fp, "%d\n", polygons[i].num_vertices); // 保存顶点数
for (j = 0; j < polygons[i].num_vertices; j++) {
fprintf(fp, "%d %d\n", polygons[i].x[j], polygons[i].y[j]); // 保存每个顶点的坐标
}
}
fclose(fp);
printf("已保存到文件 %s\n", FILE_NAME);
}
// 从文件中读取多边形坐标
void LoadPolygons() {
int i, j;
FILE *fp = fopen(FILE_NAME, "r");
if (!fp) {
return;
}
fscanf(fp, "%d", &num_polygons); // 先读取多边形数
for (i = 0; i < num_polygons; i++) {
fscanf(fp, "%d", &polygons[i].num_vertices); // 读取顶点数
for (j = 0; j < polygons[i].num_vertices; j++) {
fscanf(fp, "%d %d", &polygons[i].x[j], &polygons[i].y[j]); // 读取每个顶点的坐标
}
}
fclose(fp);
}
int main() {
int gd = DETECT, gm, i, j;
int x, y;
char ch;
// 初始化图形界面
initgraph(&gd, &gm, "");
// 加载已保存的多边形坐标
LoadPolygons();
// 绘制多边形
for (i = 0; i < num_polygons; i++) {
DrawPolygon(&polygons[i]);
floodfill(polygons[i].x[0], polygons[i].y[0], getmaxcolor()); // 填充多边形内部
}
// 画布上的鼠标坐标
int mx = -1, my = -1;
// 绘制路径的起点坐标
int start_x = -1, start_y = -1;
// 当前正在绘制的多边形
Polygon *current_poly = NULL;
// 鼠标事件循环
while (1) {
// 获取鼠标状态
if (ismouseclick(WM_MOUSEMOVE)) {
mousemsg msg = getmouse();
mx = msg.x;
my = msg.y;
}
// 显示鼠标坐标和当前正在绘制的多边形的顶点数
setcolor(WHITE);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
char str[100];
sprintf(str, "Mouse: (%d, %d)", mx, my);
outtextxy(10, 10, str);
if (current_poly) {
sprintf(str, "Vertices: %d", current_poly->num_vertices);
outtextxy(10, 25, str);
}
// 绘制路径
if (current_poly && start_x >= 0 && start_y >= 0) {
setcolor(RED);
moveto(start_x, start_y);
lineto(mx, my);
}
// 处理鼠标左键按下事件
if (ismouseclick(WM_LBUTTONDOWN)) {
mousemsg msg = getmouse();
x = msg.x;
y = msg.y;
// 如果还没有开始绘制多边形,则创建一个新的多边形
if (!current_poly) {
current_poly = &polygons[num_polygons++];
current_poly->num_vertices = 0;
start_x = x;
start_y = y;
}
// 添加新的顶点
current_poly->x[current_poly->num_vertices] = x;
current_poly->y[current_poly->num_vertices] = y;
current_poly->num_vertices++;
// 更新起点坐标
start_x = x;
start_y = y;
}
// 处理鼠标右键按下事件
if (ismouseclick(WM_RBUTTONDOWN)) {
// 结束当前正在绘制的多边形
if (current_poly) {
DrawPolygon(current_poly);
floodfill(current_poly->x[0], current_poly->y[0], getmaxcolor());
current_poly = NULL;
start_x = -1;
start_y = -1;
}
}
// 处理键盘事件
if (kbhit()) {
ch = getch();
if (ch == 's' || ch == 'S') {
// 保存多边形坐标到文件中
SavePolygons();
} else if (ch == 'l' || ch == 'L') {
// 重新加载多边形坐标并绘制
num_polygons = 0;
LoadPolygons();
cleardevice();
for (i = 0; i < num_polygons; i++) {
DrawPolygon(&polygons[i]);
floodfill(polygons[i].x[0], polygons[i].y[0], getmaxcolor());
}
}
}
}
// 关闭图形界面
closegraph();
return 0;
}
```
这段代码使用了 EasyX 图形库,因此需要在编译时链接该库。可以使用以下命令进行编译:
```
gcc main.c -o main.exe -Iinclude -Llib -lgraphics -lwinmm -lmsimg32
```
其中,`-Iinclude` 表示指定头文件的路径,`-Llib` 表示指定库文件的路径,`-lgraphics`、`-lwinmm` 和 `-lmsimg32` 表示链接 EasyX 库的三个动态链接库。如果使用的是其他 C 编译器,可以根据需要进行相应的修改。
阅读全文