📄 lorenz.c
字号:
glScalef(CUBESCALE, CUBESCALE, CUBESCALE); draw_hexplane(); glPopMatrix(); glColor3f(0.6, 0.2, 0.2); /* x-z plane, translate low */ glPushMatrix(); glRotatef(90, 1.0, 0.0, 0.0); glTranslatef(cubeoffx, cubeoffz - CUBESIDE, -cubeoffy + CUBESIDE); glScalef(CUBESCALE, CUBESCALE, CUBESCALE); draw_hexplane(); glPopMatrix(); /* x-z plane, translate high */ glPushMatrix(); glRotatef(90, 1.0, 0.0, 0.0); glTranslatef(cubeoffx, cubeoffz - CUBESIDE, -cubeoffy - CUBESIDE); glScalef(CUBESCALE, CUBESCALE, CUBESCALE); draw_hexplane(); glPopMatrix(); glColor3f(0.2, 0.6, 0.2); /* y-z plane, translate low */ glPushMatrix(); glRotatef(90, 0.0, 1.0, 0.0); glTranslatef(-cubeoffz + CUBESIDE, cubeoffy, cubeoffx + CUBESIDE); glScalef(CUBESCALE, CUBESCALE, CUBESCALE); draw_hexplane(); glPopMatrix(); /* y-z plane, translate high */ glPushMatrix(); glRotatef (90, 0.0, 1.0, 0.0); glTranslatef(-cubeoffz + CUBESIDE, cubeoffy, cubeoffx - CUBESIDE); glScalef(CUBESCALE, CUBESCALE, CUBESCALE); draw_hexplane(); glPopMatrix(); glFlush(); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST);}float hex_data[8][3] = { {0., 0., 0.}, {1.155, 0., 0.}, {0.577, 1., 0.}, {-0.577, 1., 0.}, {-1.155, 0., 0.}, {-0.577, -1., 0.}, {0.577, -1., 0.}, {1.155, 0., 0.},};/* draws a hexagon 2 units across, in the x-y plane, *//* centered at <0, 0, 0> */void draw_hexagon(void){ if(wflag) { glPushMatrix(); glRotatef(a, 0.0, 0.0, 1.0); } glBegin(GL_TRIANGLE_FAN); glVertex3fv(hex_data[0]); glVertex3fv(hex_data[1]); glVertex3fv(hex_data[2]); glVertex3fv(hex_data[3]); glVertex3fv(hex_data[4]); glVertex3fv(hex_data[5]); glVertex3fv(hex_data[6]); glVertex3fv(hex_data[7]); glEnd(); if(wflag) glPopMatrix();}void tmp_draw_hexplane(void){ glRectf(-2.0, -2.0, 2.0, 2.0);}/* draw 7 hexagons */void draw_hexplane(void){ if(wflag) { glPushMatrix(); glRotatef(-0.5*a, 0.0, 0.0, 1.0); } /* center , <0, 0, 0> */ draw_hexagon(); /* 12 o'clock, <0, 4, 0> */ glTranslatef(0., 4., 0.); draw_hexagon(); /* 10 o'clock, <-3.464, 2, 0> */ glTranslatef(-3.464, -2., 0.); draw_hexagon(); /* 8 o'clock, <-3.464, -2, 0> */ glTranslatef(0., -4., 0.); draw_hexagon(); /* 6 o'clock, <0, -4, 0> */ glTranslatef(3.464, -2., 0.); draw_hexagon(); /* 4 o'clock, <3.464, -2, 0> */ glTranslatef(3.464, 2., 0.); draw_hexagon(); /* 2 o'clock, <3.464, 2, 0> */ glTranslatef(0., 4., 0.); draw_hexagon(); if(wflag) glPopMatrix();}void sphdraw(float args[3]){ glPushMatrix(); glTranslatef(args[0], args[1], args[2]); glCallList(asphere); glPopMatrix();}void setPerspective(int angle, float aspect, float zNear, float zFar){ glPushAttrib(GL_TRANSFORM_BIT); glMatrixMode(GL_PROJECTION); gluPerspective(angle * 0.1, aspect, zNear, zFar); glPopAttrib();}/* initialize global 3-vectors */void init_3d(void){ (void)seed_random_float((long)time((time_t*)NULL)); /* initialize colored points */ rv[0][0] = (float)random_float() * 10.; rv[0][1] = (float)random_float() * 10.; rv[0][2] = (float)random_float() * 10. - 10.; bv[0][0] = rv[0][0] + (float)random_float()*5.; bv[0][1] = rv[0][1] + (float)random_float()*5.; bv[0][0] = rv[0][2] + (float)random_float()*5.; gv[0][0] = rv[0][0] + (float)random_float()*5.; gv[0][1] = rv[0][1] + (float)random_float()*5.; gv[0][0] = rv[0][2] + (float)random_float()*5.; yv[0][0] = rv[0][0] + (float)random_float()*5.; yv[0][1] = rv[0][1] + (float)random_float()*5.; yv[0][0] = rv[0][2] + (float)random_float()*5.; mv[0][0] = rv[0][0] + (float)random_float()*5.; mv[0][1] = rv[0][1] + (float)random_float()*5.; mv[0][0] = rv[0][2] + (float)random_float()*5.; /* initialize eye velocity */ eyev[0] = eyev[1] = eyev[2] = 0.;}void init_graphics(void){ int width = 600; int height = 600; xmax = width; ymax = height; glDrawBuffer(GL_BACK); glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.0, 0.0, 0.0); glClearDepth(1.0); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glViewport(0, 0, xmax, ymax); setPerspective(fovy, (float)xmax/(float)ymax, 0.01, farplane); quadObj = gluNewQuadric(); gluQuadricNormals(quadObj, GLU_NONE); asphere = glGenLists(1); glNewList(asphere, GL_COMPILE); gluSphere(quadObj, 0.3, 12, 8); glEndList();}#define USAGE "usage message: this space for rent\n"void parse_args(int argc, char **argv){ hexflag = sflag = fflag = wflag = gflag = debug = FALSE; while (--argc) { if (strcmp("-X", argv[argc]) == 0) { debug = TRUE; } else if (strcmp("-h", argv[argc]) == 0) { print_usage(argv[0]); exit(1); } else if (strcmp("-i", argv[argc]) == 0) { print_info(); exit(1); } else if (strcmp("-x", argv[argc]) == 0) { hexflag = TRUE; farplane = 300.; } else if (strcmp("-s", argv[argc]) == 0) { sflag = TRUE; if (argv[argc+1]) speed = atoi(argv[argc+1]); else { printf("%s: -s option requires an argument.\n", argv[0]); exit(1); } } else if (strcmp("-f", argv[argc]) == 0) { fflag = TRUE; if (argv[argc+1]) frame = atoi(argv[argc+1]); else { printf("%s: -f option requires an argument.\n", argv[0]); exit(1); } if(frame < 0) { fprintf(stderr, "Try a small positive value for \n"); fprintf(stderr, "'f'; this is the number of vertical "); fprintf(stderr, "retraces per redraw\n"); fprintf(stderr, "Try %s -h for help\n", argv[0]); exit(1); } } else if (strcmp("-w", argv[argc]) == 0) { wflag = TRUE; if (argv[argc+1]) da = atof(argv[argc+1]); else { printf("%s: -w option requires an argument.\n", argv[0]); exit(1); } if(da > 10.) { fprintf(stderr, "That's a large rotational velocity ('w')"); fprintf(stderr, " but you asked for it\n"); } break; } else if (strcmp("-g", argv[argc]) == 0) { gflag = TRUE; if (argv[argc+1]) gravity = atof(argv[argc+1]); else { printf("%s: -g option requires an argument.\n", argv[0]); exit(1); } if(gravity <= 0) { fprintf(stderr, "Gravity ('g') should be positive\n"); fprintf(stderr, "Try %s -h for help\n", argv[0]); } } else if (strcmp("-?", argv[argc]) == 0) { fprintf(stderr, USAGE); } } /* set up default values */ if(!sflag) speed = 3; if(!fflag) frame = 2; if(!wflag) da = 0.; if(!gflag) gravity = G;}void print_usage(char *program){printf("\nUsage: %s [-h] [-i] [-x] [-s speed]", program);printf(" [-w rot_v] [-g gravity]\n\n");printf("-h Print this message.\n");printf("-i Print information about the demo.\n");printf("-x Enclose the particles in a box made of hexagons.\n");printf("-s speed Sets the number of new line segments per redraw \n");printf(" interval per line. Default value: 3.\n");/*** The X port does not currently include a timer, so this feature is disabled.printf("-f framenoise Sets the number of vertical retraces per redraw\n");printf(" interval. Example: -f 2 specifies one redraw per\n");printf(" 2 vertical retraces, or 30 frames per second.\n");printf(" Default value: 2.\n");************/printf("-w rot_v Spins the hexagons on their centers, and the sides\n");printf(" of the box on their centers. Hexagons spin at the\n");printf(" rate rot_v degrees per redraw, and box sides spin\n");printf(" at -rot_v/2 degrees per redraw.\n");printf("-g gravity Sets the strength of the attraction of the eye to\n");printf(" the red particle. Actually, it's not gravity since\n");printf(" the attraction is proportionate to distance.\n");printf(" Default value: 0.002. Try large values!\n");/* input added for GLX port */printf(" Executions control: \n");printf(" <spacebar> step through single frames\n");printf(" g begin continuous frames\n");printf(" s stop continuous frames\n");}void print_info(void){printf("\nLORENZ ATTRACTOR DEMO\n\n");printf("This program shows some particles stuck in a Lorenz attractor (the \n");printf("parameters used are r=28, b=8/3, sigma=10). The eye is attracted to \n");printf("the red particle, with a force directly proportional to distance. \n");printf("A command line argument puts the particles inside a box made of hexagons, \n");printf("helping to maintain the sense of 3 dimensions, but it can slow things down.\n");printf("Other options allow you to play with the redraw rate and gravity.\n\n");printf("Try lorenz -h for the usage message.\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -