想实现的是绘制一个440x300的填充红色的矩形,运行了之后,只填充一部分,并没有全部填充;
尝试修改SeedFill函数的seedx和seedy,没解决问题,怎样修改啊?
#include<graphics.h>
#include<conio.h>
void EdgeMark(int x1,int y1,int x2,int y2,int color)/*DDALine_all*/
{
int i,length;
float dx,dy,x=x1,y=y1;
if (abs(x2-x1)>=abs (y2-y1))
length=abs(x2-x1);
else
length=abs(y2-y1);
dx=(float)(x2-x1)/length;
dy=(float)(y2-y1)/length;
putpixel((int)(x+0.5),(int)(y+0.5),color);
for(i=1;i<=length;i++)
{
x=x+dx;
y=y+dy;
putpixel((int)(x+0.5),(int)(y+0.5),color);
}
}
void boundaryfill4(int seedx,int seedy,int fcolor,int bcolor)
{
int current=getpixel(seedx,seedy);
if((current!=bcolor)&&(current!=fcolor))
{
putpixel(seedx,seedy,fcolor);
boundaryfill4(seedx+1,seedy,fcolor,bcolor);
boundaryfill4(seedx-1,seedy,fcolor,bcolor);
boundaryfill4(seedx,seedy+1,fcolor,bcolor);
boundaryfill4(seedx,seedy-1,fcolor,bcolor);
}
}
void SeedFill(int cnt,POINT *pts,int seedx,int seedy,int fcolor,int bcolor)
{
POINT v1,v2;
int i;
for(i=0;i<cnt-1;i++)
{
v1=pts[i]; v2=pts[i+1];
EdgeMark(v1.x,v1.y,v2.x,v2.y,bcolor);
}
boundaryfill4(seedx,seedy,fcolor,bcolor);
}
int main()
{
initgraph(640,480);
int c;
POINT pts[5];
pts[0].x=100;pts[0].y=90;
pts[1].x=540;pts[1].y=90;
pts[2].x=540;pts[2].y=390;
pts[3].x=100;pts[3].y=390;
pts[4].x=100;pts[4].y=90;
SeedFill(5,pts,300,150,RED,BLUE);
getch();
closegraph();
}
检查坐标范围:确保种子点 (seedx, seedy)
位于矩形内部,并且在调用 boundaryfill4
函数之前,使用 getpixel
函数检查种子点的颜色。如果种子点的颜色已经是填充色或背景色,则不进行填充。
修正边界条件:在 EdgeMark
函数中,将 putpixel
的调用放在循环的最后一行。这样可以保证在绘制完整个线段后再绘制最后一个像素,从而避免漏掉终点的像素。
以下是修改后的示例代码:
#include <graphics.h>
#include <conio.h>
void EdgeMark(int x1, int y1, int x2, int y2, int color)
{
int i, length;
float dx, dy, x = x1, y = y1;
if (abs(x2 - x1) >= abs(y2 - y1))
length = abs(x2 - x1);
else
length = abs(y2 - y1);
dx = (float)(x2 - x1) / length;
dy = (float)(y2 - y1) / length;
for (i = 1; i <= length; i++)
{
x = x + dx;
y = y + dy;
putpixel((int)(x + 0.5), (int)(y + 0.5), color);
}
}
void boundaryfill4(int seedx, int seedy, int fcolor, int bcolor)
{
int current = getpixel(seedx, seedy);
if (current != bcolor && current != fcolor)
{
putpixel(seedx, seedy, fcolor);
boundaryfill4(seedx + 1, seedy, fcolor, bcolor);
boundaryfill4(seedx - 1, seedy, fcolor, bcolor);
boundaryfill4(seedx, seedy + 1, fcolor, bcolor);
boundaryfill4(seedx, seedy - 1, fcolor, bcolor);
}
}
void SeedFill(int cnt, POINT *pts, int seedx, int seedy, int fcolor, int bcolor)
{
POINT v1, v2;
int i;
for (i = 0; i < cnt - 1; i++)
{
v1 = pts[i];
v2 = pts[i + 1];
EdgeMark(v1.x, v1.y, v2.x, v2.y, bcolor);
}
boundaryfill4(seedx, seedy, fcolor, bcolor);
}
int main()
{
initgraph(640, 480);
int c;
POINT pts[5];
pts[0].x = 100;
pts[0].y = 90;
pts[1].x = 540;
pts[1].y = 90;
pts[2].x = 540;
pts[2].y = 390;
pts[3].x = 100;
pts[3].y = 390;
pts[4].x = 100;
pts[4].y = 90;
SeedFill(5, pts, 300, 150, RED, BLUE);
getch();
closegraph();
}
边界填充算法有时可能会受到计算机性能或库函数的限制,并且对于复杂的填充区域可能无法得到理想的效果,或许可以考虑使用其他填充算法
使用洪泛填充算法 floodfill
函数来填充矩形:
#include <graphics.h>
#include <conio.h>
int main()
{
initgraph(640, 480);
int seedx = 300;
int seedy = 150;
setfillstyle(SOLID_FILL, RED);
floodfill(seedx, seedy, BLACK);
getch();
closegraph();
return 0;
}
这段代码使用 setfillstyle
函数设置填充样式为红色,并使用 floodfill
函数在给定的种子坐标 (seedx, seedy)
处进行填充。这样可以确保整个矩形被完全填满。