`
ldl8818
  • 浏览: 124719 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

OpenGL 橡皮筋技术

J# 
阅读更多

后天图形学考试,整理了下实验课上的OpenGL关于橡皮筋实验的代码。

 

简单实现了如下功能:

1.右键菜单功能响应

2.右键选择画折线或矩形,可保存(书上例子演变)

3.可选取画线或画矩形的颜色,线宽,像素大小

 

 

 

#include <gl/glut.h>  
#include <stdlib.h>
 
#define NUM 100 //折线的最大折线段  
 
int Flag = 0; //标记是否已经开始绘制折线  
int RFlag = 0; //标记是否已经完成一个矩形  
int Function = 1; //标记选择的功能是画折线还是矩形  
int winWidth = 800, winHeight = 600; //窗口的宽度和高度  
int Mousex, Mousey; //用于记录当前鼠标的位置  
int n = 0; //用于记录折线有几段  
int m = 0; //用于记录矩形个数  
//线性结构体  
struct LineNode {  
    int x1;  
    int y1;  
    int x2;  
    int y2;  
}Line[NUM];  
//矩形结构体  
struct Rectangle {  
    int x1;  
    int y1;  
    int x2;  
    int y2;  
}Rect[NUM];  

static GLsizei iMode = 1;
 
 
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 ProcessMenu1(int value)  
{  
    Function = value; //接收选择  
 
    n = 0;  
    Flag = 0;  
    m = 0;  
    RFlag = 0;  
    glutPostRedisplay(); 
}  

void ProcessMenu2(int value)  
{  
	iMode = value; 

    n = 0;  
    Flag = 0;  
    m = 0;  
    RFlag = 0;  
    glutPostRedisplay(); 
} 
 
void Display()  
{  
	//默认画笔是红色,是线性模式,不填充
    int i, j;  
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //线性模式画图
	
    glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口  

    glColor3f(1.0f, 0.0f, 0.0f); //指定当前的绘图颜色  

	switch(iMode)
	{
	case 3:
		glColor3f(1.0f, 0.0f, 0.0f); //红色 
		break;
	case 4:
		glColor3f(0.0f, 1.0f, 0.0f); //绿色 
		break;
	case 5:
		glColor3f(0.0f, 0.0f, 1.0f); //蓝色
		break;
	case 6:
		glColor3f(0.0f, 0.0f, 0.0f); //黑色 
		break;
	case 7:
		glLineWidth(2); //像素增大 
		break;
	case 8:
		glLineWidth(1); //像素减小
		break;
	case 9:
		glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 
		break;
	case 10:
		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //线性模式画图 
		break;

	case 11://退出
		exit(0);
		break;

	case 12://清屏
		glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口  
		break;
	}

    if (Function == 1) {  
        for (i = 0; i < n; i++) {  
            glBegin(GL_LINES); //绘制直线段  
                glVertex2i(Line[i].x1, Line[i].y1);  
                glVertex2i(Line[i].x2, Line[i].y2);  
            glEnd();  
        }  
        //动态绘制鼠标动作  
        if (Flag == 1) {  
            glBegin(GL_LINES);  
                glVertex2i(Line[i].x1, Line[i].y1);  
                glVertex2i(Mousex, Mousey);  
            glEnd();  
        }  
    }  
    else {  
        //绘制矩形  
        for (j = 0; j < m; j++) {  
            glRecti(Rect[j].x1, Rect[j].y1, Rect[j].x2, Rect[j].y2);  
        }  
        //动态绘制鼠标动作  
        if (RFlag == 1) {  
            glRecti(Rect[j].x1, Rect[j].y1, Mousex, Mousey);  
        }  
    }  
    glutSwapBuffers(); //交换缓冲区  
}  
 
void MousePlot(GLint button, GLint action, GLint xMouse, GLint yMouse)  
{  
    if (Function == 1) {  
        if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) {  
            if (Flag == 0) {  
                Flag = 1;  
                Line[n].x1 = xMouse;  
                Line[n].y1 = winHeight - yMouse;  
            }  
            else {  
                Line[n].x2 = xMouse;  
                Line[n].y2 = winHeight - yMouse;  
                n++;  
                //折线的第二点作为下一段线的第一个的点  
                Line[n].x1 = Line[n-1].x2;  
                Line[n].y1 = Line[n-1].y2;  
            }  
        }  
    }  
    else {  
        //矩形处理  
        if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) {  
            if (RFlag == 0) {  
                RFlag = 1;  
                Rect[m].x1 = xMouse;  
                Rect[m].y1 = winHeight - yMouse;  
            }  
            else {  
                RFlag = 0;  
                Rect[m].x2 = xMouse;  
                Rect[m].y2 = winHeight - yMouse;  
                m++;  
                glutPostRedisplay();  
            }  
        }  
    }  
}  
 
void PassiveMouseMove(GLint xMouse, GLint yMouse)  
{  
    Mousex = xMouse;  
    Mousey = 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("橡皮筋技术");  

    
	int nFunctionMenu=glutCreateMenu(ProcessMenu1);  
    glutAddMenuEntry("画折线", 1);  
    glutAddMenuEntry("画矩形", 2);  

	int nColorMenu = glutCreateMenu(ProcessMenu2);  
	glutAddMenuEntry("Red",3);               //创建右键颜色菜单
	glutAddMenuEntry("Green",4);
	glutAddMenuEntry("Blue",5);
	glutAddMenuEntry("Black",6);

	int nPixelMenu = glutCreateMenu(ProcessMenu2);  //创建右键像素菜单
	glutAddMenuEntry("increase pixel size",7);
	glutAddMenuEntry("decrease pixel size",8);

	int nFilleMenu = glutCreateMenu(ProcessMenu2);  //创建右键填充菜单
	glutAddMenuEntry("fill on",9);
	glutAddMenuEntry("fill off",10);

	int nMainMenu = glutCreateMenu(ProcessMenu2);
	glutAddSubMenu("功能",nFunctionMenu);
	glutAddSubMenu("颜色", nColorMenu);
	glutAddSubMenu("像素大小", nPixelMenu);
	glutAddSubMenu("填充", nFilleMenu);

    glutAttachMenu(GLUT_RIGHT_BUTTON);  //右键

	glutCreateMenu(ProcessMenu2);  
	glutAddMenuEntry("退出", 11);
	glutAddMenuEntry("清屏", 12);

    glutAttachMenu(GLUT_MIDDLE_BUTTON);  //中间键

    glutDisplayFunc(Display);  

    glutReshapeFunc(ChangeSize); //指定窗口再整形回调函数  

    glutMouseFunc(MousePlot); //指定鼠标响应函数  

    glutPassiveMotionFunc(PassiveMouseMove); //指定鼠标移动响应函数  

    Initial();  

    glutMainLoop(); //启动主GLUT事件处理循环  

    return 0;  
} 
分享到:
评论

相关推荐

    opengl橡皮筋技术

    计算机图形学基础(第二版)OpenGL橡皮筋技术改良版,

    计算机图形学实验-基于OpenGL实现椭圆 Bresenham 算法和橡皮筋交互技术

    基于C++ OpenGL/GLUT 实现的,橡皮筋式椭圆交互绘制,包含鼠标和键盘交互,以及菜单创建,可供计算机图形学实验参考。

    实现橡皮筋技术的直线bresenham中点算法

    用bresenham算法实现任意象限的bresenham算法,并用异或方法实现橡皮筋技术

    计算机图形学实验报告

    1、 实验一:橡皮筋技术的实现 (1、了解 C++.NET 开发基于 OPENGL 的图形应用程序的步骤。 2、了解 OPENGL 的流水线。 3、学习鼠标、键盘交互技术。 4、实现二点定矩形的橡皮筋技术。 ) 2、 实验二:定义...

    实验1++橡皮筋技术的实现1

    2、了解OPENGL的流水线 3、学习鼠标、键盘、菜单交互技术 4、实现直线、矩形的橡皮筋技术

    计算机图形学橡皮筋

    图形学橡皮筋(象皮条)技术,可以实现鼠标拖拉出矩形,并且支持多条显示。交互式计算机图形学源代码(OpenGL的C++版本)

    opengl 键盘操作

    opengl键盘响应函数 利用键盘实现橡皮筋技术的例子

    opengl作业

    要实现用户帮助功能,我们需要提供一个用户帮助系统,用户可以通过这个系统来获取作业的使用说明和技术支持。 简要描述作业的整体结构 要求:简要描述作业的整体结构的说明文档。 要实现简要描述作业的整体结构...

    opengl二维卡通人物交互设计

    根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...

    计算机图形学之OpenGL基础图形函数使用及基本图素的生成算法实现的实验

    设计一个二维卡通任务交互设计系统,实现直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,...

    基于鼠标交互的卡通人物设计与绘制,可以对人物五官位置进行拖拽移动调整

    根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...

    20161008058实验2.cpp

    利用OpenGL实现折线和矩形的橡皮筋绘制技术,并采用右键菜单实现功能的选择

    计算机图形学大实验.zip

    VS2019工程亲自测试通过、是利用OpenGL绘制的二、三维图形及图形的平行移动、旋转等、对初学OpenGL及计算机专业的实验作业都有很大帮助、可以在此代码上根据自己的需要进行修改、

    基于C++和OpenGL实现的简单画图工具源码+项目说明+sln解决方案.zip

    通过橡皮筋技术动态绘制图形;Liang-Barsky 算法批量裁剪直线、折线;连续Bezier曲线、B样条的绘制;椭圆的中点 Bresenham 算法绘制椭圆。 `C++` 源代码文件。如果在 `visual studio 2022` 以外的其它 `OpenGL` ...

    广工图形学实验报告

    1 掌握OpenGL的三维图形绘制方法 2 掌握Visual C++环境下的OpenGL图形开发 在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的...2 人机交互(图形的基本变换,如旋转、平移、尺度缩放及橡皮筋技术等)

    鼠标交互画圆及椭圆(基于Bresenham、中点)

    支持Visual Studio 2013 及以上版本,c语言实现代码,中点算法及Bresenham算法画圆,中点算法画椭圆,鼠标的交互方式利用OpenGL实现。

    计算机图形学基础-pdf.zip

    3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何...

    山东大学计算机图形学实验1

    根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...

    bresenham算法画直线

    用bresenham算法写的类似橡皮筋技术的算法

Global site tag (gtag.js) - Google Analytics