Построчное Заполнение

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем aidoqa, 26 фев 2012.

Статус темы:
Закрыта.
  1. aidoqa

    aidoqa Гость

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

    #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 */

    /*----------------------------------------------------- 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;
    }

    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
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей