Моей целью было создать эффективную версию алгоритма заливки полигонов. Код работает правильно для заполнения прямоугольников, но по какой-то причине он выпрыгивает из круга при заполнении юго-восточных пикселей.
Недостаток алгоритма заливки заливки заключается в том, что он не работает для действительно больших фигур, вызывая переполнение стека из-за множества дополнительных функций, хранящихся в стеке при рекурсивном вызове самого себя. Чтобы преодолеть это, я написал этот алгоритм, где я сначала заполняю все пиксели север, восток, юг и запад, поскольку они не требуют стека рекурсивной функции. Затем я вызываю функции заполнения пикселей 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();
}