五角星自由变换和移动 & 结构体数组初始化 & DIRECTION
2016-05-02 19:35
316 查看
图形学课堂作业
// 五角星运动方向 #include <GL/glut.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <math.h> #include <time.h> #include <iostream> using namespace std; int wWidth, wHeight; int rtheta, movex = 0, movey = 0; int len_star = 100; float scale = 1, dscale = 0.1; const double PI = acos(-1.0); typedef struct tagDIRECTION { int x_offset; int y_offset; } DIRECTION; // DIRECTION direction_8[] = { { -10, 0}, { -10, 10}, {0, 10}, {10, 10}, {10, 0}, {10, -10}, {0, -10}, { -10, -10} }; DIRECTION direction_8[] = { { -10, 0}, {10, 10}, { -10, -10}, {10, 0}, { -10, 10}, {0, -10}, {0, 10}, {10, -10}}; int idx_dir = 0; int idx_circle = 3; int R = 25; int circle_x = 0, circle_y = 0; typedef struct { int x; int y; } Point; typedef struct { float R; float G; float B; } RGB; // glColor3f(); // RGB *rgb = new RGB; void myDraw(Point point, RGB rgb, float Length, float theta) { // glColor3ub(255, 0, 0); glColor3f(rgb.R, rgb.G, rgb.B); glBegin(GL_LINE_LOOP); float Short = Length * sin(0.1 * PI) / sin(0.7 * PI); float beta = 18 + theta; //五角星NE的长半径和x轴的夹角 float p1[2]; glColor3f(1.0, 0.0, 0.0); for (int i = 0; i < 5; i++) //从最右边的那个长边顶点开始画 { p1[0] = Length * cos(i * 2 * 0.2 * PI + beta * 3.1415926 / 180.0) + point.x; //x坐标 18 * 3.1415926 = 56.55 p1[1] = Length * sin(i * 2 * 0.2 * PI + beta * 3.1415926 / 180.0) + point.y; //y坐标 glVertex2fv(p1); p1[0] = Short * cos((i * 2 + 1) * 0.2 * PI + beta * 3.1415926 / 180.0) + point.x; p1[1] = Short * sin((i * 2 + 1) * 0.2 * PI + beta * 3.1415926 / 180.0) + point.y; glVertex2fv(p1); } glEnd(); // glPushMatrix(); // glLoadIdentity(); // // 绘制坐标系 // glBegin(GL_LINES); // glVertex2i(0, -wHeight / 2 + 5); // glVertex2i(0, wHeight / 2 - 5); // glVertex2i(wWidth / 2 - 5, 0); // glVertex2i(-wWidth / 2 + 5, 0); // glEnd(); // glPopMatrix(); } void drawCircle() { glBegin(GL_POLYGON); glColor3f(0, 1, 0); for (float i = 0; i < 360; i += 0.1) { glVertex2f(R * cos(i * PI / 180), R * sin(i * PI / 180)); } glEnd(); } void display() { glClearColor(0, 1, 1, 0); glClear(GL_COLOR_BUFFER_BIT); Point point = {0, 0}; RGB rgb = {1, 0, 0}; myDraw(point, rgb, len_star, 0); //题目要求画一个小圆,沿任意方向运动 glPushMatrix(); glLoadIdentity(); circle_x += direction_8[idx_circle].x_offset; circle_y += direction_8[idx_circle].y_offset; if (circle_x + R > wWidth / 2 || circle_x - R < (-wWidth / 2) || circle_y + R > wHeight / 2 || circle_y - R < (-wHeight / 2)) { circle_x -= direction_8[idx_circle].x_offset; circle_y -= direction_8[idx_circle].y_offset; int ii = rand() % 8; idx_circle = ii; } cout << circle_x << " " << circle_y << endl; glTranslatef(circle_x, circle_y, 0); drawCircle(); glPopMatrix(); glFlush(); glutSwapBuffers(); } void change() { // 改变方向 movex += direction_8[idx_dir].x_offset; movey += direction_8[idx_dir].y_offset; if ((movex + len_star) > (wWidth / 2) || (movex - len_star) < (-(wWidth / 2)) || (movey + len_star) > (wHeight / 2) || (movey - len_star) < (-(wHeight / 2))) { movex -= direction_8[idx_dir].x_offset; movey -= direction_8[idx_dir].y_offset; idx_dir += 1; idx_dir %= 8; // return; } // cout << idx_dir << endl; // 改变旋转方向 rtheta += 10; rtheta %= 360; // 改变大小 scale += dscale; if (scale > 2 || scale < 0.5) dscale = -dscale; // cout << movex << " " << movey << endl; // cout << wWidth << " " << wHeight << endl; glTranslatef (movex, movey, 0.0); glRotatef (rtheta, 0.0, 0.0, 1.0); glScalef(scale, scale, 0); display(); usleep(100000); glLoadIdentity(); } void myReshape(GLsizei w, GLsizei h) { wWidth = w; wHeight = h; glMatrixMode (GL_PROJECTION); glLoadIdentity (); // cout << w << " " << h << " " << endl; gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2); // gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glViewport (0, 0, w, h); } int main(int argc, char* argv[]) //main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(300, 300); glutInitWindowSize(900, 900); glutCreateWindow("example"); srand(time(NULL)); glutDisplayFunc(display); glutReshapeFunc(myReshape); glutIdleFunc(change); glutMainLoop(); return 0; }
相关文章推荐
- BestCoder Round #82 (div.2)
- “不给力啊,老湿!”:RSA加密与破解
- 自然语言处理中N-Gram模型的Smoothing算法
- Docker的基本组成
- 设计案例3----利用存储过程和JOB 设计从餐饮ERP数据库将数据抽取、数据清洗到BI数据库
- Android:日常踩坑——Failed to retrieve available cloud devices! Please try again later.
- Python第四章-字典
- Sort List
- 代码实现系统的autoLayout布局
- Getting started with SciPy for .NET
- iOS开发中,tintColor和 backgroundColor的区别
- C++11新特性
- nyoj1235
- 机器学习(五)--- FTRL一路走来,从LR -> SGD -> TG -> FOBOS -> RDA -> FTRL
- request,response 乱码问题
- C++ Virtual详解
- 扫描线填充算法 & 指针操作要注意的地方
- Qt JSON数据解析和存储详解
- EasyChair提交会议论文的方法简介
- Oracle 10g 使用REGEXP_SUBSTR 分拆字符串