Новосибирский Государственный Технический Университет. Факультет автоматики и вычислительной техники Кафедра вычислительной техники (специальность 220100). учебное пособие
Вид материала | Учебное пособие |
0.17.3 V_FAB4 - итеративная заливка 4-x связной области 0.17.4 Тест процедуры V_FAB4 |
- Новосибирский Государственный Технический Университет. Факультет автоматики и вычислительной, 1650.9kb.
- Рабочая программа для специальности: 220400 Программное обеспечение вычислительной, 133.96kb.
- Государственный Технический Университет. Факультет: Автоматики и Вычислительной Техники., 32.46kb.
- Образования Республики Молдова Колледж Микроэлектроники и Вычислительной Техники Кафедра, 113.64kb.
- Постоянное развитие и углубление профессиональных навыков в области информационных, 54.56kb.
- «Программное обеспечение вычислительной техники и автоматизированных систем», 1790.14kb.
- Задачи дисциплины: -изучение основ вычислительной техники; -изучение принципов построения, 37.44kb.
- Лекция №2 «История развития вычислительной техники», 78.1kb.
- Система контроля и анализа технических свойств интегральных элементов и устройств вычислительной, 582.84kb.
- Московский государственный инженерно-физический институт (технический университет), 947.05kb.
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();
}