opengl自动重绘

兔子先生-zhang 2008-11-08 03:23:13
我已经绘制出来一个圆等基本图形,但是每次绘制完之后都会自动消失(在窗口上看不到了)。不知道怎么回事,下面是我的主函数中的代码:
int main(int argc,char** argv)
{
//turl.pen=DOWN;
step=0.001;
theta=90.0;
/*Star_Poin.x=0.0;
Star_Poin.y=0.0;
Term_Poin.x=0.0;
Term_Poin.y=0.0;*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,90);
glutCreateWindow(“**;上机号:23;设计题目:海龟作图");
glutReshapeFunc(MyReshape);
glutDisplayFunc(display);
//glutKeyboardFunc(myKeyboard);
glutCreateMenu(MyMenu);
glutAddMenuEntry("开始",0);
glutAddMenuEntry("直线",1);
glutAddMenuEntry("矩形",2);
glutAddMenuEntry("圆",3);
glutAddMenuEntry("非画图状态",4);
glutAddMenuEntry("清屏",5);
glutAddMenuEntry("退出",6);
glutAttachMenu(GLUT_RIGHT_BUTTON);
init();
glutMainLoop();
return (0);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(..)
glVertex2f(
......
glEnd();
glFlush()//glFlush()刷新重绘
}
其他的reshape函数也有
void MyReshape(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
w=width;
h=height;
}
运行后,每次画完图形后窗口上就什么也没有了
...全文
650 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子先生-zhang 2008-11-21
  • 打赏
  • 举报
回复
不好意思啊,这两天很忙,所以没有上来看

chiyer帮我修改的程序我运行了一下但是还是会自动重绘,我的鼠标只要动一下程序就会自动重绘图形,我想要的结果是画一个图形之后我懂鼠标的时候它不会再自动重绘,大家知道有什么解决方案吗?

恩~~~~,我会经常上来看大家的回帖的,对于前面没有及时回帖表示歉意,谢谢大家了。
星羽 2008-11-13
  • 打赏
  • 举报
回复
楼主,你的结贴率很低,注意一下,及时结贴
星羽 2008-11-13
  • 打赏
  • 举报
回复

int main(int argc,char** argv)
{
int a=1,b=2;
//turl.pen=DOWN;
step=0.001;
theta=0.0;
/*Star_Poin.x=0.0;
Star_Poin.y=0.0;
Term_Poin.x=0.0;
Term_Poin.y=0.0;*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,90);
glutCreateWindow("张继伟;上机号:23;设计题目:海龟作图");
glutReshapeFunc(MyReshape);

//glutKeyboardFunc(myKeyboard);
glutCreateMenu(MyMenu);
a=glutCreateMenu(MyMenu);
glutAddMenuEntry("直线",1);
glutAddMenuEntry("矩形",2);
glutAddMenuEntry("圆",3);
b=glutCreateMenu(MyMenu);
glutAddMenuEntry("红色",4);
glutAddMenuEntry("黑色",5);
glutAddMenuEntry("蓝色",6);
glutAddMenuEntry("黄色",7);
glutCreateMenu(MyMenu);
glutAddMenuEntry("开始",0);
glutAddSubMenu("图形",a);
glutAddSubMenu("颜色",b);
glutAddMenuEntry("结束",8);
glutAddMenuEntry("清屏",9);
glutAddMenuEntry("退出",10);
glutAttachMenu(GLUT_RIGHT_BUTTON);
init();
glutDisplayFunc(display);
glutMainLoop();
return (0);
}
星羽 2008-11-13
  • 打赏
  • 举报
回复

#include <math.h>
#include <iostream>
#include <GL\glut.h>
#include <stdlib.h>
using namespace std;
#define UP 0
#define DOWN 1
#define PI 3.1415
typedef int penState;
static float a[3];
int w,h;//窗口的宽和高,定义成全局变量是为了容易传递

int g_Menu = 0;
typedef struct
{
float x;
float y;
}aPoint;//(x,y)为坐标
typedef struct
{
penState pen;
aPoint Pos;//海龟的当前位置
}Turl;
Turl turl;
float theta;//海龟朝向
static aPoint Star_Poin,Term_Poin;
float step;
void start() //glClear(GL_COLOR_BUFFER_BIT);
{
glClear(GL_COLOR_BUFFER_BIT);
}
void flush() // glFlush();
{
glFlush();
}
/***************************************************************
海龟的实现部分{glBegin()~glEnd()}
****************************************************************/
void DisplayTur()//海龟
{
theta=(Term_Poin.y-Star_Poin.y)/(Term_Poin.x-Star_Poin.x);
glBegin(GL_POLYGON);
//glColor3f(a[0]-0.1,a[1]-0.1,a[2]);
glVertex2f(Term_Poin.x+0.1*cos(theta+PI/2),Term_Poin.y+0.1*sin(theta+PI/2));
//glColor3f(a[0],a[1],a[2]);
glVertex2f(Term_Poin.x+0.05*cos(theta+7*PI/6),Term_Poin.y+0.05*sin(theta+7*PI/6));
glVertex2f(Term_Poin.x+0.05*cos(theta+11*PI/6),Term_Poin.y+0.05*sin(theta+11*PI/6));
glEnd();//theta为海龟的朝向
glFlush();
// glClear(
}
/*********************************************************************
绘制圆的函数:{glBegin()~glEnd()}
******************************************************/
void DisplayCir()
{
//DisplayTur();
//rad 为圆的直径
float rad=sqrt((Term_Poin.x-Star_Poin.x)*(Term_Poin.x-Star_Poin.x)+(Term_Poin.y-Star_Poin.y)*(Term_Poin.y-Star_Poin.y));
for(theta=0;theta <=2*PI;theta+=step)//only when step smaller than 0.0005,obvios the effort will be.
{
/*Term_Poin.x=Star_Poin.x+rad*cos(theta);
Term_Poin.y=Star_Poin.y+rad*sin(theta);
DisplayTur();*/
//start();
glBegin(GL_POINTS);
glVertex2f(Star_Poin.x+rad*cos(theta),Star_Poin.y+rad*sin(theta));
//glVertex2f(Star_Poin.x+rad*cos(theta+0.0001),Star_Poin.y+rad*sin(theta+0.0001));
glEnd();

}

}
/***********************************************************
绘制矩形的函数:{glBegin()~glEnd()}
*************************************************************/
void DisplayRec()
{
if(Star_Poin.x <=Term_Poin.x)
{
float i;

for(i=Star_Poin.x;i <=Term_Poin.x;i+=step)//for1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for(i=Star_Poin.y;i <=Term_Poin.y;i+=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for(i=Term_Poin.x;i>=Star_Poin.x;i-=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i>=Star_Poin.y;i-=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
else
{
float i;

for(i=Star_Poin.x;i>=Term_Poin.x;i-=step)//for 1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for( i=Star_Poin.y;i>=Term_Poin.y;i-=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for( i=Term_Poin.x;i <=Star_Poin.x;i+=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i <=Star_Poin.y;i+=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
}
/***********************************************
直线绘制函数{glBegin()~glEnd()}
***********************************************/
void DisplayLin()
{
start();
// DisplayTur();
//for(float i=0.0;i <=100;i+=0.05){
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,Term_Poin.y);
glEnd();

//}
glFlush();
}
void MyMouse(int button,int state,int x,int y)//把两个坐标按照先后给开始和结束的点
{
static bool first=true;//用来实现获取两个鼠标坐标标志
//glutReshapeFunc(MyReshape);
if(state==GLUT_DOWN&&button==GLUT_LEFT_BUTTON)
{
if(first)
{
Star_Poin.x=-(float)2*(w/2-x)/w;
Star_Poin.y=-(float)2*(y-h/2)/h;
first=!first;
cout <<"b:(" <<Star_Poin.x <<"," <<Star_Poin.y <<")" <<endl;
}
else
{
Term_Poin.x=-(float)2*(w/2-x)/w;
Term_Poin.y=-(float)2*(y-h/2)/h;
cout <<"a:(" <<Term_Poin.x <<"," <<Term_Poin.y <<")" <<endl;
first=!first;
}
}

glutPostRedisplay();
// first=true;
}
void MyReshape(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
w=width;
h=height;
}
/************************************************************
菜单创建函数,主程序及大部分代码应该在这个函数中实现
************************************************************/
void MyMenu(int value)
{
g_Menu = value;

if(value==0)
{
glutMouseFunc(MyMouse);
}
if(value==4)//红色
{
a[0]=1.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==5)//黑色
{
a[0]=0.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==6)//蓝色
{
a[0]=0.5;
a[1]=0.5;
a[2]=0.5;
glColor3f(a[0],a[1],a[2]);
}
if(value==7)//黄色
{
a[0]=1.0;
a[1]=1.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
}
if(value==10)
{
exit(0);
}
}
void init()
{
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(a[0],a[1],a[2]);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
void display()
{
start();
DisplayTur();


if(g_Menu==1)
DisplayLin();
if(g_Menu==2)
DisplayRec();
if(g_Menu==3)
DisplayCir();

flush();
}

星羽 2008-11-13
  • 打赏
  • 举报
回复
所有绘制命令都要放到display里

稍微帮你改了下

icosagon 2008-11-11
  • 打赏
  • 举报
回复
想要重绘后显示,就必须在display函数中画
兔子先生-zhang 2008-11-08
  • 打赏
  • 举报
回复
我通过菜单画的圆形和直线不能停留,刚画完就没有了。
兔子先生-zhang 2008-11-08
  • 打赏
  • 举报
回复
#include <math.h>
#include<iostream.h>
#include<GL\glut.h>
#include<stdlib.h>
#define UP 0
#define DOWN 1
#define PI 3.1415
typedef int penState;
static float a[3];
int w,h;//窗口的宽和高,定义成全局变量是为了容易传递
typedef struct
{
float x;
float y;
}aPoint;//(x,y)为坐标
typedef struct
{
penState pen;
aPoint Pos;//海龟的当前位置
}Turl;
Turl turl;
float theta;//海龟朝向
static aPoint Star_Poin,Term_Poin;
float step;
void start() //glClear(GL_COLOR_BUFFER_BIT);
{
glClear(GL_COLOR_BUFFER_BIT);
}
void flush() // glFlush();
{
glFlush();
}
/***************************************************************
海龟的实现部分{glBegin()~glEnd()}
****************************************************************/
void DisplayTur()//海龟
{
theta=(Term_Poin.y-Star_Poin.y)/(Term_Poin.x-Star_Poin.x);
glBegin(GL_POLYGON);
//glColor3f(a[0]-0.1,a[1]-0.1,a[2]);
glVertex2f(Term_Poin.x+0.1*cos(theta+PI/2),Term_Poin.y+0.1*sin(theta+PI/2));
//glColor3f(a[0],a[1],a[2]);
glVertex2f(Term_Poin.x+0.05*cos(theta+7*PI/6),Term_Poin.y+0.05*sin(theta+7*PI/6));
glVertex2f(Term_Poin.x+0.05*cos(theta+11*PI/6),Term_Poin.y+0.05*sin(theta+11*PI/6));
glEnd();//theta为海龟的朝向
glFlush();
// glClear(
}
/*********************************************************************
绘制圆的函数:{glBegin()~glEnd()}
******************************************************/
void DisplayCir()
{
//DisplayTur();
//rad 为圆的直径
float rad=sqrt((Term_Poin.x-Star_Poin.x)*(Term_Poin.x-Star_Poin.x)+(Term_Poin.y-Star_Poin.y)*(Term_Poin.y-Star_Poin.y));
for(theta=0;theta<=2*PI;theta+=step)//only when step smaller than 0.0005,obvios the effort will be.
{
/*Term_Poin.x=Star_Poin.x+rad*cos(theta);
Term_Poin.y=Star_Poin.y+rad*sin(theta);
DisplayTur();*/
//start();
glBegin(GL_POINTS);
glVertex2f(Star_Poin.x+rad*cos(theta),Star_Poin.y+rad*sin(theta));
//glVertex2f(Star_Poin.x+rad*cos(theta+0.0001),Star_Poin.y+rad*sin(theta+0.0001));
glEnd();

}

}
/***********************************************************
绘制矩形的函数:{glBegin()~glEnd()}
*************************************************************/
void DisplayRec()
{
if(Star_Poin.x<=Term_Poin.x)
{
for(float i=Star_Poin.x;i<=Term_Poin.x;i+=step)//for1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for(i=Star_Poin.y;i<=Term_Poin.y;i+=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for(i=Term_Poin.x;i>=Star_Poin.x;i-=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i>=Star_Poin.y;i-=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
else
{
for(float i=Star_Poin.x;i>=Term_Poin.x;i-=step)//for 1
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(i,Star_Poin.y);
glEnd();
}
for( i=Star_Poin.y;i>=Term_Poin.y;i-=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,i);
glEnd();
}
for( i=Term_Poin.x;i<=Star_Poin.x;i+=step)//for 3
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
for( i=Term_Poin.y;i<=Star_Poin.y;i+=step)//for 4
{
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Term_Poin.y);
glVertex2f(Star_Poin.x,i);
glEnd();
}
}
}
/***********************************************
直线绘制函数{glBegin()~glEnd()}
***********************************************/
void DisplayLin()
{
start();
// DisplayTur();
//for(float i=0.0;i<=100;i+=0.05){
glBegin(GL_LINES);
glVertex2f(Star_Poin.x,Star_Poin.y);
glVertex2f(Term_Poin.x,Term_Poin.y);
glEnd();

//}
glFlush();
}
void MyMouse(int button,int state,int x,int y)//把两个坐标按照先后给开始和结束的点
{
static bool first=true;//用来实现获取两个鼠标坐标标志
//glutReshapeFunc(MyReshape);
if(state==GLUT_DOWN&&button==GLUT_LEFT_BUTTON)
{
if(first)
{
Star_Poin.x=-(float)2*(w/2-x)/w;
Star_Poin.y=-(float)2*(y-h/2)/h;
first=!first;
cout<<"b:("<<Star_Poin.x<<","<<Star_Poin.y<<")"<<endl;
}
else
{
Term_Poin.x=-(float)2*(w/2-x)/w;
Term_Poin.y=-(float)2*(y-h/2)/h;
cout<<"a:("<<Term_Poin.x<<","<<Term_Poin.y<<")"<<endl;
first=!first;
}
}
// first=true;
}
void MyReshape(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
w=width;
h=height;
}
/************************************************************
菜单创建函数,主程序及大部分代码应该在这个函数中实现
************************************************************/
void MyMenu(int value)
{
if(value==0)
{
glutMouseFunc(MyMouse);
}
if(value==1)
{
start();
DisplayLin();
glFlush();//glutSwapBuffers();
}
if(value==2)
{
start();
DisplayRec();
flush();
}
if(value==3)
{
start();
DisplayCir();
flush();
}
if(value==4)//红色
{
a[0]=1.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==5)//黑色
{
a[0]=0.0;
a[1]=0.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
//init();
}
if(value==6)//蓝色
{
a[0]=0.5;
a[1]=0.5;
a[2]=0.5;
glColor3f(a[0],a[1],a[2]);
}
if(value==7)//黄色
{
a[0]=1.0;
a[1]=1.0;
a[2]=0.0;
glColor3f(a[0],a[1],a[2]);
}
if(value==10)
{
exit(0);
}
}
void init()
{
glClearColor(1.0,1.0,1.0,1.0);
glColor3f(a[0],a[1],a[2]);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0,1.0,-1.0,1.0);
}
void display()
{
start();
DisplayTur();
flush();
}
int main(int argc,char** argv)
{
int a=1,b=2;
//turl.pen=DOWN;
step=0.001;
theta=0.0;
/*Star_Poin.x=0.0;
Star_Poin.y=0.0;
Term_Poin.x=0.0;
Term_Poin.y=0.0;*/
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,90);
glutCreateWindow("张继伟;上机号:23;设计题目:海龟作图");
glutReshapeFunc(MyReshape);

//glutKeyboardFunc(myKeyboard);
glutCreateMenu(MyMenu);
a=glutCreateMenu(MyMenu);
glutAddMenuEntry("直线",1);
glutAddMenuEntry("矩形",2);
glutAddMenuEntry("圆",3);
b=glutCreateMenu(MyMenu);
glutAddMenuEntry("红色",4);
glutAddMenuEntry("黑色",5);
glutAddMenuEntry("蓝色",6);
glutAddMenuEntry("黄色",7);
glutCreateMenu(MyMenu);
glutAddMenuEntry("开始",0);
glutAddSubMenu("图形",a);
glutAddSubMenu("颜色",b);
glutAddMenuEntry("结束",8);
glutAddMenuEntry("清屏",9);
glutAddMenuEntry("退出",10);
glutAttachMenu(GLUT_RIGHT_BUTTON);
init();
glutDisplayFunc(display);
glutMainLoop();
return (0);
}
刚才粘贴错了,这才是全部代码,嘿嘿
兔子先生-zhang 2008-11-08
  • 打赏
  • 举报
回复
for( i=Term_Poin.x;i<=Star_Poin.x;i+=step)//for 2
{
glBegin(GL_LINES);
glVertex2f(Term_Poin.x,Term_Poin.y);
glVertex2f(i,Term_Poin.y);
glEnd();
}
上面是我的代码,之前觉得太多没有全部发上来,我试了试二楼说的方法,但还是不能停留,
麻烦大家了。
冰矿 2008-11-08
  • 打赏
  • 举报
回复
最好贴全代码,否则没法具体调试啊
从你的main函数看,应该把init()函数放在glutCreateWindow()之后glutDisplayFunc()之前执行;
另外菜单生成语句最好独立出来单独写个函数,然后main中调用,这样程序结构就很清晰了
xhs_lh04 2008-11-08
  • 打赏
  • 举报
回复
openGL没用过,不好意思
帮你顶吧

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧