View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# SAT, something is wrong I just don't know what....

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

### #1Morphex  Members

Posted 24 December 2012 - 07:43 AM

I have implement this algorithm numerous times before, and it worked flawlessly everytime, right this is giving me trouble, and after rewritting this 3 times already I give up trying to find the error, maybe a set of new eyes can pinpoint it to me?

My problem is that it is detecting collisions where it shouldn't, and I can't seem to find out why.

public static class SAT
{

public class MTV
{
public Vector2 Axis;
public float Magnitude;
public bool Collided = true;
}

public static Vector2[] GetAxes(Vertices vert)
{
Vector2[] axes = new Vector2[vert.Count];
// loop over the vertices
for (int i = 0; i < vert.Count; i++)
{
// get the current vertex
Vector2 p1 = vert[i];
// get the next vertex
Vector2 p2 = vert[vert.NextIndex(i)];
// subtract the two to get the edge vector
Vector2 edge = p1 - (p2);
// get either perpendicular vector
Vector2 normal = new Vector2(edge.Y, -edge.X);
// the perp method is just (x, y) => (-y, x) or (y, -x)
axes[i] = normal;
axes[i].Normalize();
}
return axes;
}

public static MTV CheckCollision(Vertices polygon1,Vertices polygon2)
{
float overlap = float.PositiveInfinity;// really large value;
MTV MTV = new SAT.MTV();
MTV.Collided = false;
Vector2 smallest = Vector2.Zero;
Vector2[] axes1 = GetAxes(polygon1);
Vector2[] axes2 = GetAxes(polygon2);
// loop over the axes1
for (int i = 0; i < axes1.Length; i++)
{
Vector2 axis = axes2[i];
float min, max, min2, max2;
// project both shapes onto the axis
polygon1.ProjectToAxis(ref axis, out min, out max);
polygon2.ProjectToAxis(ref axis, out min2, out max2);
// do the projections overlap?
float d1, d2;
d1 = min - max2;
d2 = min2 - max;
if (d1 > 0 || d2 > 0) //no intersection
{
// then we can guarantee that the shapes do not overlap
return MTV;
}
else
{
// get the overlap
float o = d1 - d2;
// check for minimum
if (o < overlap)
{
// then set this one as the smallest
overlap = o;
smallest = axis;
}
}
}
// loop over the axes2
for (int i = 0; i < axes2.Length; i++)
{
Vector2 axis = axes2[i];
float min, max, min2, max2;
// project both shapes onto the axis
polygon1.ProjectToAxis(ref axis,out min, out max );
polygon2.ProjectToAxis(ref axis, out min2, out max2);
// do the projections overlap?
float d1, d2;
d1 = min - max2;
d2 = min2 - max;
if ( d1 > 0 || d2 > 0 ) //no intersection
{
// then we can guarantee that the shapes do not overlap
return MTV;
}
else
{
// get the overlap
float o = d1 - d2;
// check for minimum
if (o < overlap)
{
// then set this one as the smallest
overlap = o;
smallest = axis;
}
}
}
MTV.Collided = true;
MTV.Axis = smallest;
MTV.Magnitude = overlap;

return MTV;

}
}


If anyone asked here is the Project to Axis from Vertices( its just List) :

public void ProjectToAxis(ref Vector2 axis, out float min, out float max)        {            // To project a point on an axis use the dot product            float dotProduct = Vector2.Dot(axis, this[0]);            min = dotProduct;            max = dotProduct;             for (int i = 0; i < Count; i++)            {                dotProduct = Vector2.Dot(this[i], axis);                if (dotProduct < min)                {                    min = dotProduct;                }                else                {                    if (dotProduct > max)                    {                        max = dotProduct;                    }                }            }        }

Check out my new blog: Morphexe

### #2Morphex  Members

Posted 24 December 2012 - 08:55 AM

EDIT2:
Completly fixed the code, due to my stupid mistake with a variable name.

Edited by Morphex, 24 December 2012 - 11:11 AM.

Check out my new blog: Morphexe

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.