Separating axis theorem

Started by
2 comments, last by razaron 12 years, 2 months ago
I'm having trouble implementing the separating axis theorem. If I do the calculation in the code on paper it works, however if I run the code it doesn't.

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;
}
}
}
}
Advertisement
[sup][color="#000088"]public [color="#660066"]Projection[color="#666600"]([color="#000088"]double[color="#000000"] min[color="#666600"], [color="#000088"]double[color="#000000"] max[color="#666600"]){[color="#000000"]
min[color="#666600"]=[color="#000088"]this[color="#666600"].[color="#000000"]min[color="#666600"];[color="#000000"]
max[color="#666600"]=[color="#000088"]this[color="#666600"].[color="#000000"]max[color="#666600"];
[color="#666600"]} [/sup]

[sup]seems backwards. shouldn't it be: this.min = min; no?[/sup]

[sup][color=#000088]public [color=#660066]Projection[color=#666600]([color=#000088]double[color=#000000] min[color=#666600], [color=#000088]double[color=#000000] max[color=#666600]){
[color=#000000] min[color=#666600]=[color=#000088]this[color=#666600].[color=#000000]min[color=#666600];
[color=#000000] max[color=#666600]=[color=#000088]this[color=#666600].[color=#000000]max[color=#666600];
[color=#666600]} [/sup]

[sup]seems backwards. shouldn't it be: this.min = min; no?[/sup]


That's where the debugger comes in handy :)

[sup][color=#000088]public [color=#660066]Projection[color=#666600]([color=#000088]double[color=#000000] min[color=#666600], [color=#000088]double[color=#000000] max[color=#666600]){
[color=#000000] min[color=#666600]=[color=#000088]this[color=#666600].[color=#000000]min[color=#666600];
[color=#000000] max[color=#666600]=[color=#000088]this[color=#666600].[color=#000000]max[color=#666600];
[color=#666600]} [/sup]

[sup]seems backwards. shouldn't it be: this.min = min; no?[/sup]

You Sir, are a gentleman and a scholar.

This topic is closed to new replies.

Advertisement