//The collision function here is not pure, and does some weird things when //balls do not collide "nicely" Ball[] balls = new Ball[150]; void setup() { size(300,300); smooth(); noStroke(); for(int i=0; i< balls.length; i=i+1) { balls[i] = new Ball(random(0,width),random(0,height),random(-.5,.5),random(-.5,.5), 100); } } void draw() { background(0); for(int i=0; i< balls.length; i=i+1) { balls[i].render(); balls[i].update(); collision(); } } void collision() { float distx, disty; float xdir, ydir; float VXi, VXj, VYi, VYj; for(int i=0; i< balls.length; i=i+1) { for(int j=i; j< balls.length; j=j+1) { if(j != i) { distx=balls[i].getX() - balls[j].getX(); disty=balls[i].getY() - balls[j].getY(); if( (abs(distx)<10) && (abs(disty)<10) ) { VXi=balls[i].getVX();VYi=balls[i].getVY(); VXj=balls[j].getVX();VYj=balls[j].getVY(); if( (VXj<0 && VXi>0) || (VXj>0 && VXi<0) ) {xdir=-1;} else {xdir=1;} if( (VYj<0 && VYi>0) || (VYj>0 && VYi<0) ) {ydir=-1;} else {ydir=1;} balls[i].setVX( xdir*VXi ); balls[i].setVY( ydir*VYi ); balls[j].setVX( xdir*VXj ); balls[j].setVY( ydir*VYj ); balls[j].setX( balls[i].getX()+11); balls[j].setY( balls[i].getY()+11); /* balls[i].setVX( -1*balls[i].getVX() ); balls[i].setVY( -1*balls[i].getVY() ); balls[j].setVX( -1*balls[j].getVX() ); balls[j].setVY( -1*balls[j].getVY() ); */ balls[j].setC(255); balls[i].setC(255); } } } } } class Ball { float x,y,vx,vy; float s; color c; Ball(float x_, float y_, float vx_, float vy_, color c_) { x=x_; y=y_; vx=vx_; vy=vy_; c=c_; s=10; } void setC(color c_) {c=c_;} float getX() {return x;} float getY() {return y;} void setX(float x_) {x = x_;} void setY(float y_) {y = y_;} void setXY(float x_, float y_) {x = x_;y = y_;} float getVX() {return vx;} float getVY() {return vy;} void setVX(float vx_) {vx = vx_;} void setVY(float vy_) {vy = vy_;} void setVXY(float vx_, float vy_) {vx = vx_;vy = vy_;} void update() { if (x+vx > width ) {x=width; vx=-1*vx;} else if (x+vx <0) {x=0; vx=-1*vx;} else {x=x+vx;} if (y+vy > height ) {y=height; vy=-1*vy;} else if (y+vy <0) {y=0; vy=-1*vy;} else {y=y+vy;} } void render() { fill(c); ellipse(x,y,s,s); //reset c c=100; } }