关于利用OPENGL实现直线、矩形、折线的橡皮筋技术的有关问题

Jerikc 2011-05-22 03:06:56
以下代码是我利用OPENGL实现的。其中折线的结果,一直在闪烁。希望高手帮忙,不知道如何下手解决这个问题。
#include <gl/glut.h>
#include <iostream>
using namespace std;

#define NUM 100 //折线的最大折线段
int Flag = 0; //标记是否已经开始绘制折线

int iPointNum = 0; //已确定点的数目
int x1 = 0,x2 = 0,y1 = 0,y2 = 0;
int winWidth = 800,winHeight = 600;
int Mousex, Mousey; //用于记录当前鼠标的位置

struct LineNode
{
GLint x1;
GLint y1;
GLint x2;
GLint y2;
}Line[NUM];

int n = 0; //用于记录折线有几段
int choice;

void Initial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
}

void ChangeSize(GLint w,GLint h)
{
winWidth = w,winHeight = h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,winWidth,0.0,winHeight);
}

void DrawLine()
{
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_LINES);
glVertex2i(x1,y1);
glVertex2i(x2,y2);
glEnd();
}

void DrawRectf()
{
glColor3f(1.0,0.0,0.0);
glRectf(x1,y1,x2,y2);
}

void DrawStrip()
{
glColor3f(1.0f,0.0f,1.0f);
for (int i = 0; i < n; i++){
glBegin(GL_LINES); //绘制直线段
glVertex2i(Line[i].x1, Line[i].y1);
glVertex2i(Line[i].x2, Line[i].y2);
glEnd();
}
//动态绘制鼠标动作
if (Flag == 1){
glBegin(GL_LINES);
glVertex2i(Line[i].x1, Line[i].y1);
glVertex2i(Mousex, Mousey);
glEnd();
}
glutSwapBuffers(); //交换缓冲区
}

int ChooseTheItem()
{
cout<<"请选择:\n"
<<"1.直线\n"
<<"2.矩形\n"
<<"3.折线"<<endl;

while(1){
cin>>choice;
if(choice>=0 && choice<=3)
return choice;
else
cout<<"输入错误,请重新输入。"<<endl;
}
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);

if(iPointNum>=1){

switch(choice){
case 1:DrawLine();break;
case 2:DrawRectf();break;
case 3:DrawStrip();break;
}

}
glutSwapBuffers(); //交换缓冲区
}

void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
if(choice==3){
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN){
if (Flag == 0){
Flag = 1;
iPointNum = 1;
Line[n].x1 = xMouse;
Line[n].y1 = winHeight - yMouse;
}
else{
Line[n].x2 = xMouse;
Line[n].y2 = winHeight - yMouse;
n++;
//折线的第二点作为下一段线的第一个的点
Line[n].x1 = Line[n-1].x2;
Line[n].y1 = Line[n-1].y2;
}
}
}

else{
if(button==GLUT_LEFT_BUTTON && action == GLUT_DOWN){
if(iPointNum==0 || iPointNum==2){
iPointNum = 1;
x1 = xMouse,y1 = winHeight - yMouse;
}

else{
iPointNum = 2;
x2 = xMouse,y2 = winHeight - yMouse;
glutPostRedisplay();
}
}

if(button==GLUT_RIGHT_BUTTON && action==GLUT_DOWN){
iPointNum = 0;
glutPostRedisplay();
}
}
}

void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
if(choice==3){
Mousex = xMouse;
Mousey = winHeight - yMouse;
glutPostRedisplay();
}
else{
if(iPointNum==1){
x2 = xMouse;
y2 = winHeight - yMouse;
glutPostRedisplay();
}
}
}

int main(int argc,char *argv[])
{
glutInit(&argc,argv);
choice = ChooseTheItem();
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("橡皮筋技术");

glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
glutPassiveMotionFunc(PassiveMouseMove);

Initial();
glutMainLoop();
return 0;
}
...全文
321 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jerikc 的回复:]

求解啊。SOS。
[/Quote]
glutDisplayFunc(Display);
glutIdleFunc(Display);
鼠标移动的时候不绘制,所以导致闪烁。
Jerikc 2011-05-22
  • 打赏
  • 举报
回复
求解啊。SOS。
天鹅梦 2011-05-22
  • 打赏
  • 举报
回复
为什么一定要用opengl,二维的图形库不行吗?GDI,GDI+,AGG,都可以的

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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