stars.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:9k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1994. */
  2. /**
  3.  * (c) Copyright 1993, Silicon Graphics, Inc.
  4.  * ALL RIGHTS RESERVED 
  5.  * Permission to use, copy, modify, and distribute this software for 
  6.  * any purpose and without fee is hereby granted, provided that the above
  7.  * copyright notice appear in all copies and that both the copyright notice
  8.  * and this permission notice appear in supporting documentation, and that 
  9.  * the name of Silicon Graphics, Inc. not be used in advertising
  10.  * or publicity pertaining to distribution of the software without specific,
  11.  * written prior permission. 
  12.  *
  13.  * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
  14.  * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
  16.  * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
  17.  * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
  18.  * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
  19.  * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
  20.  * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
  21.  * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
  22.  * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
  23.  * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
  24.  * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
  25.  * 
  26.  * US Government Users Restricted Rights 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
  29.  * (c)(1)(ii) of the Rights in Technical Data and Computer Software
  30.  * clause at DFARS 252.227-7013 and/or in similar or successor
  31.  * clauses in the FAR or the DOD or NASA FAR Supplement.
  32.  * Unpublished-- rights reserved under the copyright laws of the
  33.  * United States.  Contractor/manufacturer is Silicon Graphics,
  34.  * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
  35.  *
  36.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  37.  */
  38. #include <stdio.h>
  39. #include <string.h>
  40. #include <stdlib.h>
  41. #include <math.h>
  42. #include <time.h>
  43. #include <GL/glut.h>
  44. extern void *__glutCurrentWindow;
  45. /* Some <math.h> files do not define M_PI... */
  46. #ifndef M_PI
  47. #define M_PI 3.14159265358979323846
  48. #endif
  49. enum {
  50.   NORMAL = 0,
  51.   WEIRD = 1
  52. };
  53. enum {
  54.   STREAK = 0,
  55.   CIRCLE = 1
  56. };
  57. #define MAXSTARS 400
  58. #define MAXPOS 10000
  59. #define MAXWARP 10
  60. #define MAXANGLES 6000
  61. typedef struct _starRec {
  62.   GLint type;
  63.   float x[2], y[2], z[2];
  64.   float offsetX, offsetY, offsetR, rotation;
  65. } starRec;
  66. GLenum doubleBuffer;
  67. GLint windW = 300, windH = 300;
  68. GLenum flag = NORMAL;
  69. GLint starCount = MAXSTARS / 2;
  70. float speed = 1.0;
  71. GLint nitro = 0;
  72. starRec stars[MAXSTARS];
  73. float sinTable[MAXANGLES];
  74. float
  75. Sin(float angle)
  76. {
  77.   return (sinTable[(int) angle % MAXANGLES]);
  78. }
  79. float
  80. Cos(float angle)
  81. {
  82.   return (sinTable[((int) angle + (MAXANGLES / 4)) % MAXANGLES]);
  83. }
  84. void
  85. NewStar(GLint n, GLint d)
  86. {
  87.   if (rand() % 4 == 0) {
  88.     stars[n].type = CIRCLE;
  89.   } else {
  90.     stars[n].type = STREAK;
  91.   }
  92.   stars[n].x[0] = (float) (rand() % MAXPOS - MAXPOS / 2);
  93.   stars[n].y[0] = (float) (rand() % MAXPOS - MAXPOS / 2);
  94.   stars[n].z[0] = (float) (rand() % MAXPOS + d);
  95.   stars[n].x[1] = stars[n].x[0];
  96.   stars[n].y[1] = stars[n].y[0];
  97.   stars[n].z[1] = stars[n].z[0];
  98.   if (rand() % 4 == 0 && flag == WEIRD) {
  99.     stars[n].offsetX = (float) (rand() % 100 - 100 / 2);
  100.     stars[n].offsetY = (float) (rand() % 100 - 100 / 2);
  101.     stars[n].offsetR = (float) (rand() % 25 - 25 / 2);
  102.   } else {
  103.     stars[n].offsetX = 0.0;
  104.     stars[n].offsetY = 0.0;
  105.     stars[n].offsetR = 0.0;
  106.   }
  107. }
  108. void
  109. RotatePoint(float *x, float *y, float rotation)
  110. {
  111.   float tmpX, tmpY;
  112.   tmpX = *x * Cos(rotation) - *y * Sin(rotation);
  113.   tmpY = *y * Cos(rotation) + *x * Sin(rotation);
  114.   *x = tmpX;
  115.   *y = tmpY;
  116. }
  117. void
  118. MoveStars(void)
  119. {
  120.   float offset;
  121.   GLint n;
  122.   offset = speed * 60.0;
  123.   for (n = 0; n < starCount; n++) {
  124.     stars[n].x[1] = stars[n].x[0];
  125.     stars[n].y[1] = stars[n].y[0];
  126.     stars[n].z[1] = stars[n].z[0];
  127.     stars[n].x[0] += stars[n].offsetX;
  128.     stars[n].y[0] += stars[n].offsetY;
  129.     stars[n].z[0] -= offset;
  130.     stars[n].rotation += stars[n].offsetR;
  131.     if (stars[n].rotation >= MAXANGLES) {
  132.       stars[n].rotation = 0.0;
  133.     }
  134.   }
  135. }
  136. GLenum
  137. StarPoint(GLint n)
  138. {
  139.   float x0, y0;
  140.   x0 = stars[n].x[0] * windW / stars[n].z[0];
  141.   y0 = stars[n].y[0] * windH / stars[n].z[0];
  142.   RotatePoint(&x0, &y0, stars[n].rotation);
  143.   x0 += windW / 2.0;
  144.   y0 += windH / 2.0;
  145.   if (x0 >= 0.0 && x0 < windW && y0 >= 0.0 && y0 < windH) {
  146.     return GL_TRUE;
  147.   } else {
  148.     return GL_FALSE;
  149.   }
  150. }
  151. void
  152. ShowStar(GLint n)
  153. {
  154.   float x0, y0, x1, y1, width;
  155.   GLint i;
  156.   x0 = stars[n].x[0] * windW / stars[n].z[0];
  157.   y0 = stars[n].y[0] * windH / stars[n].z[0];
  158.   RotatePoint(&x0, &y0, stars[n].rotation);
  159.   x0 += windW / 2.0;
  160.   y0 += windH / 2.0;
  161.   if (x0 >= 0.0 && x0 < windW && y0 >= 0.0 && y0 < windH) {
  162.     if (stars[n].type == STREAK) {
  163.       x1 = stars[n].x[1] * windW / stars[n].z[1];
  164.       y1 = stars[n].y[1] * windH / stars[n].z[1];
  165.       RotatePoint(&x1, &y1, stars[n].rotation);
  166.       x1 += windW / 2.0;
  167.       y1 += windH / 2.0;
  168.       glLineWidth(MAXPOS / 100.0 / stars[n].z[0] + 1.0);
  169.       glColor3f(1.0, (MAXWARP - speed) / MAXWARP, (MAXWARP - speed) / MAXWARP);
  170.       if (fabs(x0 - x1) < 1.0 && fabs(y0 - y1) < 1.0) {
  171.         glBegin(GL_POINTS);
  172.         glVertex2f(x0, y0);
  173.         glEnd();
  174.       } else {
  175.         glBegin(GL_LINES);
  176.         glVertex2f(x0, y0);
  177.         glVertex2f(x1, y1);
  178.         glEnd();
  179.       }
  180.     } else {
  181.       width = MAXPOS / 10.0 / stars[n].z[0] + 1.0;
  182.       glColor3f(1.0, 0.0, 0.0);
  183.       glBegin(GL_POLYGON);
  184.       for (i = 0; i < 8; i++) {
  185.         float x = x0 + width * Cos((float) i * MAXANGLES / 8.0);
  186.         float y = y0 + width * Sin((float) i * MAXANGLES / 8.0);
  187.         glVertex2f(x, y);
  188.       };
  189.       glEnd();
  190.     }
  191.   }
  192. }
  193. void
  194. UpdateStars(void)
  195. {
  196.   GLint n;
  197.   glClear(GL_COLOR_BUFFER_BIT);
  198.   for (n = 0; n < starCount; n++) {
  199.     if (stars[n].z[0] > speed || (stars[n].z[0] > 0.0 && speed < MAXWARP)) {
  200.       if (StarPoint(n) == GL_FALSE) {
  201.         NewStar(n, MAXPOS);
  202.       }
  203.     } else {
  204.       NewStar(n, MAXPOS);
  205.     }
  206.   }
  207. }
  208. void
  209. ShowStars(void)
  210. {
  211.   GLint n;
  212.   glClear(GL_COLOR_BUFFER_BIT);
  213.   for (n = 0; n < starCount; n++) {
  214.     if (stars[n].z[0] > speed || (stars[n].z[0] > 0.0 && speed < MAXWARP)) {
  215.       ShowStar(n);
  216.     }
  217.   }
  218. }
  219. static void
  220. Init(void)
  221. {
  222.   float angle;
  223.   GLint n;
  224.   srand((unsigned int) time(NULL));
  225.   for (n = 0; n < MAXSTARS; n++) {
  226.     NewStar(n, 100);
  227.   }
  228.   angle = 0.0;
  229.   for (n = 0; n < MAXANGLES; n++) {
  230.     sinTable[n] = sin(angle);
  231.     angle += M_PI / (MAXANGLES / 2.0);
  232.   }
  233.   glClearColor(0.0, 0.0, 0.0, 0.0);
  234.   glDisable(GL_DITHER);
  235. }
  236. void
  237. Reshape(int width, int height)
  238. {
  239.   windW = width;
  240.   windH = height;
  241.   glViewport(0, 0, windW, windH);
  242.   glMatrixMode(GL_PROJECTION);
  243.   glLoadIdentity();
  244.   gluOrtho2D(-0.5, windW + 0.5, -0.5, windH + 0.5);
  245.   glMatrixMode(GL_MODELVIEW);
  246. }
  247. /* ARGSUSED1 */
  248. static void
  249. Key(unsigned char key, int x, int y)
  250. {
  251.   switch (key) {
  252.   case ' ':
  253.     flag = (flag == NORMAL) ? WEIRD : NORMAL;
  254.     break;
  255.   case 't':
  256.     nitro = 1;
  257.     break;
  258.   case 27:
  259.     exit(0);
  260.   }
  261. }
  262. void
  263. Idle(void)
  264. {
  265.   MoveStars();
  266.   UpdateStars();
  267.   if (nitro > 0) {
  268.     speed = (float) (nitro / 10) + 1.0;
  269.     if (speed > MAXWARP) {
  270.       speed = MAXWARP;
  271.     }
  272.     if (++nitro > MAXWARP * 10) {
  273.       nitro = -nitro;
  274.     }
  275.   } else if (nitro < 0) {
  276.     nitro++;
  277.     speed = (float) (-nitro / 10) + 1.0;
  278.     if (speed > MAXWARP) {
  279.       speed = MAXWARP;
  280.     }
  281.   }
  282.   glutPostRedisplay();
  283. }
  284. void
  285. Display(void)
  286. {
  287.   ShowStars();
  288.   if (doubleBuffer) {
  289.     glutSwapBuffers();
  290.   } else {
  291.     glFlush();
  292.   }
  293. }
  294. void
  295. Visible(int state)
  296. {
  297.   if (state == GLUT_VISIBLE) {
  298.     glutIdleFunc(Idle);
  299.   } else {
  300.     glutIdleFunc(NULL);
  301.   }
  302. }
  303. static void
  304. Args(int argc, char **argv)
  305. {
  306.   GLint i;
  307.   doubleBuffer = GL_TRUE;
  308.   for (i = 1; i < argc; i++) {
  309.     if (strcmp(argv[i], "-sb") == 0) {
  310.       doubleBuffer = GL_FALSE;
  311.     } else if (strcmp(argv[i], "-db") == 0) {
  312.       doubleBuffer = GL_TRUE;
  313.     }
  314.   }
  315. }
  316. int
  317. main(int argc, char **argv)
  318. {
  319.   GLenum type;
  320.   glutInitWindowSize(windW, windH);
  321.   glutInit(&argc, argv);
  322.   Args(argc, argv);
  323.   type = GLUT_RGB;
  324.   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  325.   glutInitDisplayMode(type);
  326.   glutCreateWindow("Stars");
  327.   Init();
  328.   glutReshapeFunc(Reshape);
  329.   glutKeyboardFunc(Key);
  330.   glutVisibilityFunc(Visible);
  331.   glutDisplayFunc(Display);
  332.   glutMainLoop();
  333.   return 0;             /* ANSI C requires main to return int. */
  334. }