2012-05-25 11 views
5

Ich versuche, den Scan-Line-Füll-Algorithmus in OpenGL/GLUT implementiert zu lernen. Ich kann mich nicht um das Konzept kümmern. Könnte mir jemand den Algorithmus auf relativ einfache Weise erklären? Das Algo ist unten:Scan-Linie füllen OpenGL/GLUT-Algorithmus in C++

#include<GL/glut.h> 

float x1,x2,x3,x4,y1,y2,y3,y4; 

void draw_pixel(int x,int y) 
{ 
    glColor3f(0.0,1.0,1.0); 
    glPointSize(1.0); 
    glBegin(GL_POINTS); 
    glVertex2i(x,y); 
    glEnd(); 
} 

void edgedetect(float x1,float y1,float x2,float y2,int *le,int *re) 
{ 
    float temp,x,mx; 
    int i; 

    if(y1>y2) 
    { 
     temp=x1,x1=x2,x2=temp; 
     temp=y1,y1=y2,y2=temp; 
    } 

    if(y1==y2) 
     mx=x2-x1; 
    else 
     mx=(x2-x1)/(y2-y1); 

    x=x1; 

    for(i=int(y1);i<=(int)y2;i++) 
    { 
     if(x<(float)le[i]) le[i]=(int)x; 
     if(x>(float)re[i]) re[i]=(int)x; 
     x+=mx; 
    } 
} 

void scanfill(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4) 
{ 
    int le[500],re[500],i,j; 

    for(i=0;i<500;i++) 
     le[i]=500,re[i]=0; 

    edgedetect(x1,y1,x2,y2,le,re); 
    edgedetect(x2,y2,x3,y3,le,re); 
    edgedetect(x3,y3,x4,y4,le,re); 
    edgedetect(x4,y4,x1,y1,le,re); 

    for(j=0;j<500;j++) 
    { 
     if(le[j]<=re[j]) 
      for(i=le[j];i<re[j];i++) 
       draw_pixel(i,j); 
    } 
} 


void display() 
{ 
    x1=250.0;y1=200.0;x2=150.0;y2=300.0;x3=250.0; 
    y3=400.0;x4=350.0;y4=300.0; 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0,0.0,1.0); 
    glBegin(GL_LINE_LOOP); 
    glVertex2f(x1,y1); 
    glVertex2f(x2,y2); 
    glVertex2f(x3,y3); 
    glVertex2f(x4,y4); 
    glEnd(); 

    scanfill(x1,y1,x2,y2,x3,y3,x4,y4); 

    glFlush(); 
} 


void init() 
{ 
    glClearColor(1.0,1.0,1.0,1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0,499.0,0.0,499.0); 
} 

void main(int argc,char **argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
    glutInitWindowSize(500,500); 

    glutCreateWindow("scanline"); 
    glutDisplayFunc(display); 

    init(); 
    glutMainLoop(); 
} 
+1

hast du den obigen Code geschrieben? –

+0

nein, es ist aus dem Internet, tut mir leid, wenn dies nicht der richtige Ort für solche Hilfe ist :( – Hirvesh

+0

Ihre Frage ist eher unspezifisch. Was eigentlich verstehst du nicht/können Sie nicht implementieren? Es gibt einige gute Dokumente (z : http://www.techfak.uni-bielefeld.de/ags/wbski/lehre/digiSA/WS0607/3DVRCG/Vorlesung/13.RT3DCGVR-vertex-2-fragment.pdf) das Thema recht gut zu erklären – Constantinius

Antwort

4

Die SCANFILL Funktion durch das 4-seitiges Polygon von den vier x-y-Koordinaten beschrieben, die die Pixel coverted füllt. Dazu verwendet es die Funktion "Kantenerkennung", die das Zeichnen der Kanten des Polygons simuliert und sich die minimale und maximale x-Koordinate für jede y-Koordinate merkt. Die Scanfill-Funktion durchläuft dann jede y-Koordinate und zeichnet eine horizontale Linie von Pixeln über den gespeicherten Bereich.