2012-05-25 15 views
5

Estoy tratando de aprender el algoritmo de relleno de líneas de escaneo implementado en OpenGL/GLUT. No puedo concentrarme en el concepto. ¿Alguien podría explicarme el algoritmo de una manera razonablemente simple? El algo es a continuación:Relleno de líneas de escaneo Algoritmo OpenGL/GLUT en 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

¿escribiste el código anterior? –

+0

no, es de Internet, lo siento si este no es el lugar para pedir ayuda :( – Hirvesh

+0

Su pregunta es bastante inespecífica. ¿Qué es lo que realmente no comprende/no puede implementar? Hay algunos buenos documentos (por ejemplo, : http://www.techfak.uni-bielefeld.de/ags/wbski/lehre/digiSA/WS0607/3DVRCG/Vorlesung/13.RT3DCGVR-vertex-2-fragment.pdf) Explicando el asunto bastante bien. – Constantinius

Respuesta

4

La función scanfill está llenando los los píxeles convertida por el polígono de 4 lados descrito por las coordenadas X-Y de cuatro. Para hacer esto, usa la función edgedetect, que simula dibujar los bordes del polígono y recuerda la coordenada x mínima y máxima para cada coordenada y. La función scanfill pasa a través de cada coordenada y dibuja una línea horizontal de píxeles en el rango recordado.