• Create Account

#Actualrazaron

Posted 23 January 2012 - 10:05 AM

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[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;
}

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

#1razaron

Posted 23 January 2012 - 10:04 AM

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.

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[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;
}

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

PARTNERS