用EasyX绘制任意个多边形,鼠标左键绘制,过程中显示路径,绘制结束后,填充多边形内部,鼠标右键结束绘制,用键盘“S”将已经绘制的保存到文件中,用键盘“L”将图形从文件中读取出来中
时间: 2024-04-05 18:32:47 浏览: 78
这是一个比较复杂的问题,需要使用C++和EasyX图形库进行编程。以下是一个具体的实现,代码中会有注释解释每个部分的作用:
```c++
#include <graphics.h>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// 存储多边形的点
vector<vector<POINT>> polygons;
// 当前正在绘制的多边形
vector<POINT> currentPolygon;
// 保存多边形的函数
void savePolygonsToFile(string filename) {
ofstream outFile(filename);
if (outFile.is_open()) {
// 保存多边形数量
outFile << polygons.size() << endl;
// 保存每个多边形的顶点数量和每个顶点的坐标
for (int i = 0; i < polygons.size(); i++) {
outFile << polygons[i].size() << endl;
for (int j = 0; j < polygons[i].size(); j++) {
outFile << polygons[i][j].x << " " << polygons[i][j].y << endl;
}
}
outFile.close();
}
}
// 从文件中读取多边形的函数
void loadPolygonsFromFile(string filename) {
ifstream inFile(filename);
if (inFile.is_open()) {
// 清空存储多边形的向量
polygons.clear();
// 读取多边形数量
int numPolygons;
inFile >> numPolygons;
// 读取每个多边形的顶点数量和每个顶点的坐标
for (int i = 0; i < numPolygons; i++) {
int numPoints;
inFile >> numPoints;
vector<POINT> polygon;
for (int j = 0; j < numPoints; j++) {
POINT p;
inFile >> p.x >> p.y;
polygon.push_back(p);
}
polygons.push_back(polygon);
}
inFile.close();
}
}
int main() {
initgraph(640, 480);
bool isDrawing = false;
bool isSaved = false;
while (true) {
// 鼠标左键按下
if (MouseHit()) {
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN) {
// 开始绘制多边形
if (!isDrawing) {
isDrawing = true;
currentPolygon.clear();
currentPolygon.push_back({ msg.x, msg.y });
}
// 继续绘制多边形
else {
currentPolygon.push_back({ msg.x, msg.y });
// 显示已经绘制的路径
if (currentPolygon.size() > 1) {
line(currentPolygon[currentPolygon.size() - 2].x, currentPolygon[currentPolygon.size() - 2].y, msg.x, msg.y);
}
}
}
// 鼠标右键按下
else if (msg.uMsg == WM_RBUTTONDOWN) {
// 结束绘制多边形
if (isDrawing) {
isDrawing = false;
polygons.push_back(currentPolygon);
// 绘制多边形的最后一条边
line(currentPolygon[0].x, currentPolygon[0].y, currentPolygon[currentPolygon.size() - 1].x, currentPolygon[currentPolygon.size() - 1].y);
// 填充多边形内部
setfillcolor(RGB(255, 0, 0));
fillpolygon(currentPolygon.data(), currentPolygon.size());
// 将已经绘制的多边形保存到文件中
isSaved = false;
}
}
}
// 键盘按下
if (kbhit()) {
char ch = getch();
// 按下S键保存多边形到文件
if (ch == 'S' || ch == 's') {
savePolygonsToFile("polygons.txt");
isSaved = true;
}
// 按下L键从文件中读取多边形
else if (ch == 'L' || ch == 'l') {
loadPolygonsFromFile("polygons.txt");
cleardevice();
for (int i = 0; i < polygons.size(); i++) {
setfillcolor(RGB(255, 0, 0));
fillpolygon(polygons[i].data(), polygons[i].size());
}
}
}
// 如果已经保存了多边形,并且没有正在绘制新的多边形,则显示所有已经保存的多边形
if (isSaved && !isDrawing) {
cleardevice();
for (int i = 0; i < polygons.size(); i++) {
setfillcolor(RGB(255, 0, 0));
fillpolygon(polygons[i].data(), polygons[i].size());
}
}
}
closegraph();
return 0;
}
```
这段代码使用EasyX图形库绘制多边形,并且可以将多边形保存到文件中,也可以从文件中读取多边形。需要注意的是,这段代码中实现了多边形的编辑功能,可以使用鼠标右键删除正在绘制的多边形的最后一个顶点,并重新绘制多边形。
阅读全文