Новосибирский Государственный Технический Университет. Факультет автоматики и вычислительной техники Кафедра вычислительной техники (специальность 220100). учебное пособие

Вид материалаУчебное пособие
0.17.3  V_FAB4 - итеративная заливка 4-x связной области
0.17.4  Тест процедуры V_FAB4
Подобный материал:
1   ...   34   35   36   37   38   39   40   41   ...   44

0.17.3  V_FAB4 - итеративная заливка 4-x связной области


/*----------------------------------------------------- V_FAB4

* Подпрограммы для заливки с затравкой гранично-определенной

* области 4-х связным алгоритмом:

*

* Pop_Stk - Локальная подпрограмма. Извлекает координаты

* пиксела из стека в глобальные скаляры xtek, ytek

*

* Push_Stk - Локальная подпрограмма. Заносит координаты

* пиксела в стек

*

* V_FAB4 - собственно заливка гранично-определенной

* области 4-х связным алгоритмом

*

* V_FA_SET - устанавливает количественные ограничения

* для заливки

*/


#include

#include

#include


#define MAX_GOR 2048 /* Разрешение дисплея по X */

#define MAX_VER 2048 /* Разрешение дисплея по Y */

#define MAX_STK 8192 /* Размер стека координат заливки */


static int gor_max= MAX_GOR;

static int ver_max= MAX_VER;

static int stk_max= MAX_STK;

static int *pi_stk, *pn_stk; /* Указ стека заливки */

static int xtek, ytek; /* Координаты из стека */

static int stklen; /* Достигнутая глубина стека*/

/* только для отладочных */

/* измерений программы */


/*---------------------------------------------------- Pop_Stk

* Извлекает координаты пиксела из стека в xtek, ytek

* Возвращает 0/1 - нет/есть ошибки

*/

static int Pop_Stk ()

{ register int otw;

otw= 0;

if (pi_stk <= pn_stk) ++otw; else {

ytek= *--pi_stk; xtek= *--pi_stk;

}

return (otw);

} /* Pop_Stk */


/*--------------------------------------------------- Push_Stk

* Заносит координаты пиксела в стек

* Возвращает -1/0 - нет места под стек/норма

*/

static int Push_Stk (x, y)

register int x, y;

{

register int glu;

if ((glu= pi_stk - pn_stk) >= stk_max) x= -1; else {

*pi_stk++= x; *pi_stk++= y; x= 0;

if (glu > stklen) stklen= glu;

}

return (x);

} /* Push_Stk */


/*----------------------------------------------------- V_FAB4

* Заливка гранично-определенной области

* 4-х связным алгоритмом

* Возвращает:

* -1 - нет места под стек

* 0 - норма

*/

int V_FAB4 (grn_pix, new_pix, x_isx, y_isx)

int grn_pix, new_pix, x_isx, y_isx;

{

register int pix, x, y, otw;


otw= 0;


/* Инициализация стека */

if ((pn_stk= (int *)malloc (stk_max)) == NULL) {

--otw; goto all;

}

pi_stk= pn_stk;


Push_Stk (x_isx, y_isx); /* Затравку в стек */


while (pn_stk < pi_stk) { /* Пока не исчерпан стек */

/* Выбираем пиксел из стека и красим его */

Pop_Stk ();

if (getpixel (x= xtek, y= ytek) != new_pix)

putpixel (x, y, new_pix);


/* Проверяем соседние пикселы на необходимость закраски */

if ((pix= getpixel (++x, y)) != new_pix &&

pix != grn_pix) otw= Push_Stk (x, y);


if ((pix= getpixel (--x, ++y)) != new_pix &&

pix != grn_pix) otw= Push_Stk (x, y);


if ((pix= getpixel (--x, --y)) != new_pix &&

pix != grn_pix) otw= Push_Stk (x, y);


if ((pix= getpixel (++x, --y)) != new_pix &&

pix != grn_pix) otw= Push_Stk (x, y);

if (otw) break;

}

all:

free (pn_stk);

return (otw);

} /* V_FAB4 */


/*--------------------------------------------------- V_FA_SET

* Устанавливает количественные ограничения для заливки

*/

void V_FA_SET (x_resolution, y_resolution, stack_length)

int x_resolution, y_resolution, stack_length;

{

if (x_resolution > 0 && x_resolution <= MAX_GOR)

gor_max= x_resolution;

if (y_resolution > 0 && y_resolution <= MAX_VER)

ver_max= y_resolution;

/* Кол байт координат, заносимых в стек м.б. только четным */

if (stack_length > 0) stk_max= stack_length & 0177776;

} /* V_FA_SET */


0.17.4  Тест процедуры V_FAB4


/*-------------------------------------------------- FAB4_MAIN

*/

void main (void)

{

int ii, kol, grn, new, entry;

int x_isx, y_isx;

int gdriver = DETECT, gmode;

int Px[256] = {200,200,250,270,270,210,210,230,230};

int Py[256] = {200,250,250,230,200,210,230,230,210};


kol= 5; /* Кол-во вершин */

grn= 11; /* Код пикселов границы */

new= 14; /* Код заливки */

x_isx= 240; /* Координаты затравки */

y_isx= 240;

entry= 0;


initgraph(&gdriver, &gmode, "c:\tc\bgi");

if ((ii= graphresult()) != grOk) {

printf ("Err=%d\n", ii); goto all;

}


m0:goto m2;

m1:++entry;

printf("Vertexs, boundary_pixel, new_pixel= (%d %d %d) ? ",

kol, grn, new);

scanf ("%d%d%d", &kol, &grn, &new);

if (kol < 0) goto all;


for (ii=0; ii
printf ("Px[%d], Py[%d] = ? ", ii, ii);

scanf ("%d%d", &Px[ii], &Py[ii]);

}


printf ("X,Y isx= (%d %d) ? ", x_isx, y_isx);

scanf ("%d%d", &x_isx, &y_isx);


m2:

setbkcolor(0);

cleardevice();


/* Построение границы */

setcolor (grn);

for (ii= 0; ii
line (Px[ii], Py[ii], Px[ii+1], Py[ii+1]);

line (Px[kol-1], Py[kol-1], Px[0], Py[0]);


/* При первом входе строится квадратик дырки */

if (!entry) {

for (ii= kol; ii
line (Px[ii], Py[ii], Px[ii+1], Py[ii+1]);

line (Px[kol+3], Py[kol+3], Px[kol], Py[kol]);

}


/* Установка количественных ограничений для проц заливки */

V_FA_SET (getmaxx()+1, getmaxy()+1, MAX_STK);


stklen= 0; /* Занятое кол-во байт в стеке */


/* Заливка */

ii= V_FAB4 (grn, new, x_isx, y_isx);

printf ("Answer= %d MaxStack=%d\n", ii, stklen);

goto m1;


all:

closegraph();

}