计算机图形学实验四 OpenGL的鼠标交互绘制
一、实验目的
1.掌握OpenGL的鼠标按钮响应函数。
2.掌握OpenGL的鼠标移动响应函数。
3.进一步巩固OpenGL的基本图元绘制基础。
二、实验内容
1.鼠标画草图——实现鼠标点到哪,线就画到哪。
思路:
1)在主程序注册鼠标响应和鼠标移动子函数:
glutMouseFunc(mymouse);
glutMotionFunc(mymotion);
放在display注册之后和mainloop之前。
- 在程序头部声明鼠标响应和鼠标移动子函数:
- void myMouse(int button,int state,int x,int y);
- void myMotion(int x,int y);
- 3)构造鼠标响应子函数:
- // 鼠标按钮响应事件
- void myMouse(int button,int state,int x,int y)
- {
//鼠标左键按下——确定起始点
//鼠标左键松开——画最后一个顶点,画线结束
}
4)构造鼠标移动子函数:
//鼠标移动时获得鼠标移动中的坐标
void myMotion(int x,int y)
{
//鼠标移动——线画到哪
}
5)修改显示函数Display():
//画直线程序框架
#include "stdafx.h"
#include <glut.h>
int ww,hh; //显示窗口宽和高
void Myinit(vold);
void Reshape (int w, int h);
void Display(void);
int APIENTRY tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED PARAMETER (hPrevInstance) ;
UNREFERENCED_PARAMETER(1pCmdLine) ;
char *argvl] = ("hello ".
int argc = 2; // argv 中的字符串数
glutInit(6argc, argv) ; // 初始化 GLUT 库
glutInitWindowSize(800, 600) ; // 设置显示窗口大小
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); // 设置显示模式 (注意双缓存)glutCreateWindow(”鼠标画线小程序演示"); // 创建显示窗口
Myinit();
glutDisplayFunc(Display); // 注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
glutMainLoop(); //进入事件处理循环
return 0;
}
void Myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glLineWidth(3.0);
}
// 渲染绘制子程序
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT); // 刷新颜色缓存区
g1Begin(GL_LINES);
glVertex2f(0,0);
glVertex2f(ww,hh);
glEnd();
glutSwapBuffers(); // 双缓存的刷新模式
}
void Reshape(int w, int h) // 窗口改变时自动获取显示窗口的宽w和高 h
{
glMatrixMode (GL_PROJECTION) ; // 投影矩阵模式
qlLoadIdentity(); // 矩阵堆栈清空
glViewport(0, 0, w, h); // 设置视区大小
g1uOrtho2D(0, w, 0, h); // 设置裁剪窗口大小
ww=W;
hh=h;
}
}
- 鼠标画线。阅读OpenGL鼠标画线程序,能够实现在绘制窗口用鼠标交互绘制若干条直线,鼠标左键首先按下确定直线的起始点,鼠标左键按下同时移动,看到画线过程,鼠标左键松开时确定直线的终点,可重复画多条直线。
- 思路:
- 1)写出画静止若干条直线程序框架,坐标用变量替代。
- 2)在主函数里注册鼠标按钮响应函数和鼠标移动响应函数。
- 3)在鼠标按钮响应子函数里给出鼠标按钮响应事件。
- 4)在鼠标移动响应子函数里给出鼠标移动响应事件。
- 5)读懂程序并分析程序,保留程序。
- //鼠标画线小程序
- #include"stdafx.h"
- #include <glut.h>
- idefine N 1000 // 线段最大条数
- int ww,hh; // 显示窗口宽和高
- int line(N)[4], k=0; //线段坐标存储数组,线段计数
- void Myinit(void);
- void Reshape(int w, int h);
- void myMouse(int button,int state,int x,int y)i
- void myMotion(int x,int y);
- void Display(void);
- voiddrawlines();
- int APIENTRY_tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR 1pCmdLine,
- int nCmdShow)
{
UNREFERENCED PARAMETER (hPrevInstance);
UNREFERENCED_PARAMETER(1pCmdLine);
chargv[]=("hello”,"");
int 1c = 2;// must/should match the number of strings in argv
Init(&argc, argv); // 初始化 GLUT 库
InitWindowSize(800,600); //设置显示窗口大小
InitDisplayMode (GLUT_DOUBLE | GLUT_RGB) ; // 设置显示模式 (注意双缓存)
tCreateWindow(”鼠标画线小程序演示"); // 创建显示窗口
/init();
glutDisplayFunc(Display); //注册显示回调函数
utMouseFunc(myMouse); // 注册鼠标按钮回调函数
glutMotionFunc(myMotion); // 注册鼠标移动回调函数
glutReshapeFunc(Reshape); // 注册窗口改变回调函数
glutMainLoop(); // 进入事件处理循环
return 0;
void Myinit (void)
{
glClearColor(0.0,0.0,0.0,0.0);
glLineWidth(3.0);
// 渲染绘制子程序
}
vold Display(void)
{
glClear (GL_COLOR_BUFFER_BIT); // 刷新颜色缓存区
drawlines(); //高线子程序
//双缓存的刷新模式
glutSwapBuffers();
void Reshape(int w, int h) //窗口改变时自动获取显示窗口的宽w和高h
glMatrixMode (GL_PROJECTION); // 投影矩阵模式
glLoadIdentity(); // 矩阵堆栈清空
glViewport(0, 0, w, h); // 设置视区大小
glu0rtho2D(0, w, 0, h); //设置裁剪窗口大小
WW=W;
hh=h;
// 鼠标按钮响应事件
}
void myMouse(int button,int state,int x,int y)
{
if(button==GLUT_LEFT_BUTTON&6state==GLUT_DOWN)
line[k] [0]=x; //线段起点x坐标
line[k] (1]=hh-y; // 线段终点 y坐标
if (button==GLUT_LEFT_BUTTON66state==GLUT_UP)
line[k] [2]=x; //线段起点×坐标
line[k] [3]=hh-y; // 线段终点y 坐标
k++;
glutPostRedisplay();
//鼠标移动时获得鼠标移动中的坐标
}
void myMotion(int x,int y)
{
//get the line's motion point
line[k] [2]=x; 1/动态终点的×坐标
line[k] [3]=hh-y; // 动态终点的 y坐标
glutPostRedisplay();
//画线子程序
}
void drawlines ( )
{
for(int1.0;1<=K;1++)
glBegin(GL_LINES) ;
glVertex2f(line(i][0],line(1](1]) ;
glVertex2f(line(1)(2),line(1)[3]) ;
glEnd();
}
鼠标画线程序运行后,程序效果如实验图4-2所示。
实验代码:
#include "stdafx.h"
#include "shiyan4.h"
#include <iostream>
#include <GL/glut.h>
#define N 1000
int line[N][4], k = 0;
int ww, hh;
void myMouse(int button, int state, int x, int y);
void myMotion(int x, int y);
void myinit(void);
void Reshape(int w,int h);
void display(void);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = {"hello "," "};
int argc = 2;
glutInit(&argc, argv); //initialize glut library
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("Mouse draw line Showtime");
myinit();
glutDisplayFunc(display);
glutMouseFunc(myMouse);
glutMotionFunc(myMotion);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
void myinit(void)
{
glClearColor(0, 0, 0, 0);
glLineWidth(3.0);
}
void drawlines()
{
for (int i = 0; i <= k; i++)
{
glBegin(GL_LINES);
glVertex2f(line[i][0], line[i][1]);
glVertex2f(line[i][2], line[i][3]);
glEnd();
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
drawlines();
glutSwapBuffers();
}
void Reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluOrtho2D(0, w, 0, h);
ww = w;
hh = h;
}
void myMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
line[k][0] = x;
line[k][1] = hh - y;
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
line[k][2] = x;
line[k][3] = hh - y;
k++;
glutPostRedisplay();
}
}
void myMotion(int x, int y)
{
//get the line's motion point
line[k][2] = x;
line[k][3] = hh - y;
glutPostRedisplay();
}
实验结果:
- 鼠标绘制矩形。修改鼠标画线程序,要求:能够实现在绘制窗口用鼠标交互绘制若干矩形,鼠标左键首先按下确定矩形对角线的起始点,鼠标左键按下同时移动时看到画矩形过程,鼠标左键松开确定矩形对角线的另一点,可重复画多个矩形。如实验图4-3所示。
实验代码:
#include "stdafx.h"
#include "program4.h"
#include <iostream>
#include <GL/glut.h>
#define N 1000
int k = 0;
int ww, hh;
//int corner[N][4];
struct GLintPoint {
int x, y;
};
GLintPoint corner[N][2];
/*
x0 = corner[i][0].x
y0 = corner[i][0].y
x1 = corner[i][1].x
y1 = corner[i][1].y
*/
void myMouse(int button, int state, int x, int y);
void myMotion(int x, int y);
void myinit(void);
void Reshape(int w, int h);
void display(void);
void drawRects();
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[] = {"hello "," " };
int argc = 2;
glutInit(&argc, argv); //initialize glut library
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("Mouse draw Rectangle");
myinit();
glutDisplayFunc(display);
glutMouseFunc(myMouse);
glutMotionFunc(myMotion);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
void myinit(void) {
glClearColor(0, 0, 0, 0);
glLineWidth(3.0);
}
void drawRects() {
for (int i = 0; i <= k; i++) {
glBegin(GL_LINE_LOOP);
glVertex2f(corner[i][0].x, corner[i][0].y); //x0,y0
glVertex2f(corner[i][0].x, corner[i][1].y); //x0,y1
glVertex2f(corner[i][1].x, corner[i][1].y); //x1,y1
glVertex2f(corner[i][1].x, corner[i][0].y); //x1,y0
glEnd();
}
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
drawRects();
glutSwapBuffers();
}
void Reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluOrtho2D(0, w, 0, h);
ww = w;
hh = h;
}
void myMouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
corner[k][0].x = x; //x1
corner[k][0].y = hh - y; //y1
}
if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
corner[k][1].x = x; //x2
corner[k][1].y = hh - y; //y2
k++;
glutPostRedisplay();
}
}
void myMotion(int x, int y)
{
//get the line's motion point
corner[k][1].x = x;
corner[k][1].y = hh - y;
glutPostRedisplay();
}
实验结果:
图片传的比较慢没有传
计算机图形学实验四 OpenGL的鼠标交互绘制相关推荐
- 计算机图形学实验——二维卡通人物交互
计算机图形学实验1.2卡通人物交互 OpenGL卡通人物交互 基础"图元"绘制 OpenGL拾取物体 反走样 略提反走样问题 OpenGL实现二维反走样 放缩.旋转和拖动 小结 O ...
- 计算机图形学 | 实验四:绘制一个球体
计算机图形学 | 实验四:绘制一个球体 计算机图形学 | 实验四:绘制一个球体 封装Shader 为什么要封装Shader 如何使用 绘制球模型 球面顶点遍历 构造三角形图元 开启线框模式 开启面剔除 ...
- 计算机图形学第四次上机——鼠标回调图形界面交互实现
计算机图形学第四次上机实验 课程实验报告 目录 计算机图形学第四次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 3.1绘制曲线 3.2绘制曲面 3.3颜色 3.4鼠标回调 四.实验 ...
- 计算机图形学——实验四 纹理映射实验
实验四 纹理映射实验 实验项目性质:设计性实验 所属课程名称:计算机图形学A 实验计划学时:3学时 一.实验目的和要求 掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术. 二.实验原 ...
- 计算机图形学五角星c语言,计算机图形学实验——利用OpenGL函数绘制五角星
一.实验名称:五角星的绘制 二.实验目的:了解 OpenGL 程序设计结构,掌握编程环 三.境的设置,掌握绘制线段的方法. 四.实验内容: 1.在 VC++ 环境下 ,练习利用 OpenGL 绘制三角 ...
- 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】
一.实验内容.目的.要求 1.简单几何形体(三角形.多边形等)的平移.缩放.旋转等几何变换. 2.掌握相关算法的原理及实现 3.实现基础代码(非调用OpenGL等图形库): 缩放.旋转等能指定变换参考 ...
- 计算机图形学实验(OpenGL实现):Spinning Pinwheel
实验要求: 构建且渲染一个3D风车模型(如下图所例示).其中,三个叶片(包括中间的黄色三角形)在一个2D平面上,手柄在另外一个离相机更近的2D平面上.三个叶片.中心的三角形.手柄分别用不同的颜色显示. ...
- 深圳大学计算机图形学实验一——OpenGL绘制布布头像
尝试利用OpenGL绘制一些可爱的表情包. 一二布布是较为流行的一套萌系表情包.我选择绘制一二布布系列的一张表情包.这张表情包描绘了趴在窗户上的一只小棕熊布布. 表情包印在手机壳的样例如下: 头的绘制 ...
- 计算机图形学实验四——投影变换
这里写目录标题 一级目录 一级目录 [实验名称] 投影变换 [实验目的] 理解并掌握形体的投影变换的原理: [实验原理] 绘制一点透视图的变换矩阵: T= 1 0 0 0 0 1 0 0 0 0 ...
最新文章
- Python_赋值和深浅copy
- c++ 提取傅里叶描述子_Matlab | 提取图像ROI任意形状
- 再探文件输入和输出函数
- 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!
- tensorflow 进阶(三),BP神经网络之两层hidden_layer
- js输出一个菱形_Webpack 4入口、输出和ES6模块
- 让一个从未接触过电脑的人测试浏览器
- jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现
- 定时器2用做uart的波特率发生器
- 书法文化类毕业论文文献都有哪些?
- 解决Office 2003 Word无法正常启动
- Xilinx IDELAYCTRL
- 求职材料准备-入门导读
- HDU 5250 三阶魔方(模拟、置换)
- 【keil5】keil5仿真STM32设置
- imYun 一个Go+Vue编写简化打印店工作流程的系统【开源后端+小程序端】
- 基于计算机视觉盲点的视错觉验证码算法
- MAP地图采集制作学习路线
- 一文看懂中国的运营商入库认证(中国移动入库指南)
- 计算机屏幕灯,玩电脑必须要有的神器——屏幕挂灯