后天图形学考试,整理了下实验课上的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橡皮筋技术改良版,
基于C++ OpenGL/GLUT 实现的,橡皮筋式椭圆交互绘制,包含鼠标和键盘交互,以及菜单创建,可供计算机图形学实验参考。
用bresenham算法实现任意象限的bresenham算法,并用异或方法实现橡皮筋技术
1、 实验一:橡皮筋技术的实现 (1、了解 C++.NET 开发基于 OPENGL 的图形应用程序的步骤。 2、了解 OPENGL 的流水线。 3、学习鼠标、键盘交互技术。 4、实现二点定矩形的橡皮筋技术。 ) 2、 实验二:定义...
2、了解OPENGL的流水线 3、学习鼠标、键盘、菜单交互技术 4、实现直线、矩形的橡皮筋技术
图形学橡皮筋(象皮条)技术,可以实现鼠标拖拉出矩形,并且支持多条显示。交互式计算机图形学源代码(OpenGL的C++版本)
opengl键盘响应函数 利用键盘实现橡皮筋技术的例子
要实现用户帮助功能,我们需要提供一个用户帮助系统,用户可以通过这个系统来获取作业的使用说明和技术支持。 简要描述作业的整体结构 要求:简要描述作业的整体结构的说明文档。 要实现简要描述作业的整体结构...
根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...
设计一个二维卡通任务交互设计系统,实现直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,...
根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...
利用OpenGL实现折线和矩形的橡皮筋绘制技术,并采用右键菜单实现功能的选择
VS2019工程亲自测试通过、是利用OpenGL绘制的二、三维图形及图形的平行移动、旋转等、对初学OpenGL及计算机专业的实验作业都有很大帮助、可以在此代码上根据自己的需要进行修改、
通过橡皮筋技术动态绘制图形;Liang-Barsky 算法批量裁剪直线、折线;连续Bezier曲线、B样条的绘制;椭圆的中点 Bresenham 算法绘制椭圆。 `C++` 源代码文件。如果在 `visual studio 2022` 以外的其它 `OpenGL` ...
1 掌握OpenGL的三维图形绘制方法 2 掌握Visual C++环境下的OpenGL图形开发 在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的...2 人机交互(图形的基本变换,如旋转、平移、尺度缩放及橡皮筋技术等)
支持Visual Studio 2013 及以上版本,c语言实现代码,中点算法及Bresenham算法画圆,中点算法画椭圆,鼠标的交互方式利用OpenGL实现。
3.4OpenGL中橡皮筋技术的实现 3.4.1基于鼠标的实现 3.4.2基于键盘的实现 3.5OpenGL中拾取操作的实现 3.6OpenGL的菜单功能 第4章图形的表示与数据结构 4.1基本概念 4.1.1基本图形元素 4.1.2几何...
根据OpenGL提供的直线,多边形绘制算法(橡皮筋效果),实现基于鼠标交互的卡通人物设计与绘制。使用颜色填充与反走样技术对卡通人物外貌以及衣着进行绘制。实现对卡通人物轮廓的交互控制,点击鼠标左键可以对人物...
用bresenham算法写的类似橡皮筋技术的算法