📄 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 + -