2009-08-13 2 views
2

Я использую алгоритм наводнения из нерекурсивного многоуровневого стека, и кажется, что он отлично работает , за исключением для одной раздражающей ситуации: если использовать линию, чтобы вырезать изображение пополам, а затем заливать половину, это наводняет весь образ! Это происходит, однако, когда я не помещаю «границы» вокруг изображения. Если я рисую прямоугольник, который инкапсулирует изображение (т. Е. Помещает границы на изображение), тогда он отлично работает. Таким образом, очевидно, что что-то не так с аспектом определения границы кода, но я не могу для жизни меня найти проблему. Может ли кто-то с (надеюсь) более острый глаз, чем я, выявить проблему? это сводит меня с ума! (П.с. язык C)Что не так с этим алгоритмом наводнения?

/** scanfill algorithm **/ 
/* the stack */ 
#define stackSize 16777218 
int stack[stackSize]; 
int stackPointer; 

static bool 
pop(int * x, int * y, int h) 
{ 
    if(stackPointer > 0) 
    { 
     int p = stack[stackPointer]; 
     *x = p/h; 
     *y = p % h; 
     stackPointer--; 
     return true; 
    }  
    else 
    { 
     return false; 
    }  
}  

static bool 
push(int x, int y, int h) 
{ 
    if(stackPointer < stackSize - 1) 
    { 
     stackPointer++; 
     stack[stackPointer] = h * x + y; 
     return true; 
    }  
    else 
    { 
     return false; 
    }  
}  

static void 
emptyStack() 
{ 
    int x, y; 
    while(pop(&x, &y, 0)); 
} 

void 
scan_fill_do_action(int x, int y, texture_info * tex, VALUE hash_arg, 
       sync sync_mode, bool primary, action_struct * payload) 
{ 
    action_struct cur; 
    rgba old_color; 
    int y1; 
    bool spanLeft, spanRight; 

    if(!bound_by_rect(x, y, 0, 0, tex->width - 1, tex->height - 1)) return; 

    draw_prologue(&cur, tex, 0, 0, 1024, 1024, &hash_arg, sync_mode, primary, &payload); 

    old_color = get_pixel_color(tex, x, y); 

    if(cmp_color(old_color, cur.color)) return; 

    emptyStack(); 

    if(!push(x, y, tex->width)) return; 

    while(pop(&x, &y, tex->width)) 
    {  
     y1 = y; 
     while(y1 >= 0 && cmp_color(old_color, get_pixel_color(tex, x, y1))) y1--; 
     y1++; 
     spanLeft = spanRight = false; 
     while(y1 < tex->height && cmp_color(old_color, get_pixel_color(tex, x, y1))) 
      { 
       set_pixel_color_with_style(payload, tex, x, y1); 

       if(!spanLeft && x > 0 && cmp_color(old_color, get_pixel_color(tex, x - 1, y1))) 
        { 
         if(!push(x - 1, y1, tex->width)) return; 
         spanLeft = true; 
        } 
       else if(spanLeft && x > 0 && !cmp_color(old_color, get_pixel_color(tex, x - 1, y1))) 
        { 
         spanLeft = false; 
        } 


       if(!spanRight && x < tex->width && cmp_color(old_color, 
                   get_pixel_color(tex, x + 1, y1))) 
        { 
         if(!push(x + 1, y1, tex->width)) return; 
         spanRight = true; 
        } 

       else if(spanRight && x < tex->width && !cmp_color(old_color, 
                     get_pixel_color(tex, x + 1, y1))) 
        { 
         spanRight = false; 
        } 
       y1++; 
      } 
    } 
    draw_epilogue(&cur, tex, primary); 
} 
+0

Вы решили это? Потому что это моя проблема сейчас! – Farsheed

ответ

3

Я только короткий взгляд на него, но, кажется, у вас есть граничное обертку в

if(!spanRight && x < tex->width && ... 

else if(spanRight && x < tex->width && ... 

The линии следует читать

if(!spanRight && x < tex->width-1 && ... 
    else if(spanRight && x < tex->width-1 && ... 
+0

Я уже пробовал это :(и это не устранило проблему: (( – horseyguy

 Смежные вопросы

  • Нет связанных вопросов^_^