码迷,mamicode.com
首页 > 其他好文 > 详细

opengl中橡皮筋技术的实现

时间:2015-03-28 12:54:42      阅读:448      评论:0      收藏:0      [点我收藏+]

标签:

修改添加项:

C/C++ 中的 __WINDOWS

linker 中的 opengl32.lib glu32.lib glaux.lib

 

实验注意点:

橡皮筋技术的关键在于控制图形随着用户的操作(鼠标移动)而不断发生着变化,此时需要擦除原有的图形同时生成新的图形。橡皮筋技术有两种实现方法:

一种是利用颜色的异或操作,对原有图形并不是擦除,而是在绘制一条同样的直线段并与原图形进行异或操作,此时原图形会从屏幕上消失;另一种是利用双缓存

技术,绘制图形是分别绘制到两个缓存,交替显示。这里我们利用双缓存技术实现橡皮筋技术。

程序中经常使用的函数:

1/鼠标函数,对鼠标在窗口范围内的按键按下或松开时间进行处理:glutMouseFunc(MousePlot);其中MousePot函数是鼠标响应函数,

void MousePlot(Glint button,Glint action,Glint xMouse,Glint yMouse);

2/处理鼠标移动的注册函数:

当一个或多个鼠标按键被按下时在窗口内移动的注册函数:glutMotionFunc(MouseMove);

当鼠标按键没有被按下时在窗口内移动的注册函数:glutPassiveMotionFunc(PassiveMouseMove);

void Mousemove(Glint xMouse,Glint yMouse); void PassiveMouseMove(Glint xMouse,Glint yMouse);

3/指定窗口双缓存:glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

4/确定窗口的高度以解决坐标对应的问题,glutReshapeFunc(ChangeSize),当窗口的大小发生变化是调用的函数。该函数的原型为void ChangeSize(int w,int h);

w和h表示变化后窗口的宽度和高度。glViewport(0,0,w,h);重新指定窗口的显示区域。

程序及注释如下:

技术分享
#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 MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
    if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
    {
        if(ipointnum==0||ipointnum==2)
        {
            ipointnum=1;
            x1=xMouse;y1=winHeight-yMouse;//确定直线段的第一个端点
        }
        else
        {
            ipointnum=2;
            x2=xMouse;y2=winHeight-yMouse;//确定直线段的第二个端点
            glutPostRedisplay();//指定窗口重新绘制
        }
    }
    if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)
    {
        ipointnum=0;
        glutPostRedisplay();
    }
}
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);//指定窗口再整形回调函数
    glutMouseFunc(MousePlot);//指定鼠标响应函数
    glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数
    Initial();
    glutMainLoop();//启动主GLUT时间处理循环
    return 0;
}
View Code

 

opengl中橡皮筋技术的实现

标签:

原文地址:http://www.cnblogs.com/acm-jing/p/4373970.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!