一、实验目的

1.掌握OpenGL的鼠标按钮响应函数。

2.掌握OpenGL的鼠标移动响应函数。

3.进一步巩固OpenGL的基本图元绘制基础。

二、实验内容

1.鼠标画草图——实现鼠标点到哪,线就画到哪。

思路:

1)在主程序注册鼠标响应和鼠标移动子函数:

glutMouseFunc(mymouse);

glutMotionFunc(mymotion);

放在display注册之后和mainloop之前。

  1. 在程序头部声明鼠标响应和鼠标移动子函数:
  2. void myMouse(int button,int state,int x,int y);
  3. void myMotion(int x,int y);
  4. 3)构造鼠标响应子函数:
  5. // 鼠标按钮响应事件
  6. void myMouse(int button,int state,int x,int y)
  7. {

//鼠标左键按下——确定起始点

//鼠标左键松开——画最后一个顶点,画线结束

}

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;

}

}

  1. 鼠标画线。阅读OpenGL鼠标画线程序,能够实现在绘制窗口用鼠标交互绘制若干条直线,鼠标左键首先按下确定直线的起始点,鼠标左键按下同时移动,看到画线过程,鼠标左键松开时确定直线的终点,可重复画多条直线。
  2. 思路:
  3. 1)写出画静止若干条直线程序框架,坐标用变量替代。
  4. 2)在主函数里注册鼠标按钮响应函数和鼠标移动响应函数。
  5. 3)在鼠标按钮响应子函数里给出鼠标按钮响应事件。
  6. 4)在鼠标移动响应子函数里给出鼠标移动响应事件。
  7. 5)读懂程序并分析程序,保留程序。
  8. //鼠标画线小程序
  9. #include"stdafx.h"
  10. #include <glut.h>
  11. idefine N 1000 // 线段最大条数
  12. int ww,hh; // 显示窗口宽和高
  13. int line(N)[4], k=0; //线段坐标存储数组,线段计数
  14. void Myinit(void);
  15. void Reshape(int w, int h);
  16. void myMouse(int button,int state,int x,int y)i
  17. void myMotion(int x,int y);
  18. void Display(void);
  19. voiddrawlines();
  20. int APIENTRY_tWinMain(HINSTANCE hInstance,
  21. HINSTANCE hPrevInstance,
  22. LPTSTR 1pCmdLine,
  23. 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();

}

实验结果:

  1. 鼠标绘制矩形。修改鼠标画线程序,要求:能够实现在绘制窗口用鼠标交互绘制若干矩形,鼠标左键首先按下确定矩形对角线的起始点,鼠标左键按下同时移动时看到画矩形过程,鼠标左键松开确定矩形对角线的另一点,可重复画多个矩形。如实验图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. 计算机图形学实验——二维卡通人物交互

    计算机图形学实验1.2卡通人物交互 OpenGL卡通人物交互 基础"图元"绘制 OpenGL拾取物体 反走样 略提反走样问题 OpenGL实现二维反走样 放缩.旋转和拖动 小结 O ...

  2. 计算机图形学 | 实验四:绘制一个球体

    计算机图形学 | 实验四:绘制一个球体 计算机图形学 | 实验四:绘制一个球体 封装Shader 为什么要封装Shader 如何使用 绘制球模型 球面顶点遍历 构造三角形图元 开启线框模式 开启面剔除 ...

  3. 计算机图形学第四次上机——鼠标回调图形界面交互实现

    计算机图形学第四次上机实验 课程实验报告 目录 计算机图形学第四次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 3.1绘制曲线 3.2绘制曲面 3.3颜色 3.4鼠标回调 四.实验 ...

  4. 计算机图形学——实验四 纹理映射实验

    实验四 纹理映射实验 实验项目性质:设计性实验 所属课程名称:计算机图形学A 实验计划学时:3学时 一.实验目的和要求 掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术. 二.实验原 ...

  5. 计算机图形学五角星c语言,计算机图形学实验——利用OpenGL函数绘制五角星

    一.实验名称:五角星的绘制 二.实验目的:了解 OpenGL 程序设计结构,掌握编程环 三.境的设置,掌握绘制线段的方法. 四.实验内容: 1.在 VC++ 环境下 ,练习利用 OpenGL 绘制三角 ...

  6. 【计算机图形学实验四——简单几何形体的平移、缩放、旋转等几何变换】

    一.实验内容.目的.要求 1.简单几何形体(三角形.多边形等)的平移.缩放.旋转等几何变换. 2.掌握相关算法的原理及实现 3.实现基础代码(非调用OpenGL等图形库): 缩放.旋转等能指定变换参考 ...

  7. 计算机图形学实验(OpenGL实现):Spinning Pinwheel

    实验要求: 构建且渲染一个3D风车模型(如下图所例示).其中,三个叶片(包括中间的黄色三角形)在一个2D平面上,手柄在另外一个离相机更近的2D平面上.三个叶片.中心的三角形.手柄分别用不同的颜色显示. ...

  8. 深圳大学计算机图形学实验一——OpenGL绘制布布头像

    尝试利用OpenGL绘制一些可爱的表情包. 一二布布是较为流行的一套萌系表情包.我选择绘制一二布布系列的一张表情包.这张表情包描绘了趴在窗户上的一只小棕熊布布. 表情包印在手机壳的样例如下: 头的绘制 ...

  9. 计算机图形学实验四——投影变换

    这里写目录标题 一级目录 一级目录 [实验名称] 投影变换 [实验目的] 理解并掌握形体的投影变换的原理: [实验原理] 绘制一点透视图的变换矩阵: T= 1  0 0 0 0  1 0 0 0  0 ...

最新文章

  1. Python_赋值和深浅copy
  2. c++ 提取傅里叶描述子_Matlab | 提取图像ROI任意形状
  3. 再探文件输入和输出函数
  4. 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!
  5. tensorflow 进阶(三),BP神经网络之两层hidden_layer
  6. js输出一个菱形_Webpack 4入口、输出和ES6模块
  7. 让一个从未接触过电脑的人测试浏览器
  8. jQuery幸运大转盘_jQuery+PHP抽奖程序的简单实现
  9. 定时器2用做uart的波特率发生器
  10. 书法文化类毕业论文文献都有哪些?
  11. 解决Office 2003 Word无法正常启动
  12. Xilinx IDELAYCTRL
  13. 求职材料准备-入门导读
  14. HDU 5250 三阶魔方(模拟、置换)
  15. 【keil5】keil5仿真STM32设置
  16. imYun 一个Go+Vue编写简化打印店工作流程的系统【开源后端+小程序端】
  17. 基于计算机视觉盲点的视错觉验证码算法
  18. MAP地图采集制作学习路线
  19. 一文看懂中国的运营商入库认证(中国移动入库指南)
  20. 计算机屏幕灯,玩电脑必须要有的神器——屏幕挂灯

热门文章

  1. Python3 心路历程
  2. 21、关于破解点触的验证码
  3. 回到1996,一起领略 JavaBeans 的真正力量
  4. Python爬取全球是最大的电影数据库网站IMDb数据
  5. NLP面试题目汇总11-15
  6. 自动驾驶、无人驾驶、车联网笔记分享
  7. Apache Kylin(一)
  8. php如何删除文件夹里的图片,php如何删除文件夹
  9. 云骞开源即时通讯软件
  10. python机器学习:决策树详解