The aabb part is for (later) optimization.
Here are the relevant bits of code:
Projection Class,
public class Projection {
protected double min;
protected double max;
public Projection(double min, double max){
min=this.min;
max=this.max;
}
public boolean overlap(Projection p2){
boolean temp=true;
if(min>p2.max || max<p2.min)
temp=false;
return temp;
}
}
Collision Detection part of the polygon (convex) class,
public boolean collides(Polygon poly){
boolean check = true;
double temp=0;
Projection p1;
Projection p2;
Point2D.Double axis;
for(int i=0;i<edges;i++){
if(check){
double min=0,max=0;
double dx=edge.v2.pos.x - edge.v1.pos.x;
double dy=edge.v2.pos.y - edge.v1.pos.y;
double x=(dx)/Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
double y=(dy)/Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
axis = new Point2D.Double(-x, y);
min = max = (axis.x*vertex[0].pos.x)+(axis.y*vertex[0].pos.y);
//project this shape
for(int j=0;j<vertices;j++){
temp= (axis.x*vertex[j].pos.x)+(axis.y*vertex[j].pos.y);
if(temp<min)
min=temp;
if(temp>max)
max=temp;
}
p1 = new Projection(min,max);
min = max = (axis.x*poly.vertex[0].pos.x)+(axis.y*poly.vertex[0].pos.y);
//project other shape
for(int j=0;j<poly.vertices;j++){
temp= (axis.x*poly.vertex[j].pos.x)+(axis.y*poly.vertex[j].pos.y);
if(temp<min)
min=temp;
if(temp>max)
max=temp;
}
p2 = new Projection(min,max);
if(!p1.overlap(p2))
check=false;
}
}
return check;
}
The implementation in the main class (done every frame),
polygon.elementAt(j).aabbCollision=false;
polygon.elementAt(j).polyCollision=false;
for(int l=0;l<polygon.capacity();l++){
if(l!=j){
if(polygon.elementAt(j).box.compareAABB(polygon.elementAt(l).box)){
polygon.elementAt(j).aabbCollision=true;
}
if(polygon.elementAt(j).collides(polygon.elementAt(l))){
if(polygon.elementAt(l).collides(polygon.elementAt(j))){
polygon.elementAt(j).polyCollision=true;
}
}
}
}