Sign in to follow this  

Separating axis theorem

This topic is 2181 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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,
[CODE]
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;
}
}
[/CODE]

Collision Detection part of the polygon (convex) class,
[code]
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[i].v2.pos.x - edge[i].v1.pos.x;
double dy=edge[i].v2.pos.y - edge[i].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;
}
[/code]

The implementation in the main class (done every frame),
[code]
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;
}
}
}
}
[/code]

Share this post


Link to post
Share on other sites
[sup][color="#000088"]public[/color] [color="#660066"]Projection[/color][color="#666600"]([/color][color="#000088"]double[/color][color="#000000"] min[/color][color="#666600"],[/color] [color="#000088"]double[/color][color="#000000"] max[/color][color="#666600"]){[/color][color="#000000"]
min[/color][color="#666600"]=[/color][color="#000088"]this[/color][color="#666600"].[/color][color="#000000"]min[/color][color="#666600"];[/color][color="#000000"]
max[/color][color="#666600"]=[/color][color="#000088"]this[/color][color="#666600"].[/color][color="#000000"]max[/color][color="#666600"];[/color]
[color="#666600"]}[/color] [/sup]

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

Share this post


Link to post
Share on other sites
[quote name='Infernal-rk' timestamp='1327620185' post='4906578']
[sup][color=#000088]public[/color] [color=#660066]Projection[/color][color=#666600]([/color][color=#000088]double[/color][color=#000000] min[/color][color=#666600],[/color] [color=#000088]double[/color][color=#000000] max[/color][color=#666600]){[/color]
[color=#000000] min[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]min[/color][color=#666600];[/color]
[color=#000000] max[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]max[/color][color=#666600];[/color]
[color=#666600]}[/color] [/sup]

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

That's where the debugger comes in handy :)

Share this post


Link to post
Share on other sites
[quote name='Infernal-rk' timestamp='1327620185' post='4906578']
[sup][color=#000088]public[/color] [color=#660066]Projection[/color][color=#666600]([/color][color=#000088]double[/color][color=#000000] min[/color][color=#666600],[/color] [color=#000088]double[/color][color=#000000] max[/color][color=#666600]){[/color]
[color=#000000] min[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]min[/color][color=#666600];[/color]
[color=#000000] max[/color][color=#666600]=[/color][color=#000088]this[/color][color=#666600].[/color][color=#000000]max[/color][color=#666600];[/color]
[color=#666600]}[/color] [/sup]

[sup]seems backwards. shouldn't it be: this.min = min; no?[/sup]
[/quote]
You Sir, are a gentleman and a scholar.

Share this post


Link to post
Share on other sites
Sign in to follow this