#include <cmath>
#include "glut.h"
#include "iostream"
using namespace std; void init(void)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
cout << "init.." << endl;
glLineWidth(1.0f);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);//设置投影矩阵
glLoadIdentity();
gluOrtho2D(0.0, 600.0, 0.0, 600.0);//二维视景区域 左下角为原点 //glClear(GL_COLOR_BUFFER_BIT);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity(); } int dir = 0;
int angle = 0;
// 绘制车轮
void DrawWheel(double x, double y, double r)
{
int sec = 10;
for (int i = 0; i <= sec; i++)
{
double delta = 3.1415926*2.0 / sec;
glBegin(GL_LINE_LOOP);
glVertex2f(x, y);
glVertex2f(x + r * cos(delta*i), y + r * sin(delta*i));
glVertex2f(x + r * cos(delta*(i + 1)), y + r * sin(delta*(i + 1)));
glEnd();
} } //绘制自行车
void DrawBike() {
glClear(GL_COLOR_BUFFER_BIT);//清除窗口显示内容
glColor3f(1.0f, 0.0f, 0); glPushMatrix();
glTranslatef(100+dir, 124, 0);
// 横车杆
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(100,0);
// 竖车杆
glVertex2f(70, 0);
glVertex2f(70, 30);
// 车把
glVertex2f(60, 30);
glVertex2f(80, 30);
glEnd();
glPopMatrix(); // 前车轮
glPushMatrix();
glTranslatef(100+dir, 100, 0);
glRotatef(angle, 0, 0, 1);
DrawWheel(0,0,25);
glPopMatrix(); // 后车轮
glPushMatrix();
glTranslatef(200+dir, 100, 0);
glRotatef(angle, 0, 0, 1);
DrawWheel(0, 0, 25);;
glPopMatrix(); glBegin(GL_LINES);
glVertex2f(0, 75);
glVertex2f(600, 75);
glEnd();
glutSwapBuffers();
} void keyboard(unsigned char key, int x, int y)
{
if (key == 'a')// 向左平移
{
cout << "左移" << endl;
dir -= 10;
angle += 10;
glutPostRedisplay();//重绘窗口
}
if (key == 'd')// 向右平移
{
cout << "右移" << endl;
dir += 10;
angle -= 10;
glutPostRedisplay();//重绘窗口
}
} void main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(300, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("lab5"); glutDisplayFunc(DrawBike);
init(); glutKeyboardFunc(keyboard);
glutMainLoop(); }

[opengl] 画一个可移动的自行车 二维几何变换(平移、旋转、缩放)的更多相关文章

  1. VS2008集成QT的OpenGL开发(实现二维图形的旋转)

    主要是利用Qt中的定时器实现了二维图形的旋转功能: #ifndef QGLTEST_H #define QGLTEST_H #include <QGLWidget> #include &l ...

  2. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  3. Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)

    因为面试时问了我这道题,导致我想去了解信号槽到底是如何实现的,于是贴着顺序看了下源码,大致了解了整个框架.网上关于信号槽的文章也很多,但是大部分都是将如何应用的,这里我就写一下我所理解的如何实现吧, ...

  4. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  5. 功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素。

    功能要求:定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素 names={{"tom","jack","mike&qu ...

  6. 剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组

    int [][] array ={ {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,19} }; 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都 ...

  7. OpenGL——二维几何变换

    平移.旋转.缩放的实现 #include<iostream> #include <math.h> #include<Windows.h> #include < ...

  8. 【转载】ArcBall二维控制三维旋转

    原文:http://oviliazhang.diandian.com/post/2012-05-19/40027878859 由于目前大多的显示器是二维的,要控制三维物体的旋转就显得不那么直接了.Ar ...

  9. OpenGL 画出雷达动态扫描效果(二) 非底图

    OpenGL 画出雷达动态扫描效果(一)中给出了已一张图片作为底图的雷达扫面程序 如果有漂亮的雷达底图的话,效果应该非常不错的,另外也可以直接手绘雷达框架 效果如下 雷达主体代码 glLineWidt ...

随机推荐

  1. 移动Web - 响应式布局开篇

    用到的工具: FireFox浏览器 Sublime Text 2 响应式布局定义: 2010年,Ethan Marcotte提出,可查看原文: 通俗地讲就是:百份比布局,根据不同设备显示不同布局: 这 ...

  2. Windows Phone8.1系统新特性

    Windows Phone 8.1 beta SDK已经为大家透露了不少WP8.1系统的新特性,不过这些新特性还不能保证在最终的消费者版本中都有所体现,毕竟它还仅是SDK版本.日前,国外媒体WPCen ...

  3. C语言实现常用查找算法——二分查找

    #include<stdio.h> void insert_sort(int a[],int n); int binary_search(int a[],int x,int n); voi ...

  4. Adboe Flash远程代码执行_CVE-2018-4878漏洞复现

    Adboe Flash远程代码执行_CVE-2018-4878漏洞复现 一.漏洞描述 该漏洞可针对windows用户发起定向攻击.攻击者可以诱导用户打开包含恶意Flash代码文件的Microsoft ...

  5. KVM虚拟机迁移至VMware

    1.将kvm下虚拟机关机: [root@localhost ~]# virsh list --all Id Name State ----------------------------------- ...

  6. 浅谈Invoke 和 BegionInvoke的用法

    很多人对Invoke和BeginInvoke理解不深刻,不知道该怎么应用,在这篇博文里将详细阐述Invoke和BeginInvoke的用法: 首先说下Invoke和BeginInvoke有两种用法: ...

  7. smobiler介绍(一)

    如果说基于.net的移动开发平台,不得不自我推荐下smobiler,不用学习另外一套开发模式或者搭建复杂的开发环境,smobiler能够让大家像开发传统windows一样去开发移动应用,那么列举一下平 ...

  8. [apue] 多进程管道读写的一些疑问

    对于一对一的pipe: 1) 写进程关闭写管道后,读进程继续读管道会导致read返回0: 2) 读进程关闭读管道后,写进程继续写管道会激发SIGPIPE信号,若捕获,则write返回-1: 而对于多对 ...

  9. nginx反向代理中神奇的斜线

    nginx反向代理中神奇的斜线 在进行nginx反向代理配置的时候,location和proxy_pass中的斜线会造成各种困扰,有时候多一个或少一个斜线,就会造成完全不同的结果,所以特地将locat ...

  10. java-NIO-概念

    现在使用NIO的场景越来越多,很多网上的技术框架或多或少的使用NIO技术,譬如Tomcat,Jetty 一.概述 NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selec ...