Je faisais les devoirs pour des graphiques informatiques.
Nous devons utiliser inondation code> pour peindre une zone, mais peu importe la façon dont j'ai changé la pile de réserve code> de Visual Studio, il sauterait toujours
Stackoverflow code> .
void Polygon_FloodFill(HDC hdc, int x0, int y0, int fillColor, int borderColor) {
int interiorColor;
interiorColor = GetPixel(hdc, x0, y0);
if ((interiorColor != borderColor) && (interiorColor != fillColor)) {
SetPixel(hdc, x0, y0, fillColor);
Polygon_FloodFill(hdc, x0 + 1, y0, fillColor, borderColor);
Polygon_FloodFill(hdc, x0, y0 + 1, fillColor, borderColor);
Polygon_FloodFill(hdc, x0 - 1 ,y0, fillColor, borderColor);
Polygon_FloodFill(hdc, x0, y0 - 1, fillColor, borderColor);
}
3 Réponses :
Vous pouvez avoir une zone trop grande à remplir, ce qui provoque des appels récursifs pour consommer toute la pile d'exécution de votre programme. P>
Vos options: P>
Qu'est-ce qui provoque l'empilement? p>
Quelle est la plage de
x0 code>? +/- 2 000 000 000 000? C'est votre potentiel de profondeur de pile. P>
code n'empêche pas évidemment de sortir hors de portée sauf si
getpixel (hors de portée) code> renvoie une valeur sans correspondance. P>
Et comment puis-je le résoudre? p> blockQuote>
Le code doit être plus sélectif sur les appels récursifs.
Quand une rangée de pixels peut être réglée, faites-le sans récursion.
Ensuite, examinez ensuite les voisins de la ligne et ne recueillent que lorsque les voisins n'avaient pas besoin de régler. P>Une approche prometteuse gérerait le milieu puis regardait les 4 directions cardinales. P>
// Pseudo code Polygon_FloodFill(x,y,c) if (pixel(x,y) needs filling) { set pixel(x,y,c); for each of the 4 directions // example: east i = 1; // fill the east line first while (pixel(x+i,y) needs filling) { i++; set pixel(x,y,c); } // now examine the line above the "east" line recursed = false; for (j=1; j<i; j++) { if (pixel(x+j, y+j) needs filling) { if (!recursed) { recursed = true; Polygon_FloodFill(x+j,y+j,c) } else { // no need to call Polygon_FloodFill as will be caught with previous call } } else { recursed = false; } } // Same for line below the "east" line // do same for south, west, north. }
Combien de pixels à remplir? Chaque pixel est un niveau en profondeur de récursion et vous avez beaucoup de variables de toutes les variables locales et opérandes de la fonction récursive + la valeur de retour et l'adresse de retour pour atteindre le pixel que vous stockez:
HDC floodfill_hdc; int floodfill_x0,floodfill_y0,floodfill_fillColor,floodfill_borderColor; void _Polygon_FloodFill() { // here your original filling code int interiorColor; ... } void PolygonFloodFill(HDC hdc, int x0, int y0, int fillColor, int borderColor) // this is what you call when want to fill something { floodfill_hdc=hdc; floodfill_x0=x0; floodfill_y0=y0; floodfill_fillColor=fillColor; floodfill_borderColor=borderColor; _Polygon_FloodFill(); }
Je ne connais pas la question, mais le titre résonne