예제 #1
0
/*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*/
예제 #2
0
/*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*/
예제 #3
0
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);
}
예제 #4
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*/