帮我写一个基于EasyX库下的扫描线填充算法
时间: 2024-02-21 11:57:25 浏览: 70
基于EasyX库下的扫描线填充算法
好的,以下是基于EasyX库下的扫描线填充算法的代码:
```c++
#include <graphics.h>
#include <vector>
using namespace std;
// 定义一个点的结构体
struct Point {
int x, y;
Point(int _x, int _y) : x(_x), y(_y) {}
};
// 定义一个边的结构体
struct Edge {
int yMax; // 边的最高点的y坐标
float xMin; // 边的最低点的x坐标
float k; // 斜率
};
// 定义一些全局变量
vector<Edge> edgeTable[480]; // 边表
vector<Point> points; // 存储多边形的顶点
int polySize; // 多边形的边数
// 扫描线填充算法
void ScanLineFill() {
// 初始化边表
for (int i = 0; i < polySize; i++) {
Point p1 = points[i];
Point p2 = points[(i + 1) % polySize];
// 保证p1.y < p2.y
if (p1.y > p2.y) {
swap(p1, p2);
}
// 计算边的斜率和最低点的x坐标
float k = (float)(p2.x - p1.x) / (p2.y - p1.y);
float xMin = p1.x + k * (1 - p1.y);
// 将边加入边表
edgeTable[p1.y].push_back({ p2.y, xMin, k });
}
// 初始化活性边表
vector<Edge> activeEdgeTable;
// 扫描线从上往下扫描
for (int y = 0; y < 480; y++) {
// 将新的边加入活性边表
for (int i = 0; i < edgeTable[y].size(); i++) {
activeEdgeTable.push_back(edgeTable[y][i]);
}
// 对活性边表按照xMin排序
sort(activeEdgeTable.begin(), activeEdgeTable.end(),
[](const Edge& e1, const Edge& e2) {
return e1.xMin < e2.xMin;
});
// 对相邻的边进行填充
for (int i = 0; i < activeEdgeTable.size() - 1; i += 2) {
int xStart = activeEdgeTable[i].xMin + 0.5;
int xEnd = activeEdgeTable[i + 1].xMin + 0.5;
for (int x = xStart; x < xEnd; x++) {
putpixel(x, y, WHITE);
}
}
// 更新活性边表
for (int i = 0; i < activeEdgeTable.size(); i++) {
activeEdgeTable[i].xMin += activeEdgeTable[i].k;
}
// 删除扫描线以下的边
activeEdgeTable.erase(
remove_if(activeEdgeTable.begin(), activeEdgeTable.end(),
[y](const Edge& e) {
return e.yMax <= y;
}),
activeEdgeTable.end());
}
}
// 主函数
int main() {
// 创建绘图窗口
initgraph(640, 480);
// 读入多边形的顶点
while (true) {
int x, y;
scanf("%d%d", &x, &y);
if (x == -1 && y == -1) {
break;
}
points.push_back(Point(x, y));
}
polySize = points.size();
// 画出多边形
for (int i = 0; i < polySize; i++) {
Point p1 = points[i];
Point p2 = points[(i + 1) % polySize];
line(p1.x, p1.y, p2.x, p2.y);
}
// 填充多边形
ScanLineFill();
// 等待用户关闭绘图窗口
getch();
closegraph();
return 0;
}
```
说明:
1. 该算法基于扫描线的思想,通过构建边表和活性边表,对多边形进行填充。
2. 代码中使用了EasyX库提供的绘图函数`putpixel`和`line`,可以用于绘制像素和直线。
3. 多边形的顶点需要从标准输入中读入,以`(x,y)`的形式输入,输入结束后输入`-1 -1`表示结束。
4. 该算法只适用于简单多边形(没有重叠的边和顶点),对于复杂多边形需要进行剖分后再进行填充。
阅读全文