利用c++和easyx库编写扫描线种子填充算法的代码
时间: 2024-03-01 12:54:19 浏览: 116
以下是一个使用C++和EasyX库编写的扫描线种子填充算法的示例代码:
```cpp
#include <graphics.h>
#include <queue>
using namespace std;
// 定义颜色结构体
struct COLOR {
int r, g, b;
};
// 获取指定点的颜色
COLOR getPixelColor(int x, int y) {
COLOR color;
DWORD rgb = getpixel(x, y);
color.r = GetRValue(rgb);
color.g = GetGValue(rgb);
color.b = GetBValue(rgb);
return color;
}
// 设置指定点的颜色
void setPixelColor(int x, int y, COLOR color) {
setlinecolor(RGB(color.r, color.g, color.b));
putpixel(x, y, RGB(color.r, color.g, color.b));
}
// 扫描线种子填充算法
void fillArea(int x, int y, COLOR color) {
queue<POINT> q;
POINT p = {x, y};
q.push(p);
while (!q.empty()) {
p = q.front();
q.pop();
int x = p.x, y = p.y;
if (getPixelColor(x, y).r == color.r && getPixelColor(x, y).g == color.g && getPixelColor(x, y).b == color.b) {
continue;
}
setPixelColor(x, y, color);
POINT up = {x, y - 1};
POINT down = {x, y + 1};
POINT left = {x - 1, y};
POINT right = {x + 1, y};
if (y > 0 && getPixelColor(x, y - 1).r != color.r && getPixelColor(x, y - 1).g != color.g && getPixelColor(x, y - 1).b != color.b) {
q.push(up);
}
if (y < getmaxy() && getPixelColor(x, y + 1).r != color.r && getPixelColor(x, y + 1).g != color.g && getPixelColor(x, y + 1).b != color.b) {
q.push(down);
}
if (x > 0 && getPixelColor(x - 1, y).r != color.r && getPixelColor(x - 1, y).g != color.g && getPixelColor(x - 1, y).b != color.b) {
q.push(left);
}
if (x < getmaxx() && getPixelColor(x + 1, y).r != color.r && getPixelColor(x + 1, y).g != color.g && getPixelColor(x + 1, y).b != color.b) {
q.push(right);
}
}
}
// 测试代码
int main() {
initgraph(640, 480);
// 绘制一个矩形
rectangle(100, 100, 300, 300);
// 填充矩形
COLOR color = {255, 0, 0};
fillArea(200, 200, color);
getch();
closegraph();
return 0;
}
```
以上代码中,我们使用EasyX库的绘图函数绘制了一个矩形,并使用扫描线种子填充算法实现了对矩形内部的填充。在填充时,我们使用了一个队列来存储需要进行填充的点,将其上下左右四个相邻点加入队列中,直到队列为空为止。
阅读全文