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

Вид материалаУчебное пособие
0.16.4  Тестовая процедуры V_FP1
0.17  Приложение 6. Процедуры заливки области
0.17.1  V_FAB4R - рекурсивная заливка 4-x связной области
0.17.2  Тест процедуры V_FAB4R
Подобный материал:
1   ...   33   34   35   36   37   38   39   40   ...   44

0.16.4  Тестовая процедуры V_FP1


/*---------------------------------------------- main V_FP1 */


float Px[MAXARR] = {

0.0,200.0,200.0,250.0,270.0,270.0,210.0,210.0,230.0,230.0

};

float Py[MAXARR] = {

0.0,200.0,250.0,250.0,230.0,200.0,210.0,230.0,230.0,210.0

};


void main (void)

{

int ii, kol, grn, new, entry;

int gdriver = DETECT, gmode;


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

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

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

entry= 1;


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, pixel= (%d %d %d) ? ",

kol, grn, new);

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

if (kol < 0) goto all;


for (ii=1; ii<=kol; ++ii) {

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

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

}


m2:

setbkcolor(0); /* Очистка экрана */

cleardevice();


/* Заливка */

V_FP1 (new, kol, Px, Py);


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

setcolor (grn);

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

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


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

if (!entry) {

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

line (Px[kol+4], Py[kol+4], Px[kol+1], Py[kol+1]);

}


goto m1;


all:

closegraph();

}

0.17  Приложение 6. Процедуры заливки области


В данном приложении приведены три процедуры заливки гранично-определенной области с затравкой.

Первая процедура - V_FAB4R реализует рекурсивный алгоритм заполнения для 4-х связной области соответствующий алгоритму, помещенному в [4].

Вторая процедура - V_FAB4 реализует итеративный алгоритм заполнения для 4-х связной области близкий к алгоритму, помещенному в [3].

Характерная особенность таких алгоритмов - очень большие затраты памяти под рабочий стек и многократное дублирование занесения пикселов. Характерные значения для размера стека (см. ниже определение константы MAX_STK) около десяти тысяч байт при размере порядка 70×70 пикселов и очень сильно зависят от размеров заливаемой области, ее конфигурации и выбора начальной точки. Так, например, для заливки квадрата со стороной, равной 65 дискретам, и старте заливки из точки (20,20) относительно угла квадрата требуется 7938 байт для стека.

Третья процедура - V_FAST реализует алгоритм построчного заполнения с затравкой гранично-определенной области, близкий к соответствующему алгоритму из [3]. Отличительная черта таких алгоритмов - большие объемы программного кода, небольшие затраты памяти под рабочий стек и практически отсутствующее дублирование занесения пикселов. Характерные значения для размера стека (см. ниже определение константы MAX_STK) около сотни байт.


0.17.1  V_FAB4R - рекурсивная заливка 4-x связной области


/*---------------------------------------------------- V_FAB4R

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

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

*

* V_FAB4R - заливка гранично-определенной

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

*/


#include

#include


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

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


static int gor_max= MAX_GOR;

static int ver_max= MAX_VER;


/*---------------------------------------------------- V_FAB4R

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

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

*/

void V_FAB4R (grn_pix, new_pix, x_isx, y_isx)

int grn_pix, new_pix, x_isx, y_isx;

{

if (getpixel (x_isx, y_isx) != grn_pix &&

getpixel (x_isx, y_isx) != new_pix)

{

putpixel (x_isx, y_isx, new_pix);

V_FAB4R (grn_pix, new_pix, x_isx+1, y_isx);

V_FAB4R (grn_pix, new_pix, x_isx, y_isx+1);

V_FAB4R (grn_pix, new_pix, x_isx-1, y_isx);

V_FAB4R (grn_pix, new_pix, x_isx, y_isx-1);

}

} /* V_FAB4 */

0.17.2  Тест процедуры V_FAB4R


/*-------------------------------------------------- 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_FAB4R (grn, new, x_isx, y_isx);

goto m1;

all:

closegraph();

}