Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
09.02.2012, 16:03     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #1
почему у меня не работает программа?
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 минуты
у кого нибудь есть варианты где может быть здесь ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2012, 16:03     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя
Посмотрите здесь:

Алгоритм Евклида с использованием рекурсии C++
C++ Алгоритм заполнения алфавита
Алгоритм поиска внутренних координат для произвольно заданного невыпуклого многоугольника C++
C++ В данный класс добавить код для построчного чтения из файла
Подскажите алгоритм заполнения матрицы по спирали C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.02.2012, 17:15     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #2
еще бы понять, что имел ввиду программист, который "ЭТО" Написал
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 11:36  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #3
http://algolist.manual.ru/graphics/fill.phpө отсюда взял
самр задание вроде Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя.

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

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

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

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

Добавлено через 3 часа 16 минут
ПОМОГИТЕ ПЛИЗ))
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
10.02.2012, 21:53     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #9
Цитата Сообщение от Алиш Посмотреть сообщение
к сожелению мне нужно сделать программу с этой ерундели.
насколько я понимаю это значение пиксел в определенной точке
например в точке 2,2 синий цвет надо поменять на зеленый
смотрим вправо если синий то меняем на зеленый
еще вправо опять меняем до тех пор пока пиксель не будет синим (нечего менять)
идем влево
потом вверх
потом вниз
короче самое железобетонное рекурсия
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
10.02.2012, 22:07     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #10
не, рекурсивно получишь переполнение стека в раз. об этом, кстати, во всех описаниях алгоритма упоминают.
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
10.02.2012, 22:16  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #11
ValeryS, Paporotnik, помогите составить программу.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
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 Посмотреть сообщение
получишь переполнение стека в раз.
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
10.02.2012, 22:43     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #13
http://en.wikipedia.org/wiki/Flood_fill
разбирайся. scanline fill в твоем случае
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
11.02.2012, 22:31  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #14
ValeryS,Paporotnik, Спасибо!
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь нет проверки на выход за пределы массива
и глубины вхождений (сам сделай)
постораюсь.(а без них оосталось просто добавить стандартные библиотеки)
Цитата Сообщение от ValeryS Посмотреть сообщение
а без них возможен
Цитата Сообщение от ValeryS Посмотреть сообщение
получишь переполнение стека в раз.
что значит переполнение стека в раз?
если вас не затруднит можете ее написать полностью)

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

Добавлено через 3 часа 18 минут
&&&&&&&&&&&&&&
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 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)
    }
    
}
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
12.02.2012, 10:05  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #16
diagon, а библиотеки какие нибудь нужно подключать у меня dev c++
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
12.02.2012, 11:19     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #17
Цитата Сообщение от Алиш Посмотреть сообщение
diagon, а библиотеки какие нибудь нужно подключать у меня dev c++
Стандартные <stack>, <vector>, <utility>
Но вам видимо другой алгоритм нужен, у меня через рекурсию сделано, только вместо глобального стека используется STL'овская реализация.
И состояния клеток в вашем случае другими будут.
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
12.02.2012, 17:31  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #18
diagon,жаалко((( можете подсказать какие нужно включить библиотеки, чтоб работала программа в dev c++?
как сделать программу в нужном мне алгоритме.
-=ЮрА=-
12.02.2012, 18:05
  #19

Не по теме:


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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 20:23     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя
Еще ссылки по теме:

Написать программу построчного вывода целочисленной матрицы 3*5 с выравниванием по левой границе C++
Цикл для построчного считывания из файла C++
C++ Вычислить площадь многоугольника с использованием функции,которая определяет площадь по координатам его вершин

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

Или воспользуйтесь поиском по форуму:
Алиш
 Аватар для Алиш
62 / 2 / 3
Регистрация: 10.04.2011
Сообщений: 126
13.02.2012, 20:23  [ТС]     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя #20

Не по теме:

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



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

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

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


может это с++ не для начинающих(надо было наверное создать тему с++ для экспертов)?
Yandex
Объявления
13.02.2012, 20:23     Алгоритм построчного заполнения многоугольника с использованием затравочного пикселя
Ответ Создать тему
Опции темы

Текущее время: 10:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru