目前我正在尝试制作一个跟踪鼠标坐标的程序,以便在移动时绘制自由形状的线条。到目前为止,该程序正在跟踪鼠标并绘制线条,但线条都回到了几乎充当原点的坐标。我的教授提到自由形式的线是通过变量前一个x和前一个y实现的,以及每次鼠标移动旧的一个是如何存储在前一个x和前一个y中,然后它将连接到新的x和y坐标。
如何更改previousx和previousy变量以实现自由形式线?
// To compile in Linux: g++ -o mouse_exam mouse_exam.cpp -lGL -lGLU -lglut -lm
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GlUT/glut.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#endif
#include <iostream>
#include <cmath>
using namespace std;
#define WIDTH 600
#define HEIGHT 600
#define WLEFT 0
#define WRIGHT WIDTH
#define WBOTTOM 0
#define WTOP HEIGHT
#define RGBBLACK 0,0,0
#define RGBGREY .8,.8,.8
static int tracking = 0;
float previousx;
float previousy;
int inwindow(int x, int y)
{
return(x>WLEFT && x<WRIGHT && y>WBOTTOM && y<WTOP);
}
void m_motion(int x, int y)
{
y = WTOP-y;
if(tracking && inwindow(x,y))
{
glBegin(GL_LINES);
glVertex2f(previousx,previousy);
glVertex2f(x,y);
glEnd();
glFlush();
}
}
void handleButton(int button, int state, int x, int y)
{
y=WTOP-y;
if(button != GLUT_LEFT_BUTTON)
{
return;
}
if(state == GLUT_DOWN)
{
if(inwindow(x,y))
{
tracking = 1;
previousx =x;
previousy =y;
cout << previousx << " " << previousy << endl;
}
}
else
{
tracking = 0;
}
}
void drawMouse(void)
{
int i;
glClearColor(RGBGREY,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(RGBBLACK);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(WIDTH,HEIGHT);
glutCreateWindow("Mouse Exam");
glutDisplayFunc(drawMouse);
glutMouseFunc(handleButton);
glutMotionFunc(m_motion);
gluOrtho2D(0,WIDTH,0,HEIGHT);
glutMainLoop();
return 0;
}
当我编译并运行它时,它在窗口上输出
答案 0 :(得分:1)
替换此部分:
if(tracking && inwindow(x,y))
{
glBegin(GL_LINES);
glVertex2f(previousx,previousy);
glVertex2f(x,y);
glEnd();
glFlush();
}
有了这个:
if(tracking && inwindow(x,y))
{
glBegin(GL_LINES);
glVertex2f(previousx,previousy);
glVertex2f(x,y);
glEnd();
glFlush();
previousx = x; /* ADDED */
previousy = y; /* ADDED */
}
注意我添加的两行。我们的想法是始终保持您在previousx和previousy中绘制的线的最后一个点,因此下次绘制另一个线段时,从那里开始。