# Separating axis theorem

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

## 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,
 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; } } } } 

##### Share on other sites
[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]

##### Share on other sites

[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

##### Share on other sites

[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.

1. 1
2. 2
Rutin
20
3. 3
khawk
17
4. 4
A4L
14
5. 5

• 12
• 16
• 26
• 10
• 44
• ### Forum Statistics

• Total Topics
633759
• Total Posts
3013720
×