我试图调用一个函数,只有当按下“空格键”时。它的关键代码是32。
#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 :(得分: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;
}