• 填充算法


     

    种子填充:

     1 #include <GL/glut.h>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<stack>
     5 using namespace std;
     6 
     7 int v[1000][1000];
     8 
     9 
    10 
    11 void init()
    12 {
    13     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                
    14     glutInitWindowPosition(100, 100);                          
    15     glutInitWindowSize(400, 300);                               
    16     glutCreateWindow("种子填充");                           
    17 
    18     glClearColor(0.0, 0.0, 0.0, 0.0);
    19     glMatrixMode(GL_PROJECTION);
    20     gluOrtho2D(0, 1000, 0, 1000); 
    21 
    22     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
    23     glClear(GL_COLOR_BUFFER_BIT);
    24       
    25     memset(v,0,sizeof(v));
    26 }
    27 
    28 void setPixel (GLint x,GLint y)               
    29 {
    30     glBegin(GL_POINTS);
    31        glVertex2i(x, y);
    32     glEnd();
    33 }
    34 
    35 void dfs(int x,int y)
    36 {
    37     if (x<350||x>450||y<350||y>450) return ;
    38     if (v[x][y]) return ;
    39     v[x][y]=1;
    40     dfs(x+1,y);
    41     dfs(x-1,y);
    42     dfs(x,y+1);
    43     dfs(x,y-1);
    44     setPixel(x,y);
    45     
    46 }
    47 
    48 void myDisplay(void)                                             
    49 { 
    50    glColor3f(1.0, 0.0, 0.0);
    51    glBegin(GL_LINE_LOOP);
    52        glVertex2f(350,350);
    53        glVertex2f(450,350);
    54        glVertex2f(450,450);
    55        glVertex2f(350,450);
    56    glEnd();
    57    glFlush();
    58    
    59    glColor3f(0.0, 1.0, 0.0);
    60    dfs(400,400);
    61    glFlush(); 
    62                                                      
    63  }
    64 
    65  int main(int argc, char *argv[])
    66  {
    67      glutInit(&argc, argv);
    68      init();                                                    
    69      glutDisplayFunc(&myDisplay);                                                  
    70      glutMainLoop();                                           
    71      return 0; 
    72  }
    View Code
      1 /*************************************************************
      2      pb-????4
      3      ??????
      4 
      5 *************************************************************/
      6 
      7 
      8 #include <GL/glut.h>
      9 #include<cstdio>
     10 #include<cmath>
     11 #include<stack>
     12 using namespace std;
     13 
     14 int x,y,endx,endy,p;
     15 int v[3000][3000];
     16 
     17 struct ST
     18 {
     19     int x,y;
     20 };
     21 ST st[100];
     22 int len=0;
     23 ST f,r;
     24 stack<ST>s;
     25 int yi[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
     26 
     27 void init()
     28 {
     29     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //????????,????????,??????
     30     glutInitWindowPosition(100, 100);                            //???????
     31     glutInitWindowSize(400, 300);                                //??????
     32     glutCreateWindow("pb-????4");                            //?????
     33 
     34     glClearColor(0.0, 0.0, 0.0, 0.0);
     35     glMatrixMode(GL_PROJECTION);
     36     gluOrtho2D(-1000, 1000, -1000, 1000); 
     37 
     38     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
     39     glClear(GL_COLOR_BUFFER_BIT);
     40     glColor3f(1.0, 0.0, 0.0); 
     41     
     42     
     43     memset(v,0,sizeof(v));
     44     while (!s.empty()) s.pop();
     45 }
     46 
     47 
     48 void setPixel (GLint x,GLint y)               //????,???x,y?nx,ny???????
     49 {
     50     glBegin(GL_POINTS);
     51        glVertex2i(x, y);
     52     glEnd();
     53 }
     54 
     55 //?????
     56 void swap(int &x,int &y)
     57 {
     58     x^=y;
     59     y^=x;
     60     x^=y;
     61 }
     62 
     63 
     64 //?k???,p=1?? 0<k<1; p=2?? k>1; p=3 ?? -1<k<0; p=4?? k<-1;
     65 //?????????0<k<1?
     66 void Spoint()
     67 {
     68    if ((endx-x)*(endy-y)>0)
     69     {
     70         if (abs(endx-x)-abs(endy-y)>=0) p=1;
     71         else 
     72         {
     73             p=2;
     74             swap(x,y);
     75             swap(endx,endy);
     76         }
     77     }
     78     else
     79     {
     80            if (abs(endx-x)-abs(endy-y)>=0) 
     81            {
     82                p=3;
     83                y=-y;
     84                endy=-endy;
     85            }
     86            else 
     87            {
     88                p=4;
     89                x=-x;
     90                endx=-endx;
     91                swap(x,y);
     92                swap(endx,endy);
     93            }
     94     }
     95 }
     96 
     97 
     98 
     99 
    100 void setpoint(int x0,int y0)
    101 {
    102     if (p==1)  
    103     {
    104         v[x0+1001][y0+1001]=1;
    105     //    setPixel(x0,y0);
    106     }
    107     if (p==2)  
    108     {
    109         
    110         v[y0+1001][x0+1001]=1;
    111     //    setPixel(y0,x0);
    112     }
    113     if (p==3)  
    114     {
    115     
    116         v[x0+1001][-y0+1001]=1;
    117     //    setPixel(x0,-y0);
    118     }
    119     if (p==4)  
    120     {
    121     
    122         v[-y0+1001][x0+1001]=1;
    123     //    setPixel(-y0,x0);
    124     }
    125 }
    126 
    127 //Bresenham???
    128 void myDisplay(void)                                             
    129 { 
    130     x=st[len-2].x;
    131     y=st[len-2].y;
    132     int i;
    133     for (i=0;i<len-1;i++)
    134     {
    135         endx=st[i].x;
    136         endy=st[i].y;
    137         Spoint();
    138         int dx=abs(x-endx),dy=abs(y-endy);
    139         int d=2*dy-dx;
    140         int tdy=2*dy,tdx=2*(dy-dx);
    141         
    142         if (x>endx)
    143         {
    144            swap(x,endx);
    145            swap(y,endy);
    146         }
    147         x-=40;
    148         v[x+1001][y+1001]=1;
    149         
    150         while (x<endx+40)
    151         {
    152             x++;
    153             if (d<0)
    154             {
    155                 d+=tdy;
    156             }
    157             else
    158             {
    159               y++;
    160              d+=tdx;
    161             }
    162           setpoint(x,y);
    163          
    164         }
    165         x=st[i].x;
    166         y=st[i].y;
    167     }
    168  glFlush();
    169     f.x=0;
    170     f.y=0;
    171     s.push(f);
    172 
    173     while (!s.empty())
    174     {
    175         r=s.top();
    176         s.pop();
    177         setPixel(r.x,r.y);
    178         for (i=0;i<4;i++)
    179         {
    180             f.x=r.x+yi[i][0];
    181             f.y=r.y+yi[i][1];
    182             if (f.x<=-1000||f.x>=1000) continue;
    183             if (f.y<=-1000||f.y>=1000) continue;
    184             if (v[f.x+1001][f.y+1001]) continue;
    185             v[f.x+1001][f.y+1001]=1;
    186             s.push(f);
    187         }
    188     }
    189      glFlush();
    190                                                      
    191  }
    192 
    193 
    194 
    195  int main(int argc, char *argv[])
    196  {
    197      glutInit(&argc, argv);
    198 
    199      printf("请输入多边形顶点坐标,坐标(0,0)必须在多边形内:
    ");
    200      while (~scanf("%d%d",&st[len].x,&st[len++].y));
    201 
    202      init();                                                     //?????
    203      glutDisplayFunc(&myDisplay);                                //????                    
    204      glutMainLoop();                                             //????
    205      return 0; 
    206  }
    View Code

    扫描线填充:

      1 #include <GL/glut.h>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<stack>
      5 #include<algorithm>
      6 #include<iostream>
      7 using namespace std;
      8 
      9 int x,y,endx,endy,p;
     10 int v[3000][3000];
     11 
     12 struct ST
     13 {
     14     int x,y;
     15 };
     16 ST st[100];
     17 ST str[100000];
     18 int len=0,k=0;
     19 ST f,r;
     20 stack<ST>s;
     21 bool com(ST a,ST b)
     22 {
     23     if (a.y==b.y) return a.x<b.x;
     24     return a.y<b.y;
     25 }
     26 
     27 void init()
     28 {
     29     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);                 //????????,????????,??????
     30     glutInitWindowPosition(100, 100);                            //???????
     31     glutInitWindowSize(400, 300);                                //??????
     32     glutCreateWindow("pb-????4");                            //?????
     33 
     34     glClearColor(0.0, 0.0, 0.0, 0.0);
     35     glMatrixMode(GL_PROJECTION);
     36     gluOrtho2D(-1000, 1000, -1000, 1000); 
     37 
     38     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); 
     39     glClear(GL_COLOR_BUFFER_BIT);
     40     glColor3f(1.0, 0.0, 0.0); 
     41     
     42     
     43     memset(v,0,sizeof(v));
     44     while (!s.empty()) s.pop();
     45 }
     46 
     47 
     48 void setPixel (GLint x,GLint y,GLint nx,GLint ny)               //????,???x,y?nx,ny???????
     49 {
     50     glBegin(GL_LINES);
     51        glVertex2i(x, y);
     52        glVertex2i(nx,ny);
     53     glEnd();
     54 }
     55 
     56 //?????
     57 void swap(int &x,int &y)
     58 {
     59     x^=y;
     60     y^=x;
     61     x^=y;
     62 }
     63 
     64 
     65 //?k???,p=1?? 0<k<1; p=2?? k>1; p=3 ?? -1<k<0; p=4?? k<-1;
     66 //?????????0<k<1?
     67 void Spoint()
     68 {
     69    if ((endx-x)*(endy-y)>0)
     70     {
     71         if (abs(endx-x)-abs(endy-y)>=0) p=1;
     72         else 
     73         {
     74             p=2;
     75             swap(x,y);
     76             swap(endx,endy);
     77         }
     78     }
     79     else
     80     {
     81            if (abs(endx-x)-abs(endy-y)>=0) 
     82            {
     83                p=3;
     84                y=-y;
     85                endy=-endy;
     86            }
     87            else 
     88            {
     89                p=4;
     90                x=-x;
     91                endx=-endx;
     92                swap(x,y);
     93                swap(endx,endy);
     94            }
     95     }
     96 }
     97 
     98 
     99 
    100 
    101 void setpoint(int x0,int y0)
    102 {
    103     if (p==1)  
    104     {
    105         str[k].x=x0;
    106         str[k++].y=y0;
    107     }
    108     if (p==2)  
    109     {
    110         str[k].x=y0;
    111         str[k++].y=x0;
    112     }
    113     if (p==3)  
    114     {
    115           str[k].x=x0;
    116           str[k++].y=-y0;
    117     }
    118     if (p==4)  
    119     {
    120 
    121           str[k].x=-y0;
    122           str[k++].y=x0;
    123     }
    124 }
    125 
    126 //Bresenham???
    127 void myDisplay(void)                                             
    128 { 
    129     x=st[len-2].x;
    130     y=st[len-2].y;
    131     int i;
    132     for (i=0;i<len-1;i++)
    133     {
    134         endx=st[i].x;
    135         endy=st[i].y;
    136         Spoint();
    137         int dx=abs(x-endx),dy=abs(y-endy);
    138         int d=2*dy-dx;
    139         int tdy=2*dy,tdx=2*(dy-dx);
    140         
    141         if (x>endx)
    142         {
    143            swap(x,endx);
    144            swap(y,endy);
    145         }
    146         v[x+1001][y+1001]=1;
    147         str[k].x=x;
    148         str[k++].y=y;
    149         while (x<endx)
    150         {
    151             x++;
    152             if (d<0)
    153             {
    154                 d+=tdy;
    155             }
    156             else
    157             {
    158               y++;
    159              d+=tdx;
    160             }
    161           setpoint(x,y);
    162          
    163         }
    164         x=st[i].x;
    165         y=st[i].y;
    166     }
    167 
    168     sort(str,str+k,com);
    169 
    170     for (i=0;i<k-1;i++)
    171     {
    172         if (str[i].y==str[i+1].y&&str[i].x!=str[i+1].x-1)
    173         {
    174              setPixel(str[i].x,str[i].y,str[i+1].x,str[i+1].y);
    175              i++;
    176         }
    177     }
    178     
    179      glFlush();
    180                                                      
    181  }
    182 
    183 
    184 
    185  int main(int argc, char *argv[])
    186  {
    187      glutInit(&argc, argv);
    188      while (~scanf("%d%d",&st[len].x,&st[len++].y));
    189 
    190      init();                                                    
    191      glutDisplayFunc(&myDisplay);                                                
    192      glutMainLoop();                                            
    193      return 0; 
    194  }
    View Code
  • 相关阅读:
    SE -- IO
    SE -- 多线程
    SE -- 继承
    SE -- 面对对象
    SE -- 数组
    Modern Operating System --- Chap 5.5 Clocks
    Operating System: Three Easy Pieces --- Paging: TLB (Note)
    Operating System: Three Easy Pieces --- Process (Note)
    Some Interesting Websites and Blogs
    Implement a System Call in Kernel 3.10.56 (X86_64)
  • 原文地址:https://www.cnblogs.com/pblr/p/5491309.html
Copyright © 2020-2023  润新知