optimize rectangle support function

pull/4/head
Evan Hemsley 2019-12-29 22:54:21 -08:00
parent f9df547302
commit 9e7d16b0a9
1 changed files with 28 additions and 13 deletions

View File

@ -38,21 +38,36 @@ namespace MoonTools.Core.Bonk
AABB = new AABB(minX, minY, maxX, maxY); AABB = new AABB(minX, minY, maxX, maxY);
} }
private Vector2 Support(Vector2 direction)
{
if (direction.X >= 0 && direction.Y >= 0)
{
return new Vector2(MaxX, MaxY);
}
else if (direction.X >= 0 && direction.Y < 0)
{
return new Vector2(MaxX, MinY);
}
else if (direction.X < 0 && direction.Y >= 0)
{
return new Vector2(MinX, MaxY);
}
else if (direction.X < 0 && direction.Y < 0)
{
return new Vector2(MinX, MinY);
}
else
{
throw new ArgumentException("Support vector direction cannot be zero.");
}
}
public Vector2 Support(Vector2 direction, Transform2D transform) public Vector2 Support(Vector2 direction, Transform2D transform)
{ {
var maxDotProduct = float.NegativeInfinity; Matrix4x4 inverseTransform;
var maxVertex = new Vector2(MinX, MinY); Matrix4x4.Invert(transform.TransformMatrix, out inverseTransform);
foreach (var vertex in Vertices) var inverseDirection = Vector2.TransformNormal(direction, inverseTransform);
{ return Vector2.Transform(Support(inverseDirection), transform.TransformMatrix);
var transformed = Vector2.Transform(vertex, transform.TransformMatrix);
var dot = Vector2.Dot(transformed, direction);
if (dot > maxDotProduct)
{
maxVertex = transformed;
maxDotProduct = dot;
}
}
return maxVertex;
} }
public AABB TransformedAABB(Transform2D transform) public AABB TransformedAABB(Transform2D transform)