使用EasyX库用C语言设计一个绘制多边形的程序。并且满足以下要求:用鼠标左键可以绘制任意个多边形;过程中要显示绘制路径,鼠标右键结束绘制,绘制结束后 ,填充多边形内部; 按键盘S键将已绘制完成的多边形坐标保存到文件中,按键盘L键从文件中读取已保存的多边形坐标,重新显示在界面上。
时间: 2024-04-02 08:35:50 浏览: 61
好的,以下是使用EasyX库编写多边形绘制程序的代码,满足你的所有要求:
```C
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define MAX_POINTS 100 // 定义最大顶点数
int points[MAX_POINTS][2]; // 存储顶点坐标
int numPoints = 0; // 当前顶点数
void drawPolygon() {
setfillcolor(YELLOW);
fillpolygon(numPoints, (POINT*)points);
}
int savePoints() {
FILE* fp = fopen("points.txt", "w");
if (fp == NULL) {
return 0;
}
fprintf(fp, "%d\n", numPoints);
for (int i = 0; i < numPoints; i++) {
fprintf(fp, "%d %d\n", points[i][0], points[i][1]);
}
fclose(fp);
return 1;
}
int loadPoints() {
FILE* fp = fopen("points.txt", "r");
if (fp == NULL) {
return 0;
}
fscanf(fp, "%d", &numPoints);
for (int i = 0; i < numPoints; i++) {
fscanf(fp, "%d %d", &points[i][0], &points[i][1]);
}
fclose(fp);
return 1;
}
int main() {
initgraph(640, 480);
while (1) {
if (MouseHit()) {
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN) {
if (numPoints < MAX_POINTS) {
points[numPoints][0] = msg.x;
points[numPoints][1] = msg.y;
numPoints++;
if (numPoints > 1) {
setlinecolor(GREEN);
line(points[numPoints - 2][0], points[numPoints - 2][1], msg.x, msg.y);
}
}
} else if (msg.uMsg == WM_RBUTTONDOWN) {
if (numPoints > 2) {
setlinecolor(GREEN);
line(points[numPoints - 1][0], points[numPoints - 1][1], points[0][0], points[0][1]);
drawPolygon();
}
}
}
if (_kbhit()) {
char key = _getch();
if (key == 's' || key == 'S') {
savePoints();
} else if (key == 'l' || key == 'L') {
numPoints = 0;
loadPoints();
drawPolygon();
}
}
Sleep(10);
}
closegraph();
return 0;
}
```
程序的基本思路是:使用EasyX库的函数实现绘制多边形,使用鼠标和键盘事件响应用户操作,使用文件读写函数实现保存和加载多边形数据。
具体实现过程中,使用了一个二维数组 `points` 存储多边形的顶点坐标,`numPoints` 记录当前顶点数。在鼠标左键按下时,获取当前鼠标位置,并将其添加为一个新的顶点坐标,并通过 `setlinecolor` 和 `line` 函数绘制连线;在鼠标右键按下时,绘制多边形轮廓,并使用 `fillpolygon` 函数填充多边形内部;在键盘按下时,根据键值执行相应的操作,保存或加载多边形数据。
注意:本程序只是一个简单的演示,没有对输入合法性做任何检查,例如顶点数是否超过最大值、是否顺时针或逆时针等。在实际应用中需要根据实际情况添加相应的检查和处理。
阅读全文