opengl 使用鼠标移动绘制线条

ercv8c1e  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(372)

我正在尝试用OpenGL来画线。当我点击鼠标左键时,它会得到第一个坐标。然后当我移动鼠标时,第二个坐标同时也是我的鼠标坐标。第二个坐标要等到我点击右键后才能确定。
但我的代码有两个问题:
1.似乎当我甚至没有点击我的左按钮,有线在屏幕上。
1.我无法通过单击右键确定第二个坐标。
下面是我的代码:


# include<GLUT/GLUT.h>

# include<stdlib.h>

# include<stdio.h>

# include<math.h>

# include<time.h>

int m0,n0,m1,n1,ww,hh;
int flag=0;

void DrawPoint(int x,int y){
    glBegin(GL_POINTS);
        glVertex2f(x,y);
    glEnd();
}
void BresenhamLine(int x1,int y1,int x2,int y2){
    int x,y,delta1,delta2,e;
    delta1=x2-x1;
    delta2=y2-y1;
    int flag=0;
    x=x1;
    y=y1;
    if (abs(delta2)>abs(delta1)){
        flag=1;
    }

    int t1=(x2>x1?1:(delta1=-delta1,-1));
    int t2=(y2>y1?1:(delta2=-delta2,-1));
    glBegin(GL_POINTS);
    glColor3f(0.0,1.0,0.0);
    glVertex2f(x,y);
    if(flag==0){
        e=-delta1;
        while(x!=x2){
            x+=t1;
            e+=2*delta2;
            if(e>=0)
            {
                y+=t2;
                e-=2*delta1;
            }
            glVertex2f(x,y);
        }
    }
    else{
        e=-delta2;
        while(y!=y2)
        {
            y+=t2;
            e+=2*delta1;
            if(e>=0)
            {
                x+=t1;
                e-=2*delta2;
            }
            glVertex2f(x,y);
        }
    }
    glEnd();
    glFlush();
}
void DrawLine(){
    //bresenhamline
    BresenhamLine(m0,n0,m1,n1);
    glFlush();
}
void myreshape(GLint w,GLint h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0,(GLfloat)w,0,(GLfloat)h);
    glMatrixMode(GL_MODELVIEW);
    ww=w;
    hh=h;
}

void mymouse(int button,int state,int x,int y){

    if(state==GLUT_DOWN && button == GLUT_LEFT_BUTTON){
        m0=x;
        n0=hh-y;

    }

    if(state == GLUT_DOWN && button == GLUT_RIGHT_BUTTON){
        m1=x;
        n1=hh-y;
        glutPostRedisplay();
    }
}

void mymotion(int x,int y){
    m1=x;
    n1=hh-y;
    glutPostRedisplay();
}

void init(){
    glClearColor(1,1,1,1);
    glPointSize(3.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 500,500, 0);
}

void mydisplay(){
    glClear(GL_COLOR_BUFFER_BIT);
    DrawLine();
    glFlush();
}
int main(int argc,char**argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(0,0);
    glutCreateWindow("simple");
    glutDisplayFunc(mydisplay);
    glutMouseFunc(mymouse);
    glutReshapeFunc(myreshape);
    glutPassiveMotionFunc(mymotion);
    glutMainLoop();
}
nzk0hqpo

nzk0hqpo1#

1.似乎当我甚至没有点击我的左按钮,有线在屏幕上。
mymotion()中,鼠标指针的当前x和y坐标存储在m1n1变量中,然后将其用作DrawLine()中所绘制线段的端点。每当鼠标指针的位置发生变化时,以及当两个鼠标键都没有按下时,都会重复发生这种情况。
1.我无法通过单击右键确定第二个坐标。
当你按住鼠标右键,同时移动鼠标光标,线段不再移动。所以,程序按预期的工作,但它 * 不知何故 * 不断更新m1n1,当没有鼠标按钮被按下...
glutPassiveMotionFunc()的文档说明:
glutMotionFunc和glutPassiveMotionFunc分别为当前窗口设置动作和被动动作回调〉。(...)当鼠标在窗口内移动而未按下鼠标按钮时,将调用窗口的被动动作回调。
因此,mymotion()可以被删除。-没有它,线段的端点将不再改变时,鼠标光标被移动,他们只得到更新,在mymouse()后,鼠标按钮被按下。
边注,如果你正在修改一个找到的GLUT示例程序:这个例子的目的可能是通过使用Bresenham的线算法绘制一条线来说明2D概念,其中GL_POINTS为每个像素一个顶点。通过使用GL_LINES,让OpenGL处理线渲染也可以更简单、更有效地完成这一点,例如:

void DrawLine(void)
{
    glBegin(GL_LINES);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(m0, n0);
    glVertex2f(m1, n1);
    glEnd();
    glFlush();
}

BresenhamLine()(和DrawPoint())也可以被删除。顺便说一下,init()不会被调用,所以透明色和点大小保持默认值。)

相关问题