⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lorenz.c

📁 学习c++必备
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -