利用键盘实现橡皮筋技术

键盘输入注册函数:glutKeyboardFunc(Key);它指定了程序在运行状态时,按下键盘上的任意一个键都会调用Ker函数:

void Key(unsigned char key,int x,int ,y);参数key的取值是一个字符值或对应的ASCLL编码,而(x,y)则是按下键盘时窗口中当前屏幕光标相对于

窗口左上角的位置坐标。

代码如下:

#include"gl/glut.h"
int ipointnum=0;//已确定点的数目
int x1=0,x2=0,y1=0,y2=0;//确定的点坐标
int winWidth=400,winHeight=300;//窗口的宽度和高度
void Initial(void)
{
    glClearColor(1.0f,1.0f,1.0f,1.0f);//设置窗口的背景颜色
}

void ChangeSize(int w,int h)
{
    winWidth=w;winHeight=h;//保存当前窗口的大小
    glViewport(0,0,w,h);//指定窗口显示区域
    glMatrixMode(GL_PROJECTION);//指定设置投影参数
    glLoadIdentity();//调用单位矩阵,去掉以前的投影参数设置
    gluOrtho2D(0.0,winWidth,0.0,winHeight);//设置投影参数
}
void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口
    glColor3f(1.0f,0.0f,0.0f);//指定当前的绘图颜色
    if(ipointnum>=1)
    {
        glBegin(GL_LINES);//绘制直线段
        glVertex2i(x1,y1);
        glVertex2i(x2,y2);
        glEnd();
    }
    glutSwapBuffers();//交换缓冲区
}
void Key(unsigned char key,int x,int y)
{
    switch(key)
    {
    case 'p':
        if(ipointnum==0||ipointnum==2)
        {
            ipointnum=1;
            x1=x;y1=winHeight-y;//确定直线段的第一个端点
        }
        else
        {
            ipointnum=2;
            x2=x;y2=winHeight-y;//确定直线段的第二个端点
            glutPostRedisplay();//指定窗口重新绘制
        }
        break;
    default:break;
    }
}
void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
    if(ipointnum==1)
    {
       x2=xMouse;
       y2=winHeight-yMouse;//将当前鼠标位置指定为直线的未固定端点
       glutPostRedisplay();
    }
}
int main(int argc,char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型
    glutInitWindowSize(400,300);//指定窗口的大小
    glutInitWindowPosition(100,100);//指定窗口在屏幕上的位置
    glutCreateWindow("橡皮筋技术");
    glutDisplayFunc(Display);
    glutReshapeFunc(ChangeSize);//指定窗口再整形回调函数
    glutKeyboardFunc(Key);//指定键盘响应函数
    glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数
    Initial();
    glutMainLoop();//启动主GLUT时间处理循环
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/acm-jing/p/4374040.html