OpenGL鼠标跟踪(自由形式线)

时间:2015-07-30 01:33:49

标签: c++ opengl line

目前我正在尝试制作一个跟踪鼠标坐标的程序,以便在移动时绘制自由形状的线条。到目前为止,该程序正在跟踪鼠标并绘制线条,但线条都回到了几乎充当原点的坐标。我的教授提到自由形式的线是通过变量前一个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;
}

当我编译并运行它时,它在窗口上输出

enter image description here

1 个答案:

答案 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中绘制的线的最后一个点,因此下次绘制另一个线段时,从那里开始。