Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/55: Рейтинг темы: голосов - 55, средняя оценка - 4.65
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
1

Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя

09.02.2012, 16:03. Показов 11074. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
почему у меня не работает программа?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
 #include 
      #pragma hdrstop
      #include "windows.h"
      #include "Unit1.h"
      #pragma package(smart_init)
      #pragma resource "*.dfm"
      TForm1 *Form1;
      int x0=0,y0=0,start=0,xtmp,ytmp,xmet=-4,ymet=-2,metka=0; // переменные
      для построения графика
 
      int tx,ty,xm,xr,xl,j,c,meta; //Переменные самого алгоритма
      TColor kraska=clRed,bcolor=clBlue,nomy,my;
      struct pointt {
        unsigned int x;
        unsigned int y;
      };
 
      static pointt pont[500][500]; //Матрица реализаций
      int raz;
 
      cel()
      {
      Form1->PaintBox1->Canvas->Pen->Color = bcolor;
      Form1->PaintBox1->Canvas->Brush->Color=RGB(255,255,255);
      Form1->PaintBox1->Canvas->Rectangle(10,10,210,110);
      }
  
      __fastcall TForm1::TForm1(TComponent* Owner)
              : TForm(Owner)
      {
      kraska=RGB(255,0,0);bcolor=RGB(0,0,255);
 
      cel();
 
      Edit1->Text="<-- Нарисуйте гранично-заданную область -->";
      }
 
      Zakras()
      {
            xm=tx;
            while(Form1->PaintBox1->Canvas->Pixels[tx][ty]!=bcolor)
            {
                  Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;
                  tx=tx+1;
                      if (tx<=0) break;
                      if (ty<=0) break;
                      if (tx>420) break;
                      if (ty>420) break;
            }
 
              if(Form1->PaintBox1->Canvas->Pixels[tx][ty]==bcolor) xr=tx-1;
 
            tx=xm;
                      while(Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]!=bcolor)
                      {
                  Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;
                  tx=tx-1;
                      if (tx<=0) break;
                      if (ty<=0) break;
                      if (tx>420) break;
                      if (ty>420) break;
                      }
 
                      tx=tx+1;
            if(Form1->PaintBox1->Canvas->Pixels[tx-1][ty]==bcolor) xl=tx;
 
      }
 
      Stack()
      {
 
              tx=xl;
                             ty=ty+j;
                      while(tx<=xr)
                      {
                              c=0;
                              while((Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]!=bcolor)&&
                              (Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]!=kraska)&&(txPaintBox1->Canvas-
      >Pixels[tx][ty]==bcolor)||
                                         (Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]==kraska)) tx--;
                                             pont[raz]->x=tx;
                                      pont[raz]->y=ty;
                                }
                       tx=tx+1;
                       while(((Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]==bcolor)||
                       (Form1->PaintBox1->Canvas-
      >Pixels[tx][ty]==kraska))&&(txxl))
                         {tx=tx+1;}
                      }
 
 
      }
 
 
      Zaliv()
      {
              raz=1;
              pont[raz]->x=x0;
              pont[raz]->y=y0;
              while(raz>0)
              {
                    tx=pont[raz]->x;
                  ty=pont[raz]->y;
                    raz=raz-1;
                      Form1->PaintBox1->Canvas->Pixels[tx][ty]=kraska;
                      Zakras();
                       j=1;
                      Stack();
                       j=-2;
                      Stack();
              }
              Form1->Edit1->Text="Все закончилось";
      }
 
 
      void __fastcall TForm1::drawing(TObject *Sender, TMouseButton Button,
            TShiftState Shift, int X, int Y)
      {
         if(start==5) {x0=X;y0=Y;Canvas->Pixels[X][Y]=kraska;
      Zaliv();
      }
 
          if((Button==mbLeft)&&(start!=5))
                  {
                   Canvas->Pen->Color = bcolor; // выбрать цвет контура
      //        Brush->Color = clYellow; // выбрать цвет заливки
              if(metka==1) Canvas->LineTo(X,Y);
              metka=1;
               // нарисовать эллипс
              xtmp=X;
              ytmp=Y;
              Canvas->MoveTo(X,Y);
              if(start==0) {x0=X,y0=Y;start=1;}
            // randomize();
      //Canvas->Brush->Color = (Graphics::TColor) $(00FF0000);
 
              }
 
              if (Button==mbRight)
              {
              Canvas->Pen->Color = bcolor;
              Canvas->LineTo(x0,y0);
              metka=0;
              start=0;
              }
              }
 
      void __fastcall TForm1::movexy(TObject *Sender, TShiftState Shift, int
      X,
            int Y)
      {
         Label2->Caption=X;
         Label4->Caption=Y;
       //  xtmp=X;ytmp=Y;
           //Label6->Caption=Canvas->Pixels[x0][y0];
         //Zaliv();
 
      }
 -
      void __fastcall TForm1::vpered(TObject *Sender, TMouseButton Button,
            TShiftState Shift, int X, int Y)
      {
 
          Edit1->Text=" Выберите точку закраски";
      start=5;
      }
  
      void __fastcall TForm1::reset_key(TObject *Sender, TMouseButton
      Button,
            TShiftState Shift, int X, int Y)
      {
      start=0;
 
        PaintBox1->Visible=false;
      PaintBox1->Visible=true;
 
      start=0;
 
      Edit1->Text="<-- Нарисуйте гранично-заданную область -->";
      }
Добавлено через 31 минуту
или в данном варианте где ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
#include <stdio.h>
#include <graphics.h>
 
#define MAXARR 300  /* Ìàêñ êîë-âî âåðøèí ìíîãîóãîëüíèêà  */
#define MAXLST 300  /* Ìàêñ ðàçìåð ñïèñêà àêòèâíûõ ðåáåð  */
 
 
/*---------------------------------------------------- FILSTR
 * Çàëèâàåò ñòðîêó iy îò ixn äî ixk
 *
 * void FILSTR (int kod, int iy, int ixn, int ixk)
 */
void FILSTR (kod, iy, ixn, ixk)
int kod, iy, ixn, ixk;
{
   while (ixn <= ixk) putpixel (ixn++, iy, kod);
}  /* FILSTR */
 
 
 
/*--------------- Ãëîáàëû ïðîöåäóðû çàêðàñêè ---------------*/
 
static int   KOD, NWER; /* Êîä çàëèâêè è êîë-âî âåðøèí      */
static float *pt_X;     /* Ìàññèâû âõîäíûõ êîîðäèíàò âåðøèí */
static float *pt_Y;
 
static int   IBGIND;        /* Íîìåð ñëåä âåðøèíû â ñïèñêå */
static int   IEDG[MAXARR];  /* Y-êîîðä âåðøèí ïî âîçðàñòàí */
static int   INOM[MAXARR];  /* è èõ íîìåðà â èñõ ìàññ Py   */
 
/* Ñïèñîê àêòèâíûõ ðåáåð */
static int   IDLSPI;        /* Äëèíà ñïèñêà àêòèâíûõ ðåáåð */
static int   IYREB[MAXLST]; /* Ìàêñ Y-êîîðä àêòèâíûõ ðåáåð */
static float RXREB[MAXLST]; /* Òåê  X-êîîðä àêòèâíûõ ðåáåð */
static float RPRIR[MAXLST]; /* Õ-ïðèðàùåíèå íà 1 øàã ïî Y  */
static float RYSL[MAXLST];  /* Dy ìåæäó òåê è ñîñåäí âåðø  */
                            /* Dy <= 0.0 - îáû÷íàÿ âåðøèíà */
                            /*     > 0.0 - ëîêàë ýêñòðåìóì */
 
 
/*---------------------------------------------------- FORSPI
 * int  FORSPI (int IYBEG)
 *
 *  1) Ôîðìèðóåò ýëåìåíòû ñïèñêà äëÿ ðåáåð,
 *     íà÷èíàþùèõñÿ â IYBEG;
 *  2) Âû÷ècëÿeò IBGIND - èíäeêc ía÷aëa ñëåäóþùåé
 *     âepøèíû â cïècêe âepøèí;
 *  3) Âîçâðàùàåò IYSLED - Y êoopäèíaòy áëèæaéøeé
 *     âepøèíû, äo êoòopoé ìoæío çaëèâaòü áeç
 *     ïepecòpoéêè cïècêa.
 *
 *  Ãëoáaëüíûe âeëè÷èíû :
 *
 *  KOD    - êîä çàëèâêè
 *  NWER   - êoë-âo âepøèí â ècxoäíoì ìíoãoyãoëüíèêe,
 *  *pt_X  - X-êoopäèíaòû ècxoäíoão ìíoãoyãoëüíèêà,
 *  *pt_Y  - Y-êoopäèíaòû ècxoäíoão ìíoãoyãoëüíèêà,
 *  IEDG   - yïopÿäo÷eííûé ïo âoçpacòaíèþ ìaccèâ
 *           Y êoopäèíaò âepøèí ècxoäíoão ìíoãoyãoëüí
 *  INOM   - INOM[i] çaäaeò íoìep âepøèíû â ècxoäíoì
 *           ìíoãoyãoëüíèêe äëÿ IEDG[i],
 *  IBGIND - èíäeêc ìaccèâoâ IEDG, INOM
 *           oïpeäeëÿeò ãäe ìoæeò ía÷aòücÿ ðåápo,
 *  IDLSPI - äëèía ïocòpoeííoão cïècêa aêòèâíûx ðåáep,
 *           cocòoÿùeão èç :
 *           IYREB  - ìaêc êoopäèíaòû ðåáep,
 *           RXREB  - âía÷aëe ìèí, çaòeì òeêyùaÿ X-êoopäèíaòa,
 *           RPRIR  - ïpèpaùeíèe ê X-êoopäèíaòe ía 1 øaã ïo Y,
 *           RYSL   - ïpèçíaê òoão ÷òo ça âepøèía :
 *                    <= 0 - oáû÷íaÿ,
 *                     > 0 - ëoêaëüíûé ýêcòpeìyì
 *                     ïepece÷eíèe còpoêè çaêpacêè
 *                     c ýêcòpeìyìoì c÷èòaeòcÿ ça 2 òo÷êè,
 *                     c oáû÷íoé - ça 1;
 */
 
static int  FORSPI (IYBEG)
int  IYBEG;
{
 
   int   i,ikledg,intek,intabs,isd;
   int   iyt,ixt,nrebra,inc,inpred,inposl;
   float xt, xc, yt, yc, dy;
 
/* ikledg = êoë-âo âepøèí c äaííûì IYBEG */
 
   ikledg= 0;
   for (i=IBGIND; i<=NWER; ++i)
      if (IEDG[i] != IYBEG) break; else ++ikledg;
 
/* Öèêë ïocòpoeíèÿ cïècêa aêòèâíûx ðåáep
   è çaêpaøèâaíèe ãopèçîíòàëüíûõ ðåáep
 */
 
   for (i=1; i<=ikledg; ++i) {
/* Bû÷èñë íîìåðà òåêóùåé âåðøèíû */
      intek= INOM[IBGIND+i-1];
      intabs= abs (intek);
      xt= pt_X[intabs];
      yt= pt_Y[intabs];
 
/*  Bû÷èñë íîìåðîâ ïðåäûä è ïîñëåä âåðøèí */
      if ((inpred= intabs - 1) < 1) inpred= NWER;
      if ((inposl= intabs + 1) > NWER) inposl= 1;
 
/*
 * Ïî çàäàííûì :
 *    NWER   - êîë-âî âåðøèí,
 *    intek  - íîìåð òåêóùåé âåðøèíû,
 *    isd = 0/1 - ïðàâèëó âûáîðà ñîñåäíåé âåðøèíû -
 *                ïðåäûäóùàÿ/ïîñëåäóþùàÿ
 *    âû÷ècëÿeò dy,
 *    Åcëè dy <  0 òo âepøèía yæe oápaáoòaía,
 *    Åcëè dy == 0 òo âepøèíû ía oäíîì Y
 *                 Ïpè ýòoì còpoèòcÿ ãopèçoíòaëüíûé oòpeçoê.
 *                 Ôaêò çaêpacêè ãopèçoíòaëüíoão ðåápa
 *                 oòìe÷aeòcÿ oòpèöaòeëüíûì çía÷eíèeì
 *                 cooòâeòcòâyþùeão çía÷eíèÿ INOM.
 *    Åcëè dy >  0 òo ôopìèpyeòcÿ íoâûé ýëeìåíò cïècêa
 *                 aêòèâíûx ðåáep
 */
 
      for (isd=0;  isd<=1; ++isd) {
         if (!isd) nrebra= inc= inpred; else {
            inc= inposl;  nrebra= intabs;
         }
         yc= pt_Y[inc];
         dy= yc - yt;
         if (dy < 0.0) continue;
         xc= pt_X[inc];
         if (dy != 0.0) goto DYNE0;
            if ((inc= INOM[nrebra]) < 0) continue;
            INOM[nrebra]= -inc;
            iyt= yt;
            inc= xc;
            ixt= xt;
            FILSTR (KOD, iyt, inc, ixt);
            continue;
DYNE0:   ++IDLSPI;
         IYREB[IDLSPI]= yc;
         RXREB[IDLSPI]= xt;
         RPRIR[IDLSPI]= (xc - xt) / dy;
         inc= (!isd) ? inposl : inpred;
         RYSL[IDLSPI]=  pt_Y[inc] - yt;
      }   /* öèêëà ïî isd */
   }  /* ïîñòðîåíèÿ ñïèñêà àêòèâíûõ ðåáåð */
 
/*  Bû÷èñëåíèå Y áëèæàéøåé âåðøèíû */
   if ((i= (IBGIND += ikledg)) > NWER) i= NWER;
   return (IEDG[i]);
} /* Ïðîöåäóðû FORSPI */
 
 
 
/*-----------------------------------------------------  V_FP1
 * Îäíîòîííî çàëèâàåò ìíîãîóãîëüíèê,
 * çàäàííûé êîîðäèíàòàìè âåðøèí
 *
 * void V_FP1 (int pixel, int kol, float *Px, float *Py)
 *
 */
void V_FP1 (pixel, kol, Px, Py)
int  pixel, kol;  float *Px, *Py;
{
int  i,j,k,l;
int  iytek;    /* Y òåêóùåé ñòðîêè ñêàíèðîâàíèÿ        */
int  iymin;    /* Y-ìèí ïðè ñîðòèðîâêå ìàññèâà Y-êîîðä */
int  iybeg;    /* Ìèí Y-êîîðäèíàòà çàëèâêè  */
int  iymak;    /* Max Y-êîîðäèíàòà çàëèâêè  */
int  iysled;   /* Y êoopä áëèæaéøeé âepøèíû, äo êoòopoé */
               /* ìîæíî çaëèâaòü áeç ïepecòpoéêè cïècêa */
int  newysl;
int  ixmin;    /* X-ìèí ïðè ñîðòèðîâêå äëÿ òåê ñòðîêè */
int  ixtek;    /* X-òåê ïðè ñîðòèðîâêå äëÿ òåê ñòðîêè */
int  irabx[MAXLST]; /* X-êîîðä ïåðåñå÷åíèé â ñòðîêå ñêàíèð */
 
   KOD= pixel;    /* Ïàðàìåòðû â ãëîáàëû */
   NWER= kol;
   pt_X= Px;
   pt_Y= Py;
 
/*  Ïîñòðîåíèå ìàññèâîâ Y è èõ íîìåðîâ */
   for (i= 1; i<=NWER; ++i) {IEDG[i]= Py[i];  INOM[i]= i; }
 
/*  Cîâìåñòíàÿ ñîðòèðîâêà ìàññèâîâ IEDG, IHOM */
   for (i= 1; i<=NWER; ++i) {
      iymin= IEDG[i];
      k= 0;
      for (j=i+1; j<=NWER; ++j)
         if ((l= IEDG[j]) < iymin) {iymin= l; k= j; }
      if (k) {
         IEDG[k]= IEDG[i]; IEDG[i]= iymin;
         iymin= INOM[k];
         INOM[k]= INOM[i]; INOM[i]= iymin;
      }
   }
 
/* Hà÷àëüíûå ïðèñâîåíèÿ */
   IDLSPI= 0;
   IBGIND= 1;
   iybeg= IEDG[1];
   iymak= IEDG[NWER];
 
/* Ôîðìèðîâàíèå íà÷àëüíîãî ñïèñêà àêò ðåáåð */
 
   iysled= FORSPI (iybeg);
   if (!IDLSPI) goto KOHGFA;
 
/* Ãîðèçîíòàëüíàÿ ðàñêðàñêà ïî ñïèñêó */
 
ZALIWKA:
 
   for (iytek=iybeg; iytek<=iysled; ++iytek) {
      if (iytek == iysled) {    /* Y-êîîðäèíàòà ïåðåñòðîéêè */
         newysl= FORSPI (iytek);
         if (!IDLSPI) goto KOHGFA;
      }
 
/* Bûáîðêà è ñîðòèðîâêà X-îâ èç ñïèñêà ðåáåð */
      l= 0;
      for (i=1; i<=IDLSPI; ++i)
         if (RYSL[i] > 0.0) irabx[++l]= RXREB[i];
         else RYSL[i]= 1.0;
 
      for (i=1;  i<=l; ++i) {
         ixmin= irabx[i];
         k= 0;
         for (j=i+1;  j<=l; ++j) {
            ixtek= irabx[j];
            if (ixtek < ixmin) {k= j; ixmin= ixtek; }
         }
         if (k) {irabx[k]= irabx[i];  irabx[i]= ixmin; }
      }  /* öèêëà ñîðòèðîâêè */
 
/*  Cîáñòâåííî çàëèâêà */
 
      for (j=1;  j<=l-1;  j+= 2)
         FILSTR (KOD,iytek,irabx[j],irabx[j+1]);
 
      for (j=1;  j<=IDLSPI; ++j)        /*  Ïðèðàùåíèÿ X-îâ */
         RXREB[j]= RXREB[j] + RPRIR[j];
   }  /* öèêëà ãîðèçîíòàëüíîé ðàñêðàñêè */
 
   if (iysled == iymak) goto KOHGFA;
 
/*  Bûáðàñûâàíèå èç ñïèñêà âñåõ ðåáåð ñ YMAK ðåáðà == YSLED */
 
   i= 0;
M1:++i;
M2:if (i > IDLSPI) goto WYBROSILI;
      if (IYREB[i] != iysled) goto M1;
         --IDLSPI;
         for (j=i;  j<=IDLSPI; ++j) {
            IYREB[j]= IYREB[k= j+1];
            RXREB[j]= RXREB[k];
            RPRIR[j]= RPRIR[k];
         }
         goto M2;
WYBROSILI:
   iybeg= iysled + 1;
   iysled= newysl;
   goto ZALIWKA;
 
KOHGFA:;
}  /* V_FP1 */
Добавлено через 1 минуту
мне самое главное нужно заполнить многоугольник с использованием затравочного пикселя.

Добавлено через 17 часов 54 минуты
у кого нибудь есть варианты где может быть здесь ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2012, 16:03
Ответы с готовыми решениями:

Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя
Задание: 1. Методом построчного заполнения с затравкой закрасить произвольно задаваемую область,...

Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя
проверьти работает ли программа или в чем ошибка? unit Unit1; interface uses Windows,...

Алгоритм построчного заполнения фигур с затравкой
int LineFill(int x, int y, int dir, int PrevXl, int PrevXr, int **L, int BolderColor, int Color)...

Простой и построчный алгоритм заполнения многоугольника
Простой и Построчный алгоритм заполнения многоугольника с затравкой C#. Собственно как это чудо...

27
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.02.2012, 17:15 2
еще бы понять, что имел ввиду программист, который "ЭТО" Написал
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 11:36  [ТС] 3
http://algolist.manual.ru/graphics/fill.phpө отсюда взял
самр задание вроде Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя.

Добавлено через 18 часов 9 минут
кто нибудь??
0
Заблокирован
Автор FAQ
10.02.2012, 14:03 4
Цитата Сообщение от Алиш Посмотреть сообщение
кто нибудь??
- ну и ужас: затравочный пиксел, куча классов - хотим просто рисовать в консоли вот пожалуйста

Как рисовать элементарные геометрические фигуры?
Построить на экране рисунок одно подъездного дома, если известны координаты левого верхнего угла дома
Тут ещё куча примеров по продвинутей
Прорисовка в окне по нажатию кнопки(обработчик кнопки) MFC
1
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
10.02.2012, 15:23 5
ну, заполнение многоугольника с помощью затравочного пикселя - один из основных алгоритмов машинной графики. и для учебного задания вполне подходит.
другое дело, что нужно разделить сам алгоритм и вывод результатов его работы на экран. реализации алгоритма в интернете куча. наиболее базовый подход в книге "Основы интерактивной машинной графики" Фоли и вэн Дэма.
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 15:25  [ТС] 6
-=ЮрА=-, в этих сылках которые вы привели используется "Затравочный пиксель"?
p.s.мне еще надо его заполнить по строчно.

Добавлено через 54 секунды
Paporotnik,
Цитата Сообщение от Paporotnik Посмотреть сообщение
вывод результатов его работы на экран
0
Заблокирован
Автор FAQ
10.02.2012, 16:01 7
Цитата Сообщение от Алиш Посмотреть сообщение
используется "Затравочный пиксель"?
- нет я без понятия вообще, что это за ерундель такая

Добавлено через 2 минуты
Цитата Сообщение от Алиш Посмотреть сообщение
#include <graphics.h>
- стоп этоже билдер, мой код для студии и в билдере врядли пойдёт, см сюда
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 21:33  [ТС] 8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
нет я без понятия вообще, что это за ерундель такая
к сожелению мне нужно сделать программу с этой ерундели.

Добавлено через 3 часа 16 минут
ПОМОГИТЕ ПЛИЗ))
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
10.02.2012, 21:53 9
Цитата Сообщение от Алиш Посмотреть сообщение
к сожелению мне нужно сделать программу с этой ерундели.
насколько я понимаю это значение пиксел в определенной точке
например в точке 2,2 синий цвет надо поменять на зеленый
смотрим вправо если синий то меняем на зеленый
еще вправо опять меняем до тех пор пока пиксель не будет синим (нечего менять)
идем влево
потом вверх
потом вниз
короче самое железобетонное рекурсия
1
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
10.02.2012, 22:07 10
не, рекурсивно получишь переполнение стека в раз. об этом, кстати, во всех описаниях алгоритма упоминают.
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 22:16  [ТС] 11
ValeryS, Paporotnik, помогите составить программу.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
10.02.2012, 22:36 12
Цитата Сообщение от Paporotnik Посмотреть сообщение
не, рекурсивно получишь переполнение стека в раз
сдуру то можно и не только стек сломать
можно ведь ввести ограничения вхождения

Добавлено через 2 минуты
и потом я ведь не сказал что это самое лучшее
рекурсия это самое первое что приходит в голову (и самое медленное)
ну и самое понятное для новичка

Добавлено через 16 минут
наброски
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fncFill(int x,int y,char * pole,char colorFill, char colorMask)
{
   pole[x][y]=colorFill;
  if(pole[x+1][y]==colorMask)
     fncFill(x+1,y,pole,colorFill,colorMask);
 
   if(pole[x][y+1]==colorMask)
     fncFill(x,y+1,pole,colorFill,colorMask);
 
if(pole[x-1][y]==colorMask)
     fncFill(x-1,y,pole,colorFill,colorMask);
 
   if(pole[x][y-1]==colorMask)
     fncFill(x,y-1,pole,colorFill,colorMask);
 
}
здесь нет проверки на выход за пределы массива
и глубины вхождений (сам сделай)
а без них возможен


Цитата Сообщение от Paporotnik Посмотреть сообщение
получишь переполнение стека в раз.
1
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
10.02.2012, 22:43 13
http://en.wikipedia.org/wiki/Flood_fill
разбирайся. scanline fill в твоем случае
2
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
11.02.2012, 22:31  [ТС] 14
ValeryS,Paporotnik, Спасибо!
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь нет проверки на выход за пределы массива
и глубины вхождений (сам сделай)
постораюсь.(а без них оосталось просто добавить стандартные библиотеки)
Цитата Сообщение от ValeryS Посмотреть сообщение
а без них возможен
Цитата Сообщение от ValeryS Посмотреть сообщение
получишь переполнение стека в раз.
что значит переполнение стека в раз?
если вас не затруднит можете ее написать полностью)

Добавлено через 20 часов 19 минут
По жайлуйста помогите закончит эту программу)

Добавлено через 3 часа 18 минут
&&&&&&&&&&&&&&
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.02.2012, 08:07 15
Что такое затравочный пиксель не знаю, но залить область с помощью стека можно так:
C++
1
2
3
4
enum cell { empty, visited, unvisited };
 
typedef std::vector< cell > T_row;
typedef std::vector< T_row > T_matr;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void paint_ridge(T_matr &matrix, int y, int x )
{
    const int n = matrix.size();
    const int m = matrix[0].size();
    
    std::stack< std::pair< int, int > > stack;
    
    stack.push( std::make_pair( y, x ) );
    
    while ( !stack.empty() )
    {
        std::pair< int, int > temp = stack.top();
        stack.pop();
        
        int i = temp.first;
        int j = temp.second;
        
        if ( matrix[i][j] != unvisited )
            continue;
            
        matrix[i][j] = visited;
        
        #define check(a, b) \
        if ( (a) >= 0 && (a) < n && (b) >= 0 && (b) < m && matrix[a][b] == unvisited ) \
        { \
            stack.push( std::make_pair(a, b) ); \
        } 
        
        check(i - 1, j)
        check(i + 1, j)
        check(i, j - 1)
        check(i, j + 1)
    }
    
}
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
12.02.2012, 10:05  [ТС] 16
diagon, а библиотеки какие нибудь нужно подключать у меня dev c++
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.02.2012, 11:19 17
Цитата Сообщение от Алиш Посмотреть сообщение
diagon, а библиотеки какие нибудь нужно подключать у меня dev c++
Стандартные <stack>, <vector>, <utility>
Но вам видимо другой алгоритм нужен, у меня через рекурсию сделано, только вместо глобального стека используется STL'овская реализация.
И состояния клеток в вашем случае другими будут.
1
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
12.02.2012, 17:31  [ТС] 18
diagon,жаалко((( можете подсказать какие нужно включить библиотеки, чтоб работала программа в dev c++?
как сделать программу в нужном мне алгоритме.
0
-=ЮрА=-
12.02.2012, 18:05
  #19

Не по теме:


Цитата Сообщение от Алиш Посмотреть сообщение
если вас не затруднит можете ее написать полностью)
Алиш, я могу лишь тебе дать дружеский совет - выставь свою проблемму в раздел фриланс, думаю там найдутся люди которые сделают дёшево и сердито. Чесн слово и рад бы тебе помочь но в
Цитата Сообщение от Алиш Посмотреть сообщение
dev c
не работаю и умею создавать графику лишь теми методами котые описал вначале этого топика:(:pardon:

0
62 / 2 / 0
Регистрация: 10.04.2011
Сообщений: 126
13.02.2012, 20:23  [ТС] 20

Не по теме:

-=ЮрА=-, если бы была возможность, я бы обратился, а так здесь может кто хорошо разбирается может поможет



Добавлено через 9 минут
Построчный алгоритм заливки с затравкой
Использует пространственную когерентность:
· пикселы в строке меняются только на границах;
· при перемещении к следующей строке размер заливаемой строки скорее всего или неизменен или меняется на 1 пиксел.

Таким образом, на каждый закрашиваемый фрагмент строки в стеке хранятся координаты только одного начального пиксела [], что приводит к существенному уменьшению размера стека.
Последовательность работы алгоритма для гранично определенной области следующая:
Координата затравки помещается в стек, затем до исчерпания стека выполняются пункты 2-4.
Координата очередной затравки извлекается из стека и выполняется максимально возможное закрашивание вправо и влево по строке с затравкой, т.е. пока не попадется граничный пиксел. Пусть это Хлев и Хправ, соответственно.

Анализируется строка ниже закрашиваемой в пределах от Хлев до Хправ и в ней находятся крайние правые пикселы всех незакрашенных фрагментов. Их координаты заносятся в стек.
То же самое проделывается для строки выше закрашиваемой.
В Приложении 6 приведена процедура V_FAST, реализующая рассмотренный алгоритм. За счет несложной модификации служебных процедур запроса и записи строк изображения, данная процедура может заливать изображение, размещенное в файле.
здесь вроде подробно написано только у меня почемуто прогрмма не работает


может это с++ не для начинающих(надо было наверное создать тему с++ для экспертов)?
0
13.02.2012, 20:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2012, 20:23
Помогаю со студенческими работами здесь

Алгоритм закрашивания многоугольника линиями
Доброго времени суток! Интересует пара вопросов по следующему алгоритму: Найти min{yi} и...

Алгоритм нахождения вершин многоугольника
Есть таблица с координатами точек. Как определить вершины многоугольника? Вершин может быть...

Алгоритм нахождения вершин многоугольника
Как построить многоугольник с максимальной точностью, если известно: 1.Количество вершин...

Реализовать алгоритм закраски произвольного многоугольника
Помогите,кто знает Реализовать алгоритм закраски произвольного многоугольника,если r=1


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru