C
C#6mo ago
16Bit_Felix

Scuffed polygon collision detection (SAT)

I've been sitting on this collision detection for a while now, but it keeps on giving false results, despite numerously checking the execution and theory behind it. Could someone please help me out with this? (Source code is below)
1 Reply
16Bit_Felix
16Bit_Felix6mo ago
private bool PolygonToPolygon(Vector2[] verticesA, Vector2[] verticesB)
{

for(int i = 0; i < verticesA.Length; i++)
{
Vector2 va = verticesA[i];
Vector2 vb = verticesA[(i + 1) % verticesA.Length];

Vector2 edge = vb - va;
Vector2 axis = new Vector2(-edge.Y, edge.X);

ProjectVertices(verticesA, axis, out float minA, out float maxA);
ProjectVertices(verticesB, axis, out float minB, out float maxB);

if(minA >= maxB || minB >= maxA)
{
return false;
}
}

for (int i = 0; i < verticesB.Length; i++)
{
Vector2 va = verticesB[i];
Vector2 vb = verticesB[(i + 1) % verticesB.Length];

Vector2 edge = vb - va;
Vector2 axis = new Vector2(-edge.Y, edge.X);
axis = Vector2.Normalize(axis);

ProjectVertices(verticesA, axis, out float minA, out float maxA);
ProjectVertices(verticesB, axis, out float minB, out float maxB);

if (minA >= maxB || minB >= maxA)
{
return false;
}
}

return true;
}


private void ProjectVertices(Vector2[] vertices, Vector2 axis,
out float min, out float max)
{
min = float.MaxValue;
max = float.MinValue;

for(int i = 0; i < vertices.Length; i++)
{
Vector2 v = vertices[i];
float proj = v.X * axis.X + v.Y * axis.Y;

if(proj < min) { min = proj; }
if(proj > max) { max = proj; }
}
}
private bool PolygonToPolygon(Vector2[] verticesA, Vector2[] verticesB)
{

for(int i = 0; i < verticesA.Length; i++)
{
Vector2 va = verticesA[i];
Vector2 vb = verticesA[(i + 1) % verticesA.Length];

Vector2 edge = vb - va;
Vector2 axis = new Vector2(-edge.Y, edge.X);

ProjectVertices(verticesA, axis, out float minA, out float maxA);
ProjectVertices(verticesB, axis, out float minB, out float maxB);

if(minA >= maxB || minB >= maxA)
{
return false;
}
}

for (int i = 0; i < verticesB.Length; i++)
{
Vector2 va = verticesB[i];
Vector2 vb = verticesB[(i + 1) % verticesB.Length];

Vector2 edge = vb - va;
Vector2 axis = new Vector2(-edge.Y, edge.X);
axis = Vector2.Normalize(axis);

ProjectVertices(verticesA, axis, out float minA, out float maxA);
ProjectVertices(verticesB, axis, out float minB, out float maxB);

if (minA >= maxB || minB >= maxA)
{
return false;
}
}

return true;
}


private void ProjectVertices(Vector2[] vertices, Vector2 axis,
out float min, out float max)
{
min = float.MaxValue;
max = float.MinValue;

for(int i = 0; i < vertices.Length; i++)
{
Vector2 v = vertices[i];
float proj = v.X * axis.X + v.Y * axis.Y;

if(proj < min) { min = proj; }
if(proj > max) { max = proj; }
}
}
For example if i input in vertices, that form a box, the detection treats it as a hexagon