使用EGE库设计一个绘制多边形的程序。并且满足以下要求:1.可以绘制任意个多边形 2.过程中要显示绘制途径,绘制结束后,填充多边形内部 3.能够将已绘制完成的多边形保存到文件中,并且可以从文件中读取已保存的多边形,重新显示在界面上 c语言代码 并且用二维数组保存四边形的坐标
时间: 2024-01-19 09:26:18 浏览: 95
由于EGE库是基于C++的图形库,所以下面提供的示例代码是使用C++编写的。同时,由于EGE库的特性,下面的代码需要在Windows操作系统下运行。以下是代码实现:
```cpp
#include <graphics.h>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
// 定义一个二维点的结构体
struct Point {
int x, y;
Point(int x = 0, int y = 0) : x(x), y(y) {}
};
// 定义一个多边形的结构体
struct Polygon {
vector<Point> points; // 多边形的顶点坐标
int color; // 多边形的颜色
Polygon() : color(WHITE) {}
};
// 定义一个全局变量,表示当前正在绘制的多边形
Polygon currentPolygon;
// 定义一个全局变量,表示所有已经绘制完成的多边形
vector<Polygon> polygons;
// 将已经绘制完成的多边形保存到文件中
void savePolygons() {
ofstream fout("polygons.txt");
for (auto &polygon : polygons) {
fout << polygon.color << endl;
fout << polygon.points.size() << endl;
for (auto &point : polygon.points) {
fout << point.x << " " << point.y << endl;
}
}
fout.close();
cout << "Polygons saved to file." << endl;
}
// 从文件中读取已保存的多边形
void loadPolygons() {
ifstream fin("polygons.txt");
polygons.clear();
while (!fin.eof()) {
Polygon polygon;
fin >> polygon.color;
int n;
fin >> n;
for (int i = 0; i < n; i++) {
int x, y;
fin >> x >> y;
Point point(x, y);
polygon.points.push_back(point);
}
polygons.push_back(polygon);
}
polygons.pop_back();
fin.close();
cout << "Polygons loaded from file." << endl;
}
// 绘制多边形
void drawPolygon(const Polygon &polygon) {
setcolor(polygon.color);
for (int i = 0; i < polygon.points.size() - 1; i++) {
line(polygon.points[i].x, polygon.points[i].y,
polygon.points[i + 1].x, polygon.points[i + 1].y);
}
line(polygon.points.back().x, polygon.points.back().y, polygon.points.front().x,
polygon.points.front().y);
floodfill(polygon.points[0].x, polygon.points[0].y, polygon.color);
}
// 绘制所有多边形
void drawAllPolygons() {
cleardevice();
for (auto &polygon : polygons) {
drawPolygon(polygon);
}
drawPolygon(currentPolygon);
}
// 鼠标点击事件回调函数
void onMouseClick(int button, int state, int x, int y) {
if (button == MOUSE_LEFT_BUTTON) {
if (state == MOUSE_DOWN) {
currentPolygon.points.push_back(Point(x, y));
drawAllPolygons();
}
if (state == MOUSE_UP) {
polygons.push_back(currentPolygon);
currentPolygon.points.clear();
drawAllPolygons();
}
}
if (button == MOUSE_RIGHT_BUTTON && state == MOUSE_UP) {
savePolygons();
}
}
// 从键盘输入多边形颜色
int inputColor() {
cout << "Input color (0~15): ";
int color;
cin >> color;
return color;
}
int main() {
initgraph(800, 600);
setbkcolor(BLACK);
setcolor(WHITE);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
char choice;
cout << "Do you want to load polygons from file? (Y/N): ";
cin >> choice;
if (choice == 'Y' || choice == 'y') {
loadPolygons();
}
while (true) {
drawAllPolygons();
cout << "Press 'S' to save polygons to file." << endl;
cout << "Press 'C' to clear all polygons." << endl;
cout << "Press 'ESC' to exit." << endl;
if (_kbhit()) {
char key = _getch();
if (key == 27) { // ESC键
break;
} else if (key == 's' || key == 'S') {
savePolygons();
} else if (key == 'c' || key == 'C') {
polygons.clear();
drawAllPolygons();
} else if (key == ' ') { // 空格键
currentPolygon.color = inputColor();
}
}
settextcolor(WHITE);
setbkmode(TRANSPARENT);
outtextxy(10, 10, "Press SPACE to change color.");
}
closegraph();
return 0;
}
```
上述代码中,我们使用了EGE库来实现绘制多边形的功能,并且支持保存和加载多边形到文件。具体来说,我们定义了一个 `Point` 结构体来表示二维坐标点,定义了一个 `Polygon` 结构体来表示多边形,包含多个二维坐标点和颜色。我们使用全局变量 `currentPolygon` 来表示当前正在绘制的多边形,使用全局变量 `polygons` 来保存已经绘制完成的多边形。我们在鼠标点击事件回调函数中实现了多边形的绘制和保存。我们使用了 `setcolor` 和 `line` 函数来绘制多边形的边界,使用 `floodfill` 函数来填充多边形的内部。我们在键盘事件监听中实现了保存多边形到文件、清除已绘制的多边形、更改绘制多边形的颜色等功能。最后,我们使用 `outtextxy` 函数在屏幕上输出文字提示信息。
为了回答您的第二个问题,以下是一个使用二维数组保存四边形坐标的示例代码:
```cpp
Point points[4] = {{100, 100}, {200, 100}, {200, 200}, {100, 200}};
```
这个示例代码中,我们定义了一个长度为4的 `Point` 数组 `points`,用于保存四边形的顶点坐标。每个点的坐标通过一个 `Point` 结构体表示,包含 `x` 和 `y` 两个成员变量。其中,点的顺序按照逆时针方向排列。
阅读全文