int SCREENWIDTH = 800; int SCREENHEIGHT = 600; int ROBOTSIZE = 70; int BALLSIZE = 20; int SPEED = 4; float FRONTANGLE = -PI/4; float LEFTANGLE = PI/4; float VIEWANGLE = PI/2; // robot float rx = 0; float ry = -140; float ra = PI; // motor float ml = 1; float mr = 1; ArrayList walls = new ArrayList(); class Wall { float x1, y1, x2, y2; Wall(float _x1, float _y1, float _x2, float _y2) { x1 = _x1; y1 = _y1; x2 = _x2; y2 = _y2; } } float WALLRADIUS = 200; void setup() { //size(SCREENWIDTH,SCREENHEIGHT); size(600,600); // must be constant for export background(0); smooth(); frameRate(15); /* for (float a=0; a 2) { sample = 0; if (frontRange < ROBOTSIZE || leftRange < ROBOTSIZE*0.7) { ml = 1; mr = -1; } else { float adj = f(leftRange-ROBOTSIZE); if (adj > 0.8) adj = 0.8; if (adj < -.8) adj = -.8; ml = 1 - adj; mr = 1 + adj; } } // robot stroke(0); fill(0,0,255); ellipse(SCREENWIDTH/2+rx,SCREENHEIGHT/2-ry,ROBOTSIZE,ROBOTSIZE); fill(0,255,0); arc(SCREENWIDTH/2+rx,SCREENHEIGHT/2-ry,ROBOTSIZE,ROBOTSIZE,-ra-VIEWANGLE/2,-ra+VIEWANGLE/2); fill(255,0,0); arc(SCREENWIDTH/2+rx,SCREENHEIGHT/2-ry,frontRange*2,frontRange*2,-(ra+FRONTANGLE)-.03,-(ra+FRONTANGLE)+.03); arc(SCREENWIDTH/2+rx,SCREENHEIGHT/2-ry,leftRange*2,leftRange*2,-(ra+LEFTANGLE)-.03,-(ra+LEFTANGLE)+.03); //walls stroke(255); strokeWeight(3); for (int i=0; i 0 && ((x >= wall.x1 && x <= wall.x2) || (x >= wall.x2 && x <= wall.x1))) { minrange = range; } } return minrange; } float lasterr = 0; float integral = 0; float f(float err) { if (abs(err) < ROBOTSIZE/2) integral += err; float output = .02*err + 0.004*integral; lasterr = err; return output; }