#include<gl/glut.h>
#include<gl/GL.h>
#include<gl/GLU.h>
#include<math.h>
#include<iostream>
#define R 100
#define r 50
#define PI 3.1415926
double a1[5], b1[5], a2[5], b2[5];
double Height = 320;
double Width = 400;
void Calculate() {
    int angle = 70;
    for (int i = 0; i < 5; i++) {
        a1[i] = R*cos(angle*PI / 180);
        b1[i] = R*sin(angle*PI / 180);
        a2[i] = r*cos(PI / 5 + angle*PI / 180);
        b2[i] = r*sin(PI / 5 + angle*PI / 180);
        angle += 72;
    }
}
void Init() {
    Calculate();
}
double target = 0.00;
double theta = 0.00;
bool right = true;
bool left = true;
bool top = true;
bool bottom = true;
int count = 0;
double sc = 1;
bool scflg1 =true;
bool scflg2 = true;

void draw() {
    
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0, 0, 0, 0);
    gluOrtho2D(-450, 450, -300, 300);//左右下上
    //glPushMatrix();
    /*
     glTranslatef(0.0f,-20.0f,-40.0f)表示将当前图形向x轴平移0,向y轴平移-20,向z轴平移-40
     glScaled(10.0f,10.0f,10.0f)表示将当前图形沿x,y,z轴分别放大为原来的10倍
    glRotatef(-80.0f,10.0f,1.0f,0.0f)表示将当前图形沿方向向量(-10,1,0)顺时针旋转80度。
    */
    //glPopMatrix();
        
    //glPushMatrix();
    if (target < Width-60 && right&&target<Height-100) {//平移到最右边
        target += 0.5;
    }
    else if(target>-Width+160 && left&&Height>-Height+150) {//到最右边返回到最左边
        right = false;
        target -= 0.5;
        
    }
    else {
        right = true;
    }
    glTranslated(target, target, 0);

glRotated(theta, 0, 0, 1);
    theta += 0.2;

if ( count <= 150 && scflg1) {
        scflg2 = false;
        sc += 0.001;
        count++;
        if (count == 151) {
            scflg2 = true;
        }
        std::cout << sc << " " << count << std::endl;
    }
    else if (scflg2) {
        scflg1 = false;
        sc -= 0.001;
        count--;
        if (count == -151) {
            scflg1 = true;
        }
    }

glScalef(sc, sc, 1);
    glBegin(GL_LINE_LOOP);
    for (int i = 0;i < 5;i++) {
        glVertex2d(a1[i], b1[i]);
        glVertex2d(a2[i], b2[i]);    
    }
    glEnd();
    //glPopMatrix();
    //glFlush();
    //glutSwapBuffers();

//glLoadIdentity();
    glColor3d(1, 1, 0);
    glFlush();
    glutSwapBuffers();//调换前后缓存
}

void DisPlay()
{   glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);//白色背景
    draw();
}

void main()
{
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(900, 600);
    glutCreateWindow("第四次作业");
    
    Init();
    glutDisplayFunc(DisPlay);
    glutIdleFunc(DisPlay);
    glutMainLoop();
    system("pause");
}

OpenGL画图旋转的更多相关文章

  1. OpenGL中旋转平移缩放等变换的顺序对模型的影响

    l 前提: 0x01. 假设绘制顶点的语句为Draw Array,变换的语句(旋转.平移.缩放)为M,而 M0; M1; M2; Draw Array; 则称对Array先进行M2再进行M1.M0 0 ...

  2. opengl笔记——旋转,一段代码的理解

    重看:opengl笔记——OpenGL好资料备忘 在找到这段代码,对理解opengl旋转很有帮助 ... glPushMatrix(); // initialze ModelView matrix g ...

  3. OPENGL画图类库

    链接  https://www.opengl.org/wiki/Language_bindings http://blog.csdn.net/luozhuang/article/details/421 ...

  4. OpenGL 3D旋转的木箱

    学习自: https://learnopengl-cn.github.io/01%20Getting%20started/08%20Coordinate%20Systems/#3d 0,首先添加glm ...

  5. Android平台下OpenGL初步

    Android OpenGL ES 开发教程 从入门到精通 http://blog.csdn.net/zhoudailiang/article/details/50176143 http://blog ...

  6. Android平台下OpenGL图形编程

    ref: Jayway Team Blog中OpenGL ES简明开发教程https://blog.jayway.com/tag/opengl-es/ OpenGL ES 开发教程http://www ...

  7. [转帖]Android平台下OpenGL初步

    原文请看 Android平台下OpenGL初步 本文只关注于如何一步步实现在Android平台下运用OpenGl. 1.GLSurfaceView GLSurfaceView是Android应用程序中 ...

  8. [置顶] 使用Android OpenGL ES 2.0绘图之五:添加运动

    传送门 ☞ 系统架构设计 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 传送门 ☞ GoF23种设计模式 ☞ 转载请注明 ☞ http://blog.csd ...

  9. HTML5 canvas画图

    HTML5 canvas画图 HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript).不过,<canvas> 元素本身并没有绘制能力(它仅仅是 ...

随机推荐

  1. 「Poetize7」Freda的访客

    描述 Description 小猫们看到蛋糕比饼干大之后,普遍认为蛋糕比饼干要好>.<.所以,如果Freda 给了第i 只小猫蛋糕且这个小猫是第一个吃到蛋糕的,那么就必须给第i+2,i+4 ...

  2. 数学概念——F 概率(经典问题)birthday paradox

    F - 概率(经典问题) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  3. ScrollView自动滑到底部

    // 自动滑动到底部 mScrollView.post(new Runnable() { @Override public void run() { mScrollView.fullScroll(Sc ...

  4. 关于 NoSQL 数据库你应该了解的 10 件事

    四分之一个世纪以来,关系型数据库(RDBMS)一直是主流数据库模型.但是现在非关系型数据库,“云”或者“NoSQL”数据库,正在作为一种替代数据库模型获得越来越多的占有率.本文中我们将关注非关系型 N ...

  5. 20个高级Java面试题

    这是一个高级Java面试系列题中的第一部分.这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题. 程序员面试指南:https://www.youtube.com/ ...

  6. 【bzoj2594】[Wc2006]水管局长数据加强版

    真是神题 当时调了几天没调出来 后来没管了 当时把fread去掉就TLE,加上就RE 一直在底下跟网上的程序拍,尝试各种优化常数都没用 拍出几组不一样的,发现我是对的,醉了,网上那个是怎么过的 记一下 ...

  7. 技术型创业者easy遇到的三大问题

    关于创业这事儿.由于经历的事情实在是太多了,所以真是想到哪儿写到哪儿. 这一篇算是<杂记>的番外篇.我今天想说的东西太多了,实在是非常想和很多其它人讨论讨论关于创业的事情. 这样的感觉就像 ...

  8. STL——前闭后开区间表示法和function call 操作符

    前开后闭开区间表示法[) 任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标示的区间,用以表示操作范围,这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示,也就是说,整 ...

  9. MongoDB C++ 2.4.5 driver 编译安装问题

    安装参考前文,http://blog.csdn.net/sheismylife/article/details/8794589 方法一致.只不过这次在GCC4.8.1上编译. scons instal ...

  10. 第四节:教你如何快速让浏览器兼容ES6特性

    写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...