Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь с курсовой программой, Заливка граничной области на С++ 
:(
    Опции темы
localhost
  Дата 26.5.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хирург-длятехкт
**


Профиль
Группа: Участник
Сообщений: 712
Регистрация: 8.11.2005
Где: Н.Новгород

Репутация: нет
Всего: 43



Друган попросил помочь разобраться с программой. Сам я не ахти кодер ;) да и он тоже. Вобщем постановка задачи: Требуется залить граничную область с использованием алгоритма заливки четырехсвязной области. Описание алгоритма на http://algolist.manual.ru/graphics/fill.php Один препод вузовский накатал прогу, к-рая нихрена не работает  <_< Заливает только 4 пиксела (соседних) и все.
Листинг программы
Код

#include <graphics.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>

#define PixToStek      1
#define ColBorder     15
#define ColFlood       5
#define MAXSTEK     8192

struct STEK
{
   int x,y;
};

unsigned char *Mat[300];
STEK *st=NULL;
int u_st=-1;
int st_mx=MAXSTEK;

int AddStek(int x,int y)
{
  if(u_st >= st_mx) return 1;
  if(Mat[x][y] != PixToStek &&
     Mat[x][y] != ColBorder &&
     Mat[x][y] != ColFlood)
     {
    u_st++;
    st[u_st].x=x;
    st[u_st].y=y;
    Mat[x][y]=PixToStek;
     }
  return 0;
}
int DelStek(int *x,int *y)
{
    *x=st[u_st].x;
    *y=st[u_st].y;
    u_st--;
  return 0;
}

void main (void)
{
   int   i,j,ii;
   int   xs, ys;
   int   gdriver = DETECT, gmode;

   initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
   if ((ii= graphresult()) != grOk)
   {
      printf ("Err=%d\n", ii); return;
   }

   for(i=0; i< 300; i++)
   {
       Mat[i]=NULL;
       Mat[i]=(unsigned char *)malloc(300);
       if(Mat[i] == NULL)
       {
      for(j=i-1; j>= 0; j--) {free(Mat[j]); Mat[j]=NULL;}
      return ;
       }
       for(j=0; j< 300; j++)
       {
       Mat[i][j]=0; putpixel(i,j,0);
       if((i == 100 || i == 250) && (j >= 20 && j <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       if((j ==  20 || j == 250) && (i >=100 && i <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       }
   }

   st=(STEK *)malloc(MAXSTEK*sizeof(STEK));

   xs = 200; ys= 100; AddStek(xs,ys);
   int xz,yz;

   while (u_st>=0)
   {
    xz=yz=0;
    DelStek(&xz,&yz);
    Mat[xz][yz]=ColFlood;
    putpixel(xz,yz,ColFlood);

    AddStek(xs+1,ys);
    AddStek(xs,ys-1);
    AddStek(xs-1,ys);
    AddStek(xs,ys+1);
   }

   getch();
   closegraph();
   for(j=0; j< 300; j++) {free(Mat[j]); Mat[j]=NULL;}
   return ;
}


Нужно найти ошибку. Почему она проходит только 4 итерации и завершается успешно?  smile Компилил в Turbo C. Если запускать из самой среды, то прога глючит. Надо делать Мэйк и запускать полученный экзешник в консоли.
Буду благодарен за любые советы. 
PM MAIL   Вверх
NextAlex
Дата 27.5.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



потому что прога немного недописана - этот код как раз только то и делает что заливает четыре точки вокруг базовой, а по сути это и есть весь код заливки области
Код

while (u_st>=0)    
   {    
    xz=yz=0;    
    DelStek(&xz,&yz);    
    Mat[xz][yz]=ColFlood;    
    putpixel(xz,yz,ColFlood);    
    AddStek(xs+1,ys);    
    AddStek(xs,ys-1);    
    AddStek(xs-1,ys);    
    AddStek(xs,ys+1);    
   }


сейчас попробую переделать, но поскольку турбо С у меня нет, и вообще с графикой в консоли я довно не работаю, то могу конечно и ошибиться где-то ... 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
NextAlex
Дата 27.5.2006, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.8.2005
Где: Украина, г. Одесс а

Репутация: 2
Всего: 3



вот это должно работать
в графике не проверял, но по счетчику были залиты все точки ...
Код

#include <graphics.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>
#define PixToStek      1
#define ColBorder     15
#define ColFlood       5
#define MAXSTEK     8192
struct STEK
{
   int x,y;
};
unsigned char *Mat[300];
STEK *st=NULL;
int u_st=-1;
int st_mx=MAXSTEK;

int AddStek(int x,int y)
{
  if(u_st >= st_mx) return 1;
  if(Mat[x][y] != PixToStek &&
     Mat[x][y] != ColBorder &&
     Mat[x][y] != ColFlood)
     {
    u_st++;
    st[u_st].x=x;
    st[u_st].y=y;
    Mat[x][y]=PixToStek;
    putpixel(x,y,ColFlood);
    AddStek(x+1,y);
    AddStek(x,y-1);
    AddStek(x-1,y);
    AddStek(x,y+1);
     }
  return 0;
}

int main ()
{
   int   i,j,ii;
   int   xs, ys;
   int   gdriver = DETECT, gmode;
   initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
   if ((ii= graphresult()) != grOk)
   {
      printf ("Err=%d\n", ii); return;
   }
   for(i=0; i< 300; i++)
   {
       Mat[i]=NULL;
       Mat[i]=(unsigned char *)malloc(300);
       if(Mat[i] == NULL)
       {
       for(j=i-1; j>= 0; j--) {
            free(Mat[j]);
            Mat[j]=NULL;
        }
      return 1;
       }
       for(j=0; j< 300; j++)
       {
       Mat[i][j]=0;
       putpixel(i,j,0);
       if((i == 100 || i == 250) && (j >= 20 && j <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       if((j ==  20 || j == 250) && (i >=100 && i <= 250)){ Mat[i][j]=1; putpixel(i,j,15);}
       }
   }
   st=(STEK *)malloc(MAXSTEK*sizeof(STEK));

   xs = 200; ys = 100;
   AddStek(xs,ys);

   getch();
   for(j=0; j< 300; j++) {free(Mat[j]); Mat[j]=NULL;}
   return 0;
}
 
--------------------
Говорила мама: "Учись играть на скрипке". Не хотел носить ноты - будешь носить пианино ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.