2012-05-25 11 views
5

में मैं ओपनजीएल/जीएलयूटी में लागू स्कैन-लाइन भरने वाले एल्गोरिदम को सीखने की कोशिश कर रहा हूं। मैं अवधारणा के चारों ओर अपने दिमाग लपेट नहीं सकता। क्या कोई मुझे एक उचित साधारण फैशन में एल्गोरिदम समझा सकता है? algo नीचे है:स्कैन-लाइन भरें ओपनजीएल/जीएलयूटी एल्गोरिदम सी ++

#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

क्या आपने उपरोक्त कोड लिखा था? –

+0

नहीं, यह इंटर्ननेट से है, क्षमा करें अगर यह ऐसी मदद मांगने के लिए जगह नहीं है :( – Hirvesh

+0

आपका प्रश्न अपेक्षाकृत अनैच्छिक है। वास्तव में आप क्या समझते/समझते नहीं हैं? कुछ अच्छे दस्तावेज़ हैं (उदाहरण के लिए : http://www.techfak.uni-bielefeld.de/ags/wbski/lehre/digiSA/WS0607/3DVRCG/Vorlesung/13.RT3DCGVR-vertex-2-fragment.pdf) इस मामले को काफी अच्छी तरह से समझाते हुए। – Constantinius

उत्तर

4

scanfill समारोह पिक्सल 4-पक्षीय बहुभुज चार एक्स-y निर्देशांक द्वारा वर्णित द्वारा परिवर्तित भरना है। ऐसा करने के लिए, यह edgedetect फ़ंक्शन का उपयोग करता है, जो बहुभुज के किनारों को चित्रित करता है और प्रत्येक वाई समन्वय के लिए न्यूनतम और अधिकतम x समन्वय को याद करता है। स्कैनफिल फ़ंक्शन प्रत्येक वाई समन्वय के माध्यम से जाता है और याद की गई सीमा में पिक्सेल की एक क्षैतिज रेखा खींचता है।