int leader(){ int i=0; int found = 0; while(!found){ if(go_to_position(positions[i], 10, NORMAL_SPEED)){ //predefined posiion reached found = get_ball(); //if(found){ //decide if and when reset positions to prefdefined one robot.x = positions[i].x; robot.y = positions[i].y; i++; //} } else { //obstacle or ball found... must chose if it is to avoid or to grab //for now assume it is a ball int a = robot.t; found = get_ball(); robot.x+=sin(a*M_PI/180)*STOP_DIST; robot.y+=cos(a*M_PI/180)*STOP_DIST; } if(i==n_points) i = 0; } }
/* Send a new blob travelling upward. This blob will actually be composed of N metaballs that are near each other. */ static void launch_balls (ModeInfo *mi) { lavalite_configuration *bp = &bps[MI_SCREEN(mi)]; metaball *b0 = get_ball (mi); int i; if (!b0) return; reset_ball (mi, b0); for (i = 0; i < bp->blobs_per_group; i++) { metaball *b1 = get_ball (mi); if (!b1) break; *b1 = *b0; reset_ball (mi, b1); b1->leader = b0; # define FROB(FIELD,AMT) \ b1->FIELD += (bellrand(AMT) * b0->FIELD) /* FROB (pos_r, 0.7); */ /* FROB (pos_th, 0.7); */ FROB (dr, 0.8); FROB (dz, 0.6); # undef FROB } }
/* Generate the blobs that don't move: the ones at teh top and bottom that are part of the scenery. */ static void generate_static_blobs (ModeInfo *mi) { lavalite_configuration *bp = &bps[MI_SCREEN(mi)]; metaball *b0, *b1; int i; b0 = get_ball (mi); if (!b0) abort(); b0->static_p = True; b0->alive_p = True; b0->R = 0.6; b0->r = 0.3; /* the giant blob at the bottom of the bottle. */ b0->pos_r = 0; b0->pos_th = 0; b0->dr = 0; b0->dz = 0; b0->x = 0; b0->y = 0; b0->z = -0.43; /* the small blob at the top of the bottle. */ b1 = get_ball (mi); if (!b1) abort(); *b1 = *b0; b1->R = 0.16; b1->r = 0.135; b1->z = 1.078; /* Some extra blobs at the bottom of the bottle, to jumble the surface. */ for (i = 0; i < bp->blobs_per_group; i++) { b1 = get_ball (mi); if (!b1) abort(); reset_ball (mi, b1); b1->static_p = True; b1->z = frand(0.04); b1->dr = 0; b1->dz = 0; } }