关于#c++# #计算机图形学#的问题:想绘制一个填充红色的矩形,但代码运行只填充了部分区域,请问要怎样修改?

想实现的是绘制一个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();
}

  1. 检查坐标范围:确保种子点 (seedx, seedy) 位于矩形内部,并且在调用 boundaryfill4 函数之前,使用 getpixel 函数检查种子点的颜色。如果种子点的颜色已经是填充色或背景色,则不进行填充。

  2. 修正边界条件:在 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) 处进行填充。这样可以确保整个矩形被完全填满。

img


SeedFill(5, pts, 101, 150, RED, BLUE);//修改为 101
boundaryfill4函数里面注释掉 // boundaryfill4(seedx - 1, seedy, fcolor, bcolor);