8-полосный алгоритм цветовой заливки для круга вытекает из границы - PullRequest
0 голосов
/ 03 марта 2020

Моей целью было создать эффективную версию алгоритма заливки полигонов. Код работает правильно для заполнения прямоугольников, но по какой-то причине он выпрыгивает из круга при заполнении юго-восточных пикселей. Please check the output image of the leak here

Недостаток алгоритма заливки заливки заключается в том, что он не работает для действительно больших фигур, вызывая переполнение стека из-за множества дополнительных функций, хранящихся в стеке при рекурсивном вызове самого себя. Чтобы преодолеть это, я написал этот алгоритм, где я сначала заполняю все пиксели север, восток, юг и запад, поскольку они не требуют стека рекурсивной функции. Затем я вызываю функции заполнения пикселей NorthEast, SouthEast, SouthWest и NorthWest, использующие стек рекурсии. Я гарантировал, что в любой конкретный момент мой стек рекурсии не будет иметь более двух методов, чтобы избежать переполнения стека.

Пожалуйста, помогите мне исправить утечку

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
void northFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        northFill(a,b+1,newcolor,oldcolor);
    }
}
void westFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        westFill(a-1,b,newcolor,oldcolor);
    }
}
void southFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        southFill(a,b-1,newcolor,oldcolor);
    }
}
void eastFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        eastFill(a+1,b,newcolor,oldcolor);
    }
}
void northEastFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        northFill(a,b+1,newcolor,oldcolor);
        eastFill(a+1,b,newcolor,oldcolor);
        northEastFill(a+1,b+1,newcolor,oldcolor);
    }
}
void southEastFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        southFill(a,b-1,newcolor,oldcolor);
        eastFill(a+1,b,newcolor,oldcolor);
        southEastFill(a+1,b-1,newcolor,oldcolor);
    }
}
void northWestFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        northFill(a,b+1,newcolor,oldcolor);
        westFill(a-1,b,newcolor,oldcolor);
        northWestFill(a-1,b+1,newcolor,oldcolor);
    }
}
void southWestFill(int a,int b,int newcolor,int oldcolor){
    int current=getpixel(a,b);
    if(current==oldcolor){
        putpixel(a,b,newcolor);
        southFill(a,b-1,newcolor,oldcolor);
        westFill(a-1,b,newcolor,oldcolor);
        southWestFill(a-1,b-1,newcolor,oldcolor);
    }
}
void fillPoint(int x,int y,int color){
    int pixelColor=getpixel(x,y);
    putpixel(x,y,color);
    northFill(x,y+1,color,pixelColor);
    eastFill(x+1,y,color,pixelColor);
    southFill(x,y-1,color,pixelColor);
    westFill(x-1,y,color,pixelColor);
    northEastFill(x+1,y+1,color,pixelColor);
    southEastFill(x+1,y-1,color,pixelColor);
    southWestFill(x-1,y-1,color,pixelColor);
    northWestFill(x-1,y+1,color,pixelColor);
}
void main(){
    int gd = DETECT , gm;
    int x,y;
    initgraph(&gd,&gm,"");
    circle(320,240,230);     //<- Doesnt work for this
    //rectangle(40,40,630,470); <-Works for this
    printf("Enter x,y: ");
    scanf("%d %d",&x,&y);
    fillPoint(x,y,GREEN);
    getch();
    closegraph();
}
...