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