2012-04-08 28 views
8

I compiti di grafica del computer sono di implementare algoritmi OpenGL utilizzando solo la possibilità di disegnare punti.Linee di disegno con Algoritmo della linea di Bresenham

Quindi ovviamente ho bisogno di far funzionare drawLine() prima di poter disegnare qualsiasi altra cosa. drawLine() deve essere eseguito utilizzando solo numeri interi. Nessun punto mobile.

Questo è quello che mi è stato insegnato. Fondamentalmente, le linee possono essere suddivise in 4 diverse categorie, ripide positive, superficiali positive, ripide negative e negative poco profonde. Questo è il quadro che dovrei disegnare:

expected result

e questo è il mio programma quadro è il disegno:

actual result

I colori sono fatto per noi. Ci vengono dati dei vertici e dobbiamo utilizzare l'algoritmo della linea di Bresenham per disegnare le linee in base ai punti di inizio e di fine.

Questo è quello che ho finora:

int dx = end.x - start.x; 
int dy = end.y - start.y; 

//initialize varibales 
int d; 
int dL; 
int dU; 

if (dy > 0){ 
     if (dy > dx){ 
       //+steep 
       d = dy - 2*dx; 
       dL = -2*dx; 
       dU = 2*dy - 2*dx; 

       for (int x = start.x, y = start.y; y <= end.y; y++){ 
         Vertex v(x,y); 
         drawPoint(v); 

         if (d >= 1){ 
           d += dL; 
         }else{ 
           x++; 
           d += dU; 
         } 
       }    
     } else { 
       //+shallow 
       d = 2*dy - dx; 
       dL = 2*dy; 
       dU = 2*dy - 2*dx; 

       for (int x = start.x, y = start.y; x <= end.x; x++) { 
         Vertex v(x,y); 
         drawPoint(v); 

         // if choosing L, next y will stay the same, we only need 
         // to update d by dL 
         if (d <= 0) { 
           d += dL; 
         // otherwise choose U, y moves up 1 
         } else { 
           y++; 
           d += dU; 
         } 
       } 
     } 
} else { 
     if (-dy > dx){ 
       cout << "-steep\n"; 
       //-steep 
       d = dy - 2*dx; 
       //south 
       dL = 2*dx; 
       //southeast 
       dU = 2*dy - 2*dx; 

       for (int x = start.x, y = start.y; y >= end.y; --y){ 
         Vertex v(x,y); 
         drawPoint(v); 

         //if choosing L, next x will stay the same, we only need 
         //to update d 
         if (d >= 1){ 
           d -= dL; 
         } else { 
           x++; 
           d -= dU; 
         } 
       } 

     } else { 
       cout << "-shallow\n"; 
       //-shallow 
       d = 2*dy - dx; 
       dL = 2*dy; 
       dU = 2*dy - 2*dx; 

       for (int x = start.x, y = start.y; x <= end.x; x++){ 
         Vertex v(x,y); 
         drawPoint(v); 

         if (d >= 0){ 
           d += dL; 
         } else { 
           --y; 
           d -= dU; 
         } 
       } 
     } 
} 

So che il mio errore sta per essere qualcosa di sciocco, ma onestamente non riesco a capire cosa sto facendo male. Perché alcune linee sono disegnate in modo errato come mostrato sopra?

+0

ciò che non funziona? –

+0

Se si guardano le due immagini nel paragrafo sopra il mio codice, il "2 ° quadrante" e il "4 ° quadrante" non disegnano correttamente. Inserisco quelle tra virgolette perché il punto (0,0) si trova nell'angolo in basso a sinistra dell'immagine. Fondamentalmente, la prima istruzione else contiene il codice che non funziona correttamente, -shallow e -steep. – ToastyMallows

+0

esegui il tuo codice su 2 semplici esempi, uno che funziona e quello che non funziona. Dire (0,0), (5, 5) e (0,5), (5,0), tracciare entrambi e vedere erano divergenti. Questo sarà un esercizio molto migliore di quello di avere qualcuno su SO farlo per te. –

risposta

0

Nel caso qualcuno si chiedesse quale fosse il problema, non so ancora cosa fosse. Quello che ho finito è stato rielaborare il mio codice in modo che il -shallow e -steep usassero lo stesso algoritmo di + shallow e + steep, rispettivamente. Dopo aver regolato le coordinate x, y (annullando la coordinata x o y), quando sono andato a tracciarle, ho annullato la negazione originale in modo che fosse tracciata nel punto giusto.

+0

Non ho familiarità con il linguaggio C, ma forse alcuni dei valori traktional devono essere convertiti in valori assoluti? –

5

È possibile trovare il codice completo in C++ per disegnare una linea utilizzando Bresenham Algoritmo a http://www.etechplanet.com/codesnippets/computer-graphics-draw-a-line-using-bresenham-algorithm.aspx:

/*BRESENHAAM ALGORITHM FOR LINE DRAWING*/ 
#include<iostream.h> 
#include<graphics.h> 
#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
#include<math.h> 
#include<dos.h> 
void bhm_line(int,int,int,int,int); 
void main() 
{ 
int ghdriver=DETECT,ghmode,errorcode,x1,x2,y1,y2; 
initgraph(&ghdriver,&ghmode,"..\\bgi"); 
errorcode = graphresult(); 
if(errorcode !=grOk) 
{ 
    cout<<"Graphics error:%s\n"<<grapherrormsg(errorcode); 
    cout<<"Press any key to halt:"; 
    getch(); 
    exit(1); 
} 
clrscr(); 
cout<<"Enter the coordinates (x1,y1): "; 
cin>>x1>>y1; 
cout<<"Enter the coordinates (x2,y2): "; 
cin>>x2>>y2; 
bhm_line(x1,y1,x2,y2,1); 
getch(); 
} 
void bhm_line(int x1,int y1,int x2,int y2,int c) 
{ 
int x,y,dx,dy,dx1,dy1,px,py,xe,ye,i; 
dx=x2-x1; 
dy=y2-y1; 
dx1=fabs(dx); 
dy1=fabs(dy); 
px=2*dy1-dx1; 
py=2*dx1-dy1; 
if(dy1<=dx1) 
{ 
    if(dx>=0) 
    { 
    x=x1; 
    y=y1; 
    xe=x2; 
    } 
    else 
    { 
    x=x2; 
    y=y2; 
    xe=x1; 
    } 
    putpixel(x,y,c); 
    for(i=0;x<xe;i++) 
    { 
    x=x+1; 
    if(px<0) 
    { 
    px=px+2*dy1; 
    } 
    else 
    { 
    if((dx<0 && dy<0) || (dx>0 && dy>0)) 
    { 
    y=y+1; 
    } 
    else 
    { 
    y=y-1; 
    } 
    px=px+2*(dy1-dx1); 
    } 
    delay(0); 
    putpixel(x,y,c); 
    } 
} 
else 
{ 
    if(dy>=0) 
    { 
    x=x1; 
    y=y1; 
    ye=y2; 
    } 
    else 
    { 
    x=x2; 
    y=y2; 
    ye=y1; 
    } 
    putpixel(x,y,c); 
    for(i=0;y<ye;i++) 
    { 
    y=y+1; 
    if(py<=0) 
    { 
    py=py+2*dx1; 
    } 
    else 
    { 
    if((dx<0 && dy<0) || (dx>0 && dy>0)) 
    { 
    x=x+1; 
    } 
    else 
    { 
    x=x-1; 
    } 
    py=py+2*(dx1-dy1); 
    } 
    delay(0); 
    putpixel(x,y,c); 
    } 
} 
} 
+3

Questa è una risposta di solo collegamento; si prega di modificare la risposta per includere il codice effettivo e non solo il collegamento. – LittleBobbyTables

+0

Che cos'è il "ritardo (0)" in bhm_line()? –

Problemi correlati