`
ldl8818
  • 浏览: 125651 次
  • 性别: 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 (Open Graphics Library) 是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它使用图形管道的概念来加速图形处理,并...

    VS2019OpenGL橡皮筋画圆,复制粘贴即运行

    计算机图形学作业OpenGL实现橡皮筋画圆希望能帮助到大家

    C#橡皮筋技术画矩形和线

    在给定的“C#橡皮筋技术画矩形和线”主题中,我们将深入探讨如何使用C#来实现这一功能,并特别关注如何通过`BufferedGraphicsManager`来解决`ControlPaint.DrawReversibleLine`可能带来的问题。 首先,`Control...

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

    在这个实验中,我们将关注两个关键概念:Bresenham椭圆算法和橡皮筋交互技术,这些都是在计算机图形学中用于实现用户交互和高效绘图的重要方法。 Bresenham算法是一种在像素级别上近似绘制几何形状的算法,尤其适用...

    使用橡皮筋技术画直线代码

    ### 使用橡皮筋技术画直线代码解析 #### 一、概述 在计算机图形学领域,绘制直线是一项基础但重要的任务。传统的直线绘制算法如DDA(数字差分分析器)和Bresenham算法虽然能够有效地完成这项工作,但在交互式环境...

    人机交互实现橡皮筋技术

    在"人机交互实现橡皮筋技术"这一主题中,我们主要探讨的是在图形用户界面(GUI)中使用类似于橡皮筋的动态选择工具,让用户可以直观地绘制直线、圆、矩形和椭圆等几何形状。 橡皮筋技术是一种用户友好的图形绘制...

    c++中橡皮筋技术

    在C++编程中,"橡皮筋技术"通常是指一种实现动态图形绘制的方法,它允许用户在屏幕上画出可伸缩、可移动的线条,就像橡皮筋一样。这种技术常用于图形用户界面(GUI)应用程序,特别是那些需要实时交互绘图的场景,如...

    C++程序软件实现的橡皮筋技术

    "橡皮筋技术"在计算机科学,特别是图形学领域中,是一种用于模拟物体柔韧性的算法。这种技术常被应用于2D和3D图形应用程序,如游戏开发、CAD(计算机辅助设计)软件以及可视化工具中,使用户可以交互地操纵虚拟对象...

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

    标题"实现橡皮筋技术的直线bresenham中点算法"指出,我们将讨论如何结合Bresenham直线算法与橡皮筋效果,这通常用于计算机图形学中的交互式绘图。Bresenham算法是一种优化的离散化算法,它在像素级别上近似地绘制...

    基于_C++(MSVC)_和_OpenGL_的简单画图工具_通过橡皮筋技术动态绘制图形;

    基于_C++(MSVC)_和_OpenGL_的简单画图工具_通过橡皮筋技术动态绘制图形;Lian_simple-openl-graphic-tool

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

    实验1++橡皮筋技术的实现1主要涵盖了多个IT领域的知识点,包括C++编程语言、.NET框架的应用、OpenGL图形库的使用以及交互式图形用户界面的设计。以下将详细阐述这些知识点。 首先,C++.NET是一种面向对象的编程语言...

    OpenGL卡通人脸绘制

    这个课程设计实验旨在帮助学习者掌握基本的OpenGL编程技巧,同时探索更高级的技术如橡皮条技术。 首先,我们要了解OpenGL的基础知识。OpenGL通过顶点、图元和着色器等概念构建图形。顶点是构成图形的基本元素,图元...

    计算机图形学实验报告

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

    计算机图形学橡皮筋

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

    opengl 键盘操作

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

    橡皮筋-拾取代码

    从给定的文件信息来看,我们正在探讨的是计算机图形学中的两个重要概念——橡皮筋技术和拾取操作,这是在OpenGL编程中常见的技术。实验报告的标题“橡皮筋-拾取代码”揭示了报告的主要内容是关于如何通过代码实现这...

    C++实现的橡皮筋程序包括直线圆矩形等

    总之,这个C++实现的橡皮筋程序不仅展示了基础的图形绘制技术,还涉及到用户交互、事件处理、图形变换等多个计算机图形学的重要概念。对于初学者来说,这是一个很好的实践项目,有助于提升对C++编程和计算机图形学的...

    opengl作业

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

    opengl二维卡通人物交互设计

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

Global site tag (gtag.js) - Google Analytics