ЧЕТЫРЕХсвязное заполнение области
От: Reunion  
Дата: 19.01.05 07:12
Оценка:
Всем привет!

Может быть у кого-нибудь есть или кто-нибудь где-нибудь видел нормальную реализацию ЧЕТЫРЕХсвязного заполнения области, заданной либо цветом границы, либо цветом области — без разницы (область может иметь дырки, большая — т.е. рекурсивный FloodFill не подайдет)? Очень нуно! Скорость не важна. А вот объем кода желательно поменьше.

Вот есть хороший алгоритм — но он ВОСЬМИсвязный (взят с codeproject). Как бы из него сделать ЧЕТЫРЕХсвязный...

// Fill background with given color
extern int nMinX, nMaxX, nMinY, nMaxY;
void LineFill_3(int x1, int x2, int y, 
        COLORREF fill_color, COLORREF seed_color)
{
    int xL,xR;
    if( y < nMinY || nMaxY < y )
        return;
    for( xL = x1; xL >= nMinX; --xL ) { // scan left
        if( GetPixel(xL,y) != seed_color )
            break;
        SetPixel(xL,y,fill_color);
    }
    if( xL < x1 ) {
        LineFill_3(xL, x1, y-1, fill_color, seed_color); // fill child
        LineFill_3(xL, x1, y+1, fill_color, seed_color); // fill child
        ++x1;
    }
    for( xR = x2;  xR <= nMaxX; ++xR ) { // scan right
        if( GetPixel(xR,y) !=  seed_color )
            break;
        SetPixel(xR,y,fill_color);
    }
    if(  xR > x2 ) {
        LineFill_3(x2, xR, y-1, fill_color, seed_color); // fill child
        LineFill_3(x2, xR, y+1, fill_color, seed_color); // fill child
        --x2;
    }
    for( xR = x1; xR <= x2 && xR <= nMaxX; ++xR ) {  // scan betweens
        if( GetPixel(xR,y) == seed_color )
            SetPixel(xR,y,fill_color);
        else {
            if( x1 < xR ) {
                // fill child
                LineFill_3(x1, xR-1, y-1, fill_color, seed_color);
                // fill child
                LineFill_3(x1, xR-1, y+1, fill_color, seed_color);
                x1 = xR;
            }
            // Note: This function still works if this step is removed.
            for( ; xR <= x2 && xR <= nMaxX; ++xR) { // skip over border
                if( GetPixel(xR,y) == seed_color ) {
                    x1 = xR--;
                    break;
                }
            }
        }
    }
}

void SeedFill_3(int x, int y, COLORREF fill_color)
{
    COLORREF seed_color = GetPixel(x,y);
    if( fill_color != seed_color )
        LineFill_3(x,x,y,fill_color,seed_color);
}



Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.