/*TRACE A RANDOM PATH AROUND THE SCREEN*/ void turtle_random_walk(turtle_t *t, pen_t *p, int steps){ int i; color_t cc; for(i=0; i<steps; i++){ int rndm = roll_dice(1, 4); if(rndm==1){ turtle_walk(t, 10); } else if(rndm==2){ turtle_turn(t, 90); } else if(rndm==3){ turtle_turn(t, -90); } else{ cc.r = (rand()%10)*0.1; cc.g = (rand()%10)*0.1; cc.b = (rand()%10)*0.1; pen_set_rgb(p, cc); } } return; }/*END turtle_random_walk*/
/*DRAW A POLYGON WITH X SIDES*/ void turtle_polygon(turtle_t *t, pen_t *p, int count, int size){ if(size>2){ int i; for(i=0;i<count;i++){ turtle_walk(t, size); turtle_turn(t, 360/count); } fprintf(stdout, "closepath\n"); if(p->filled==1){ fprintf(stdout, "fill\n"); } } return; }/*END turtle_polygon*/
static int ltgl_graphics_primitive(const GRAPHICS_PRIMITIVE *gp, const TRANSSYS_INSTANCE *transsys_instance, TURTLE_STATE **ts, const RENDER_PARAMETERS *rp) { double arg[GRAPHICS_PRIMITIVE_ARGMAX]; int i; for (i = 0; i < gp->num_arguments; i++) arg[i] = evaluate_expression(gp->argument[i], &transsys_instance); switch (gp->type) { case GRAPHICS_PUSH: *ts = push_turtle_state(*ts); break; case GRAPHICS_POP: *ts = pop_turtle_state(*ts); ltgl_setcolor(*ts, rp); break; case GRAPHICS_MOVE: turtle_move(*ts, arg[0]); break; case GRAPHICS_TURN: turtle_turn(*ts, arg[0]); break; case GRAPHICS_ROLL: turtle_roll(*ts, arg[0]); break; case GRAPHICS_BANK: turtle_bank(*ts, arg[0]); break; case GRAPHICS_SPHERE: glPushMatrix(); glTranslatef((*ts)->position.x, (*ts)->position.y, (*ts)->position.z); /* fprintf(stderr, "ltgl_graphics_primitive: sphere at (%f, %f, %f)\n", (*ts)->position.x, (*ts)->position.y, (*ts)->position.z); */ ltgl_rotate_q(&((*ts)->orientation)); gluSphere(glu_quadric_object, arg[0], 10, 7); glPopMatrix(); break; case GRAPHICS_CYLINDER: glPushMatrix(); glTranslatef((*ts)->position.x, (*ts)->position.y, (*ts)->position.z); ltgl_rotate_q(&((*ts)->orientation)); glTranslatef(0.0, 0.0, -0.5 * arg[1]); gluQuadricOrientation(glu_quadric_object, GLU_INSIDE); gluDisk(glu_quadric_object, 0.0, arg[0], 10, 1); gluQuadricOrientation(glu_quadric_object, GLU_OUTSIDE); if (arg[1] > 0.0) { gluCylinder(glu_quadric_object, arg[0], arg[0], arg[1], 10, 1); } glTranslatef(0.0, 0.0, arg[1]); gluDisk(glu_quadric_object, 0.0, arg[0], 10, 1); glPopMatrix(); break; case GRAPHICS_BOX: glPushMatrix(); glTranslatef((*ts)->position.x, (*ts)->position.y, (*ts)->position.z); ltgl_rotate_q(&((*ts)->orientation)); ltgl_box(arg[0], arg[1], arg[2]); glPopMatrix(); break; case GRAPHICS_COLOR: (*ts)->red = arg[0]; (*ts)->green = arg[1]; (*ts)->blue = arg[2]; ltgl_setcolor(*ts, rp); break; default: fprintf(stderr, "postscript_graphics_primitive: primitive type %d not implemented\n", (int) gp->type); return (-1); } return (0); }
/*PROCESS COMMANDS*/ void process_commands(turtle_t *t, pen_t *p){ char cmd; color_t c; int count, size, rows, columns; float x, y, r, d, s; while((fscanf(stdin, "%c", &cmd)) !=EOF){ switch(cmd){ case 'G':/*GOTO COORDINATES*/ fscanf(stdin, "%f %f\n", &x, &y); fprintf(stdout, "%%Turtle goto (%f, %f)\n", x, y); turtle_goto(t, x, y); break; case 'C':/*CHANGE PEN COLOR*/ fscanf(stdin, "%f %f %f\n", &c.r, &c.g, &c.b); fprintf(stdout, "%%Pen color changed to (%f, %f, %f)\n", c.r, c.g, c.b); if(verify_rgb(c)){ pen_set_rgb(p, c); } break; case 'W':/*WALK FORWARD*/ fscanf(stdin, "%f\n", &r); fprintf(stdout, "%%Turtle will move %f units from (%f, %f)\n", r, t->xPos, t->yPos); turtle_walk(t, r); break; case 'T':/*TURN CLOCKWISE*/ fscanf(stdin, "%f\n", &d); fprintf(stdout, "%%Turtle has turned %f degrees\n", d); turtle_turn(t, d); break; case 'S':/*DRAW A SQUARE*/ fscanf(stdin, "%f\n", &s); fprintf(stdout, "%%Turtle will draw a square of size %f\n", s); turtle_square(t, s); break; case 'R':/*DRAW ROW OF SQUARES*/ fscanf(stdin, "%d %d/n", &count, &size); fprintf(stdout, "%%Turtle will draw %d squares of %d size in a row\n", count, size); turtle_row(t, count, size); break; case 'F':/*SWITCH PEN FILL/UNFILLED*/ pen_fill(p); break; case 'P':/*DRAW A POLYGON*/ fscanf(stdin, "%d %d", &count, &size); fprintf(stdout, "%%Turtle will draw a polygon with %d sides at %d size\n", count, size); turtle_polygon(t, p, count, size); break; case 'D':/*DRAW A GRID*/ fscanf(stdin, "%d %d %d", &rows, &columns, &size); fprintf(stdout, "%%Turtle will draw a grid of squares with %d rows and %d columns of %d size\n", rows, columns, size); turtle_grid(t, rows, columns, size); break; case 'V':/*RANDOM WALK*/ fscanf(stdin, "%d", &count); fprintf(stdout, "%%Turtle will walk around using random instructions\n"); turtle_random_walk(t, p, count); break; case 'Y':/*DRAW A FRACTAL*/ fscanf(stdin, "%d", &size); fprintf(stdout, "%%Create a circular fractal\n"); turtle_fractal(t->xPos, t->yPos, size); break; } } return; }/*END process_commands*/