使用EasyX库用C语言设计一个绘制多边形的程序。并且满足以下要求:用鼠标左键可以绘制任意个多边形;过程中要显示绘制路径,鼠标右键结束绘制,绘制结束后 ,填充多边形内部; 按键盘S键将已绘制完成的多边形坐标保存到文件中,按键盘L键从文件中读取已保存的多边形坐标,重新显示在界面上。
时间: 2024-04-02 10:35:21 浏览: 61
好的,以下是实现绘制多边形的程序,使用EasyX库和C语言:
```c
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_POINTS 100 // 多边形最大点数
#define FILENAME "polygon.txt" // 保存多边形坐标的文件名
typedef struct {
int x, y;
} Point; // 点结构体
Point points[MAX_POINTS]; // 保存多边形点的数组
int pointCount = 0; // 已绘制点的数量
int polygonCount = 0; // 已绘制多边形的数量
void drawPolygon() {
setlinecolor(RED);
for (int i = 0; i < pointCount - 1; i++) {
line(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y);
}
}
void fillPolygon() {
setfillcolor(GREEN);
fillpolygon(points, pointCount);
}
void savePolygon() {
FILE *fp;
if ((fp = fopen(FILENAME, "a")) == NULL) {
printf("无法打开文件 %s。\n", FILENAME);
return;
}
fprintf(fp, "%d ", pointCount);
for (int i = 0; i < pointCount; i++) {
fprintf(fp, "%d %d ", points[i].x, points[i].y);
}
fprintf(fp, "\n");
fclose(fp);
}
void loadPolygon() {
FILE *fp;
if ((fp = fopen(FILENAME, "r")) == NULL) {
printf("无法打开文件 %s。\n", FILENAME);
return;
}
while (!feof(fp)) {
int count;
fscanf(fp, "%d", &count);
if (count == 0) {
break;
}
for (int i = 0; i < count; i++) {
fscanf(fp, "%d %d", &points[i].x, &points[i].y);
}
pointCount = count;
drawPolygon();
fillPolygon();
polygonCount++;
}
fclose(fp);
}
int main() {
initgraph(640, 480); // 初始化画布
setbkcolor(WHITE); // 设置背景颜色
cleardevice(); // 清空画布
registermouseevent(WM_LBUTTONDOWN, MOUSEEVENT_LEFTDOWN); // 注册鼠标左键按下事件
registermouseevent(WM_RBUTTONDOWN, MOUSEEVENT_RIGHTDOWN); // 注册鼠标右键按下事件
registerkeyevent(WM_KEYDOWN, 'S'); // 注册键盘S键按下事件
registerkeyevent(WM_KEYDOWN, 'L'); // 注册键盘L键按下事件
loadPolygon(); // 从文件中读取已保存的多边形坐标并绘制
while (1) {
MOUSEMSG m;
while (MouseHit()) {
m = GetMouseMsg();
if (m.uMsg == WM_LBUTTONDOWN) { // 鼠标左键按下事件
points[pointCount].x = m.x;
points[pointCount].y = m.y;
pointCount++;
if (pointCount > 1) {
setlinecolor(RED);
line(points[pointCount - 2].x, points[pointCount - 2].y, m.x, m.y);
}
} else if (m.uMsg == WM_RBUTTONDOWN) { // 鼠标右键按下事件
setlinecolor(WHITE);
line(points[pointCount - 1].x, points[pointCount - 1].y, points[0].x, points[0].y);
fillPolygon();
polygonCount++;
pointCount = 0;
savePolygon();
}
}
if (kbhit()) {
char c = getch();
if (c == 'S' || c == 's') { // 键盘S键按下事件
savePolygon();
} else if (c == 'L' || c == 'l') { // 键盘L键按下事件
cleardevice();
polygonCount = 0;
loadPolygon();
}
}
}
closegraph(); // 关闭画布
return 0;
}
```
程序的主要流程如下:
1. 初始化画布,注册鼠标和键盘事件,从文件中读取已保存的多边形坐标并绘制。
2. 当鼠标左键按下时,记录下当前鼠标位置,绘制从上一个点到当前点的线段,更新已绘制点的数量。
3. 当鼠标右键按下时,绘制最后一个点到第一个点的线段,填充多边形内部,更新已绘制多边形的数量和已绘制点的数量,并将多边形坐标保存到文件中。
4. 当键盘S键按下时,将已绘制完成的多边形坐标保存到文件中。
5. 当键盘L键按下时,清空画布,重新从文件中读取已保存的多边形坐标并绘制。
注意:程序中使用了EasyX库的函数和结构体,需要在编译时链接EasyX库。
阅读全文