关于利用OPENGL实现直线、矩形、折线的橡皮筋技术的有关问题
以下代码是我利用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;
}