Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 19:55   #1
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
Вопрос посточное заполнение многоугольника

ЗДравствуйте) у меня есть программа только она написана на старом билдере не могли бы вы помочь ее исправить пожалуйста
вот само
Задание.Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя.
код
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <winbgi.cpp>
#pragma hdrstop



/*----------------------------------------------------- V_FAST
 * Подпрограммы заливки области с затравкой
 * построчным алгоритмом:
 *
 * Pop_Stk   - Локальная подпрограмма. Извлекает координаты
 *			 пиксела из стека в глобальные скаляры xtek,ytek
 *
 * Push_Stk  - Локальная подпрограмма. Заносит координаты
 *			 пиксела в стек
 *
 * Get_Video - Локальная подпрограмма. Читает строку из
 *			 видеопамяти в глобальный буфер строки.
 *
 * Put_Video - Локальная подпрограмма. Копирует байты из
 *			 глобального буфера строки в видеопамять.
 *
 * Search	- Локальная подпрограмма. Ищет затравочные
 *			 пикселы в строке видеопамяти, находящейся
 *			 в глобальном массиве.
 *
 * V_FAST	- Собственно подпрограмма построчной заливки
 *			 гранично-определенной области
 *
 * V_FA_SET  - Устанавливает количественные ограничения
 *			для заливки
 */

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

#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 char *pc_video;		 /* Указ на буфер строки */
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 (int x, int 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 */

/*-------------------------------------------------- Get_Video
 * В байтовый буфер строки, заданный глобальным
 * указателем pc_video,
 * читает из видеопамяти пикселы y-строки от xbg до xen
 * Возвращает 0/1 - нет/есть ошибки
 */
static int  Get_Video (int y, char *pcxbg, char *pcxen)
//register char *pcxbg, *pcxen;
{  register int x;

   if (y>=0 && y<ver_max && pcxbg<=pcxen) {
	  x= pcxbg - pc_video;
	  do *pcxbg++= getpixel (x++, y); while (pcxbg <= pcxen);
	  y= 0;
   } else y= 1;
   return (y);
}  /* Get_Video */

/*-------------------------------------------------- Put_Video
 * Пикселы из буфера строки, начиная от указателя pxbg,
 * до указателя pxen пишет в y-строку видеопамяти
 * Возвращает 0/1 - нет/есть ошибки
 */
static int  Put_Video (int y, char *pxbg, char *pxen)
//register char *pxbg, *pxen;
{  register int  x;
   if (y>=0 && y<ver_max && pxbg<=pxen) {
	  x= pxbg - pc_video;
	  do putpixel (x++, y, *pxbg++); while (pxbg <= pxen);
	  y= 0;
   } else y= 1;
   return (y);
}  /* Put_Video */

Последний раз редактировалось ACE Valery; 26.02.2012 в 21:08.
AIdoqa вне форума Ответить с цитированием
Старый 26.02.2012, 19:55   #2
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Код:
/*----------------------------------------------------- Search
 * Ищет затравочные пикселы в yt-строке видеопамяти,
 * находящейся по указателю pc_video, начиная от
 * указателя pcl до указателя pcr
 * grn - код граничного пиксела
 * new - код, которым перекрашивается область
 * Возвращает: 0/1 - не найден/найден затравочный
 */
static int  Search (int yt, char *pcl, char *pcr, int grn, int nw)
//char *pcl, *pcr;  int grn, nw;
{  register int pix;
   register char *pc;
   int x, otw;

   otw= 0;
   while (pcl <= pcr) {
	  pc= pcl;						  /* Указ тек пиксела */
/* Поиск крайнего правого не закрашенного пиксела в строке */
	  while ((pix= *pc & 255) != grn && pix != nw && pc<pcr)
		 ++pc;

	  if (pc != pcl) {		  /* Найден закрашиваемый */
		 ++otw;
		 x= pc - pc_video;	  /* Его координата в строке */
		 if (pc != pcr || pix == grn || pix == nw) --x;
		 Push_Stk (x, yt);
	  }
/* Продолжение анализа строки пока не достигнут прав пиксел */
	  pcl= pc;
	  while (((pix= *pc & 255) == grn || pix==nw) && pc<pcr)
		 ++pc;
	  if (pc == pcl) ++pc;
	  pcl= pc;
   }
   return (otw);
}  /* Search */

/*----------------------------------------------------- V_FAST
 * Построчная заливка с затравкой гранично-определенной
 * области
 *
 * int V_FAST (int grn_pix, int new_pix, int x_isx, int y_isx)
 *
 * Вход:
 * grn_pix - код граничного пиксела
 * new_pix - код заполняющего пиксела
 * x_isx   - координаты затравки
 * y_isx
 *
 * Возвращает:
 * -2 - нет места под растровую строку
 * -1 - нет места под стек
 *  0 - норма
 *  1 - при чтении пикселов из видеопамяти в буферную
 *	  строки выход за пределы буферной строки
 *  2 - исчерпан стек при запросе координат пикселов
 *
 */
int V_FAST (int grn_pix, int new_pix, int x_isx, int y_isx)
//int grn_pix, new_pix, x_isx, y_isx;
{
   register char *pcl;	/* Указ левого  пиксела в строке */
   register char *pcr;	/* Указ правого пиксела в строке */
   int  otw;

   otw= 0;

/* Инициализация стека */
   if ((pn_stk= (int *)malloc (stk_max)) == NULL) {
	  --otw;  goto all;
   }
   pi_stk= pn_stk;

/* Заказ массива под растровую строку */
   if ((pc_video= (char *)malloc (gor_max)) == NULL) {
	  otw= -2;  goto fre_stk;
   }

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

/* Цикл заливки строк до исчерпания стека */

   while (pi_stk > pn_stk) {

/* Запрос координат затравки из стека */
	  if (Pop_Stk ()) {otw=2; break; }
	  pcl= pcr= pc_video + xtek;   /* Указ затравки */

/* Запрос полной строки из видеопамяти */
	  if (Get_Video (ytek, pc_video, pc_video+gor_max-1))
		 {otw= 1;  break; }

/* Закраска затравки и вправо от нее */
	  do *pcr++= new_pix; while ((*pcr & 255) != grn_pix);
	  --pcr;					/* Указ крайнего правого */

/* Закраска влево */
	  while ((*--pcl & 255) != grn_pix) *pcl= new_pix;
	  ++pcl;					/* Указ крайнего левого */

/* Занесение подправленной строки в видеопамять */
	  Put_Video (ytek, pcl, pcr);

/* Поиск затравок в строках ytek+1 и ytek-1,
 * начиная с левого подинтервала, заданного pcl, до
 * правого подинтервала, заданного pcr
 */
	  if (!Get_Video (++ytek, pcl, pcr))
		 Search (ytek, pcl, pcr, grn_pix, new_pix);

	  if (!Get_Video (ytek-= 2, pcl, pcr))
		 Search (ytek, pcl, pcr, grn_pix, new_pix);
   }
   free (pc_video);
fre_stk:
   free (pn_stk);
all:
   return (otw);
}  /* V_FAST */

/*--------------------------------------------------- V_FA_SET
 * Устанавливает количественные ограничения для заливки
 */
void V_FA_SET (int x_resolution, int y_resolution, int 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 */





/*-------------------------------------------------- FAST_MAIN
 */
void main (void)
{
   int   ii, kol, grn, nw, 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;			 /* Код пикселов границы */
   nw= 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;
   }

Последний раз редактировалось ACE Valery; 26.02.2012 в 21:09.
AIdoqa вне форума Ответить с цитированием
Старый 26.02.2012, 19:56   #3
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Код:
m0:goto m2;
m1:++entry;
   printf("Vertexs, boundary_pixel, new_pixel= (%d %d %d) ? ",
			kol, grn, nw);
   scanf ("%d%d%d", &kol, &grn, &nw);
   if (kol < 0) goto all;

   for (ii=0; ii<kol; ++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<kol-1; ++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<kol+3; ++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_FAST (grn, nw, x_isx, y_isx);
   printf ("Answer= %d MaxStack=%d\n", ii, stklen);
   goto m1;

all:
   closegraph();
}
вроде в страой версии программа работает но выдает ошибки [C++ Warning] Dialogs.hpp(437): W8058 Cannot create pre-compiled header: initialized data in header

Последний раз редактировалось ACE Valery; 26.02.2012 в 21:09.
AIdoqa вне форума Ответить с цитированием
Старый 26.02.2012, 19:56   #4
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Это все одна программа просто не поместилась
AIdoqa вне форума Ответить с цитированием
Старый 27.02.2012, 00:52   #5
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

на чём компилируете? Warning это не ошибка, может экзешник создается? прикрепите проект к сообщению, может так будет проще помочь.
microbit вне форума Ответить с цитированием
Старый 27.02.2012, 18:00   #6
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

вот сам проект если что то еще нужно спрашивайте.
Вложения
Тип файла: rar Project1.rar (8.0 Кб, 23 просмотров)
AIdoqa вне форума Ответить с цитированием
Старый 27.02.2012, 22:52   #7
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

я имел в виду исходник, а не скомпилированный проект
microbit вне форума Ответить с цитированием
Старый 28.02.2012, 05:37   #8
AIdoqa
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

вот все что с ним связано.
Вложения
Тип файла: rar СЦОИ.rar (106.6 Кб, 25 просмотров)
AIdoqa вне форума Ответить с цитированием
Старый 04.03.2012, 11:25   #9
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

да вспомнил, она компилируется на C++Builder XE, единственно заголовочные файлы подправил. Запускается, зарисовывает многоугольник, а дальше, что с ней делать я не знаю.
microbit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисование многоугольника в C# vandrouny C# (си шарп) 3 11.10.2010 23:30
поворот многоугольника в паскале Belii09878 Помощь студентам 3 25.06.2010 16:20
Определение площади многоугольника Bayazet Помощь студентам 5 17.02.2009 12:48
Задача с периметром многоугольника Abakan Общие вопросы C/C++ 1 02.01.2009 19:06
Как сделать посточное считывание с Memo Sanek777 Общие вопросы Delphi 19 25.09.2008 23:43