2010-10-14 14 views
0

我正在寫一個MS繪畫類應用程序(我不允許使用opengl基元)。到目前爲止,它只繪製線條和點。我不明白爲什麼上點擊渲染一個點時,該代碼打印它,它應該基於對renderPoint功能轉型:爲什麼不這個bresenham系列出現在它應該在的位置?

void renderPoint(double x, double y) 
    { 
     W = glutGet(GLUT_WINDOW_WIDTH); 
     H = glutGet(GLUT_WINDOW_HEIGHT); 

     float X; 
     float Y; 
     glBegin (GL_POINTS); 
      X = (2*x/W) - 1; 
      Y = (-2*y/H) + 1; 
      glVertex2f (X, Y); 
     glEnd(); 
     glFlush(); 

    } 

它不正確繪製布氏函數中調用時(我相信這是正確的,因爲我從the article in wikipedia一行一行地執行它)。我在轉變中做錯了什麼?

#include "GL/glut.h" 

#include <stdio.h> 
#include <math.h> 
int i; 

int mainWindow, subWindow; 
int X1, Y1, X2, Y2; 
int W = 320, H = 320; 
void menuApp (int value) 
{ 
    if (value == 1) printf("Linea\n"); 
    if (value == 2) printf("Circulo\n"); 
    if (value == 3) printf("Elipsis\n"); 
    if (value == 4) exit(0); 

} 

void crearMenu() 
{ 
    //inicio Creando el menu 
    int submenu; 
    submenu = glutCreateMenu(menuApp); 
    glutAddMenuEntry("Linea", 1); 

    glutAddMenuEntry("Elipse",3); 
    glutAddMenuEntry("Salir",4); 
    glutCreateMenu(menuApp); 
    glutAddSubMenu("SubMenu", submenu); 
    glutAttachMenu(GLUT_RIGHT_BUTTON); 

    //fin Creando el menu 
} 

void renderPoint(void) /*REVISAR ESTO*/ 
{ 
    glClear (GL_COLOR_BUFFER_BIT); 
    glBegin (GL_POINTS); 
     glVertex2f (-0.98, 0.98); 
    glEnd(); 
    glFlush(); 
} 





void renderPoint(double x, double y) 
{ 
    W = glutGet(GLUT_WINDOW_WIDTH); 
    H = glutGet(GLUT_WINDOW_HEIGHT); 

    float X; 
    float Y; 
    glBegin (GL_POINTS); 
     X = (2*x/W) - 1; 
     Y = (-2*y/H) + 1; 
     glVertex2f (X, Y); 
    glEnd(); 
    glFlush(); 

} 

/*wiki pseudo: 

function line(x0, x1, y0, y1) //x1 
    boolean steep := abs(y1 - y0) > abs(x1 - x0)//x2 
    if steep then//x3 
     swap(x0, y0) //x4 
     swap(x1, y1) //x5 
    if x0 > x1 then //x6 
     swap(x0, x1) //x7 
     swap(y0, y1) //x8 
    int deltax := x1 - x0 //x9 
    int deltay := abs(y1 - y0) //x10 
    int error := deltax/2 //x11 
    int ystep //x12 
    int y := y0 //x13 
    if y0 < y1 then ystep := 1 else ystep := -1 //x14 
    for x from x0 to x1 //x15 
     if steep then plot(y,x) else plot(x,y) //x16 
     error := error - deltay //x17 
     if error < 0 then //x18 
      y := y + ystep //x19 
      error := error + deltax //x20 
*/ 


void bresenham1(GLint x0, GLint y0, GLint x1, GLint y1) //function line(x0, x1, y0, y1) 
{ 


    //double result1 = fabs((double)y1 - y0); //abs(y1 - y0) 
    //double result2 = fabs((double)x1 - x0); //abs(x1 - x0) 


    int result1 = abs(y1-y0); 
    int result2 = abs(x1-x0); 

bool steep = (result1 > result2); //boolean steep := abs(y1 - y0) > abs(x1 - x0) 

if (steep){ //if steep then 

     GLint aux1 = x0; //swap(x0, y0) 
     x0=y0; 
     y0 = aux1; 

     GLint aux2 = x1; // swap (x1,y1) 
     x1=y1; 
     y1=aux2; 

} 

if(x0>x1){ // if (x0>x1) 
     GLint aux3=x0; //swap(x0,x1) 
     x0=x1; 
     x1=aux3; 

     GLint aux4=y0;//swap(y0,y1) 
     y0=y1; 
     y1=aux4; 

} 

int deltax = x1-x0; // deltax = x1-x0 
int deltay = abs(y1-y0); // int deltay := abs(y1 - y0) - revisar 
int error = (deltax/2); //int error := deltax/2 
int ystep; // int ystep 

int y = y0; //int y := y0 

    if (y0<y1){ //if y0 < y1 then ystep := 1 else ystep := -1 

     ystep=1; 

    } 

    else {ystep=-1;} 

for (int x=x0; x<=x1; x++){ //for x from x0 to x1 
    if (steep){ // if steep then plot(y,x) else plot(x,y) 

     renderPoint(y,x); 
    } 
    else { 

    renderPoint(x,y); 
    } 

error = error - deltay; //error := error - deltay 

if (error<0) { //if error < 0 then 
    y = y + ystep; // y := y + ystep 
    error = error + deltax; //error := error + deltax 

} // end if (error<0) 


}// end for from x0 to x1 


}// end bresenham 










void renderAll (void) 
{ 
    glutSetWindow(mainWindow); 
    glutPostRedisplay(); 
    glutSetWindow(subWindow); 
    glutPostRedisplay(); 
} 

void movimiento(int boton, int estado, int x, int y) 
{ 
    if((estado == GLUT_DOWN) && (boton == GLUT_LEFT_BUTTON))//mouse down 
    { 
     X1 = x; Y1 = y; 
     //printf("Down| x:%d, y:%d\n",x,y); 

     renderPoint(x,y); 
    } 
    if((estado == GLUT_UP) && (boton == GLUT_LEFT_BUTTON))//mouse up 
    { 
     //printf(" Up|x:%d, y:%d\n",x,y); 
     X2 = x; Y2 = y; 
     //renderLine(); 
     bresenham1(X1,X2,Y1,Y2); 
     //renderPoint(x, y); 
    } 
} 

void MouseMove(int x, int y) 
{ 
    //printf("x:%d | y:%d\n", x,y); 
    X2 = x; Y2 = y; 
    //renderLine(); 
    //bresenham1(X1, Y1, X2, Y2); 
} 

void teclado(unsigned char key, int x, int y) 
{ 
    if(key == 27)exit(0); 
} 

void especiales(int key, int x, int y) 
{ 
    if(key == GLUT_KEY_F1) exit(0); 
} 

static void 
key(unsigned char k, int x, int y) 
{ 
    switch (k) { 
    case 27: /* Escape */ 
    exit(0); 
    break; 
    default: 
    return; 
    } 
    glutPostRedisplay(); 
} 

int main (int argc, char *argv []) 
{ 
    i = 0; 
    //inicializa las operaciones de OpenGL/GLUT, db cr antes de usar funciones GLUT 
    glutInit (&argc, argv); 

    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA); 
    glutInitWindowPosition (100, 100); 
    glutInitWindowSize (W, H); 
    //Crea una ventana de Opengl 
    glutCreateWindow ("tarea"); 
    glutDisplayFunc (renderPoint); 
    glutMouseFunc(movimiento); 
    glutKeyboardFunc(teclado);//teclas ASCII 
    glutSpecialFunc(especiales);//captura las teclas [f1..f12] 

    //glutPassiveMotionFunc(pasivo); 
    glutKeyboardFunc(key); 
    glutMotionFunc(MouseMove); 
    crearMenu(); 
    glutMainLoop(); 


} 
+0

我想你已經嘗試把'的printf(「%F \ t%F \ t#renderPoint \ n「,x,y);'在'renderPoint'的頂部查看它被調用的內容。 – nategoose 2010-10-14 21:36:37

+0

我沒有,我得到這個:http://img838.imageshack.us/img838/7087/screenshottransform.png – andandandand 2010-10-14 22:00:19

回答

0

問題是bresenham1被稱爲錯:

bresenham1(X1,X2,Y1,Y2); 

應該是:

bresenham1(X1,Y1,X2,Y2); 
相關問題