2017-02-21 125 views
0

我試圖調用一個函數,只有當「空格鍵」被按下時。其關鍵代碼是32.glutKeyboardFunc調用函數不起作用

#include <GL/glut.h> 
#include <GL/glu.h> 
#include <GL/gl.h> 
#include <cmath> 
#include <iostream> 
#include <string.h> 

using namespace std; 

GLuint window, View1; 
void Display_Mid_Ellipse() 
{ 

    double xc=0.0, yc=0.0, rx=140.0, ry=200.0; 
    double rxSq = rx * rx; 
    double rySq = ry * ry; 
    double x = 0, y = ry, p; 
    double px = 0, py = 2 * rxSq * y; 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1 ,0, 0); 
    glBegin(GL_POINTS); 


    glVertex2d(xc+x,yc-y); 
    glVertex2d(xc-x,yc-y); 
    glVertex2d(xc-x,yc+y); 
    glEnd(); 

    p = rySq - (rxSq * ry) + (0.25 * rxSq); 
    while (px < py) 
    { 
        x++; 
        px = px + 2 * rySq; 
        if (p < 0) 
        p = p + rySq + px; 
        else 
        { 
        y--; 
        py = py - 2 * rxSq; 
        p = p + rySq + px - py; 
        } 
        glBegin(GL_POINTS); 

        glVertex2d(xc+x,yc+y); 
        glVertex2d(xc+x,yc-y); 
        glVertex2d(xc-x,yc-y); 
        glVertex2d(xc-x,yc+y); 
        glEnd(); 

    } 

    p = rySq*(x+0.5)*(x+0.5) + rxSq*(y-1)*(y-1) - rxSq*rySq; 
    while (y > 0) 
    { 
      y--; 
      py = py - 2 * rxSq; 
      if (p > 0) 
      p = p + rxSq - py; 
      else 
      { 
      x++; 
      px = px + 2 * rySq; 
      p = p + rxSq - py + px; 
      } 
      glBegin(GL_POINTS); 

    glVertex2d(xc+x,yc+y); 
    glVertex2d(xc+x,yc-y); 
    glVertex2d(xc-x,yc-y); 
    glVertex2d(xc-x,yc+y); 
    glEnd(); 
    glFlush(); 

    } 
} //end_MIDPOINT_ELLIPSE 

void init() { 
    glClear(GL_COLOR_BUFFER_BIT); 
glClearColor(0.3,0.3,0.3,0.7); 
    gluOrtho2D(-500.0,500.0,-500.0,500.0); 
} 
void View1Display() 
{ 
glutSetWindow(View1); 
gluOrtho2D(-500.0,500.0,-500.0,500.0); 
Display_Mid_Ellipse(); 


    } 
    void Display() 
{ 
    glutSetWindow(window); 
    glClear(GL_COLOR_BUFFER_BIT); 
    //View1Display(); 
} 

void keyFunc(unsigned char ch, int x, int y){ 

if(ch==32){ 
View1Display(); 
} 
} 

int main (int argc, char *argv[]) {  

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 

glutInitWindowSize(750, 750); 
glutInitWindowPosition(0, 0); 

window=glutCreateWindow("Circle and ellipse"); 
init(); 

View1 = glutCreateSubWindow(window,20,40, 340,340); 
glutDisplayFunc(Display); 
glutKeyboardFunc(keyFunc); 
glutMainLoop(); 

    return 0; 
} 

當我從Display()函數調用相同的View1Display時,它工作正常。 我很困惑。我嘗試了可能的替代方案,但無法找到解決方案。請幫忙。 感謝

回答

0
  • 回調註冊爲活動窗口(創建一個窗口隱含激活它),所以你可以爲頂層窗口和你的子窗口註冊單獨的顯示回調。
  • 不要從鍵盤迴調中調用子窗口顯示功能。切換共享變量&使用glutPostWindowRedisplay()來強制重繪。
  • 如果您打算使用GLUT_SINGLE,請確保glFlush()強制更新幀緩衝區。

一起:

#include <GL/glut.h> 
#include <cmath> 

using namespace std; 

void Display_Mid_Ellipse() 
{ 
    double xc = 0.0, yc = 0.0, rx = 140.0, ry = 200.0; 
    double rxSq = rx * rx; 
    double rySq = ry * ry; 
    double x = 0, y = ry, p; 
    double px = 0, py = 2 * rxSq * y; 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1, 0, 0); 
    glBegin(GL_POINTS); 


    glVertex2d(xc + x, yc - y); 
    glVertex2d(xc - x, yc - y); 
    glVertex2d(xc - x, yc + y); 
    glEnd(); 

    p = rySq - (rxSq * ry) + (0.25 * rxSq); 
    while(px < py) 
    { 
     x++; 
     px = px + 2 * rySq; 
     if(p < 0) 
      p = p + rySq + px; 
     else 
     { 
      y--; 
      py = py - 2 * rxSq; 
      p = p + rySq + px - py; 
     } 
     glBegin(GL_POINTS); 

     glVertex2d(xc + x, yc + y); 
     glVertex2d(xc + x, yc - y); 
     glVertex2d(xc - x, yc - y); 
     glVertex2d(xc - x, yc + y); 
     glEnd(); 

    } 

    p = rySq*(x + 0.5)*(x + 0.5) + rxSq*(y - 1)*(y - 1) - rxSq*rySq; 
    while(y > 0) 
    { 
     y--; 
     py = py - 2 * rxSq; 
     if(p > 0) 
      p = p + rxSq - py; 
     else 
     { 
      x++; 
      px = px + 2 * rySq; 
      p = p + rxSq - py + px; 
     } 
     glBegin(GL_POINTS); 

     glVertex2d(xc + x, yc + y); 
     glVertex2d(xc + x, yc - y); 
     glVertex2d(xc - x, yc - y); 
     glVertex2d(xc - x, yc + y); 
     glEnd(); 
     glFlush(); 

    } 
} //end_MIDPOINT_ELLIPSE 

bool displayEllipse = false; 
void View1Display() 
{ 
    glClearColor(0.3, 0.3, 0.3, 0.7); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(-500.0, 500.0, -500.0, 500.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    if(displayEllipse) 
     Display_Mid_Ellipse(); 

    glFlush(); 
} 

void Display() 
{ 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glFlush(); 
} 

GLuint window; 
GLuint View1; 
void keyFunc(unsigned char ch, int x, int y) 
{ 
    if(ch == 32) 
    { 
     displayEllipse = !displayEllipse; 
     glutPostWindowRedisplay(View1); 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 

    glutInitWindowSize(750, 750); 
    glutInitWindowPosition(0, 0); 

    window = glutCreateWindow("Circle and ellipse"); 
    glutDisplayFunc(Display); 
    glutKeyboardFunc(keyFunc); 

    View1 = glutCreateSubWindow(window, 20, 40, 340, 340); 
    glutDisplayFunc(View1Display); 

    glutMainLoop(); 
    return 0; 
}