Public Group

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

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

## Recommended Posts

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

##### Share on other sites
EDIT2:
Completly fixed the code, due to my stupid mistake with a variable name. Edited by Morphex

1. 1
Rutin
25
2. 2
3. 3
4. 4
5. 5

• 10
• 13
• 19
• 14
• 9
• ### Forum Statistics

• Total Topics
632942
• Total Posts
3009345
• ### Who's Online (See full list)

There are no registered users currently online

×