C++语言任务:使用EGE库设计一个绘制多边形的程序。并且满足以下要求: 1、 可以用鼠标左键绘制任意个多边形;2、过程中要显示绘制路径,绘制结束后 ,单击鼠标右键填充多边形内部; 3、能够将已绘制完成的多边形保存到文件中,并且可以从文件中读取已保存的多边形,重新显示在界面上。
时间: 2024-04-02 17:35:49 浏览: 79
好的,我会以您所提供的要求为基础来编写程序。
首先,我们需要在程序中引用EGE库,以便进行图形绘制。您可以在官方网站(https://xege.org/)上下载EGE库并安装。
接下来,我们可以按照以下步骤来设计程序:
1. 定义一个结构体来保存多边形的信息,包括多边形的顶点坐标和顶点数量。
```c++
struct polygon {
int vertexCount;
POINT vertex[100];
};
```
2. 定义一个vector来保存所有已绘制的多边形。
```c++
vector<polygon> polygons;
```
3. 在主函数中初始化EGE库,并设置窗口的大小和标题。
```c++
int main() {
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
setcaption("Polygon Drawing Program");
...
}
```
4. 定义一个函数来绘制多边形的路径,该函数需要接收一个polygon类型的参数。
```c++
void drawPolygonPath(polygon poly) {
setlinestyle(PS_SOLID, 2);
setlinecolor(LIGHTGRAY);
for (int i = 0; i < poly.vertexCount - 1; i++) {
line(poly.vertex[i].x, poly.vertex[i].y, poly.vertex[i + 1].x, poly.vertex[i + 1].y);
}
line(poly.vertex[poly.vertexCount - 1].x, poly.vertex[poly.vertexCount - 1].y, poly.vertex[0].x, poly.vertex[0].y);
}
```
该函数会将多边形的路径以灰色实线的方式绘制出来。
5. 定义一个函数来填充多边形,该函数需要接收一个polygon类型的参数。
```c++
void fillPolygon(polygon poly) {
setfillcolor(LIGHTBLUE);
fillpolygon(poly.vertex, poly.vertexCount);
}
```
该函数会将多边形内部填充为浅蓝色。
6. 定义一个函数来保存多边形到文件中,该函数需要接收一个polygon类型的参数和一个文件名。
```c++
void savePolygonToFile(polygon poly, string filename) {
ofstream file(filename);
if (file.is_open()) {
file << poly.vertexCount << endl;
for (int i = 0; i < poly.vertexCount; i++) {
file << poly.vertex[i].x << " " << poly.vertex[i].y << endl;
}
file.close();
}
}
```
该函数会将多边形的信息保存到指定的文件中。
7. 定义一个函数来从文件中读取多边形,该函数需要接收一个文件名,并且返回一个polygon类型的值。
```c++
polygon loadPolygonFromFile(string filename) {
polygon poly;
ifstream file(filename);
if (file.is_open()) {
file >> poly.vertexCount;
for (int i = 0; i < poly.vertexCount; i++) {
file >> poly.vertex[i].x >> poly.vertex[i].y;
}
file.close();
}
return poly;
}
```
该函数会从指定的文件中读取多边形的信息,并将其返回。
8. 在主函数中添加鼠标事件的处理函数,以便实现多边形的绘制和保存。
```c++
int main() {
...
setmousequeue(ENABLE);
setbkcolor(WHITE);
cleardevice();
bool isDrawing = false;
polygon currentPoly;
while (true) {
if (ismouseclick(WM_LBUTTONDOWN)) {
if (!isDrawing) {
isDrawing = true;
currentPoly.vertexCount = 0;
}
currentPoly.vertex[currentPoly.vertexCount++] = { mousex(), mousey() };
drawPolygonPath(currentPoly);
}
if (ismouseclick(WM_RBUTTONDOWN)) {
isDrawing = false;
fillPolygon(currentPoly);
polygons.push_back(currentPoly);
}
if (ismouseclick(WM_MBUTTONDOWN)) {
for (int i = 0; i < polygons.size(); i++) {
drawPolygonPath(polygons[i]);
}
}
if (ismouseclick(WM_LBUTTONDBLCLK)) {
string filename = "polygon_" + to_string(polygons.size() + 1) + ".txt";
savePolygonToFile(currentPoly, filename);
}
if (kbhit()) {
char c = getch();
if (c == 'o') {
string filename;
cout << "Enter filename: ";
cin >> filename;
polygon poly = loadPolygonFromFile(filename);
fillPolygon(poly);
polygons.push_back(poly);
}
}
clearmouseclick(WM_LBUTTONDOWN);
clearmouseclick(WM_RBUTTONDOWN);
clearmouseclick(WM_MBUTTONDOWN);
clearmouseclick(WM_LBUTTONDBLCLK);
}
...
}
```
在这段代码中,我们处理了鼠标左键按下、右键按下、中键按下、左键双击和键盘按键事件。当鼠标左键按下时,我们会绘制多边形的路径,并将其保存到currentPoly变量中;当鼠标右键按下时,我们会填充多边形的内部,并将其保存到polygons向量中;当中键按下时,我们会重新绘制所有已保存的多边形;当左键双击时,我们会将当前多边形保存到文件中;当键盘按键事件发生时,我们会加载指定的多边形文件。
最终的程序代码如下:
阅读全文