forked from MoonsideGames/MoonTools.Bonk
restructure files
parent
20872021fc
commit
a53677ba02
|
@ -2,90 +2,10 @@
|
||||||
using MoonTools.Core.Structs;
|
using MoonTools.Core.Structs;
|
||||||
using System;
|
using System;
|
||||||
using MoonTools.Core.Bonk.Extensions;
|
using MoonTools.Core.Bonk.Extensions;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace MoonTools.Core.Bonk
|
namespace MoonTools.Core.Bonk
|
||||||
{
|
{
|
||||||
public struct MinkowskiDifference : IEquatable<MinkowskiDifference>
|
|
||||||
{
|
|
||||||
private IShape2D shapeA;
|
|
||||||
private Transform2D transformA;
|
|
||||||
private IShape2D shapeB;
|
|
||||||
private Transform2D transformB;
|
|
||||||
|
|
||||||
public MinkowskiDifference(IShape2D shapeA, Transform2D transformA, IShape2D shapeB, Transform2D transformB)
|
|
||||||
{
|
|
||||||
this.shapeA = shapeA;
|
|
||||||
this.transformA = transformA;
|
|
||||||
this.shapeB = shapeB;
|
|
||||||
this.transformB = transformB;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Equals(MinkowskiDifference other)
|
|
||||||
{
|
|
||||||
return
|
|
||||||
shapeA == other.shapeA &&
|
|
||||||
transformA.Equals(other.transformA) &&
|
|
||||||
shapeB == other.shapeB &&
|
|
||||||
transformB.Equals(other.transformB);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector2 Support(Vector2 direction)
|
|
||||||
{
|
|
||||||
return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct Simplex : IShape2D
|
|
||||||
{
|
|
||||||
MinkowskiDifference minkowskiDifference;
|
|
||||||
Vector2 directionA;
|
|
||||||
Vector2 directionB;
|
|
||||||
|
|
||||||
public Simplex(MinkowskiDifference minkowskiDifference, Vector2 directionA, Vector2 directionB)
|
|
||||||
{
|
|
||||||
this.minkowskiDifference = minkowskiDifference;
|
|
||||||
this.directionA = directionA;
|
|
||||||
this.directionB = directionB;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<Position2D> Vertices
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
yield return (Position2D)Support(directionA);
|
|
||||||
yield return (Position2D)Support(directionB);
|
|
||||||
yield return (Position2D)Support(-(directionB - directionA).Perpendicular());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public AABB AABB(Transform2D transform)
|
|
||||||
{
|
|
||||||
return Bonk.AABB.FromTransformedVertices(Vertices, transform);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Equals(IShape2D other)
|
|
||||||
{
|
|
||||||
if (other is Simplex polytope)
|
|
||||||
{
|
|
||||||
return minkowskiDifference.Equals(polytope.minkowskiDifference) &&
|
|
||||||
directionA == polytope.directionA &&
|
|
||||||
directionB == polytope.directionB;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector2 Support(Vector2 direction)
|
|
||||||
{
|
|
||||||
return minkowskiDifference.Support(direction);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector2 Support(Vector2 direction, Transform2D transform)
|
|
||||||
{
|
|
||||||
return Vector2.Transform(Support(direction), transform.TransformMatrix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class GJK2D
|
public static class GJK2D
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using MoonTools.Core.Structs;
|
||||||
|
|
||||||
|
namespace MoonTools.Core.Bonk
|
||||||
|
{
|
||||||
|
public struct MinkowskiDifference : IEquatable<MinkowskiDifference>
|
||||||
|
{
|
||||||
|
private IShape2D shapeA;
|
||||||
|
private Transform2D transformA;
|
||||||
|
private IShape2D shapeB;
|
||||||
|
private Transform2D transformB;
|
||||||
|
|
||||||
|
public MinkowskiDifference(IShape2D shapeA, Transform2D transformA, IShape2D shapeB, Transform2D transformB)
|
||||||
|
{
|
||||||
|
this.shapeA = shapeA;
|
||||||
|
this.transformA = transformA;
|
||||||
|
this.shapeB = shapeB;
|
||||||
|
this.transformB = transformB;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(MinkowskiDifference other)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
shapeA == other.shapeA &&
|
||||||
|
transformA.Equals(other.transformA) &&
|
||||||
|
shapeB == other.shapeB &&
|
||||||
|
transformB.Equals(other.transformB);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 Support(Vector2 direction)
|
||||||
|
{
|
||||||
|
return shapeA.Support(direction, transformA) - shapeB.Support(-direction, transformB);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using MoonTools.Core.Structs;
|
||||||
|
using MoonTools.Core.Bonk.Extensions;
|
||||||
|
|
||||||
|
namespace MoonTools.Core.Bonk
|
||||||
|
{
|
||||||
|
public struct Simplex : IShape2D
|
||||||
|
{
|
||||||
|
MinkowskiDifference minkowskiDifference;
|
||||||
|
Vector2 directionA;
|
||||||
|
Vector2 directionB;
|
||||||
|
|
||||||
|
public Simplex(MinkowskiDifference minkowskiDifference, Vector2 directionA, Vector2 directionB)
|
||||||
|
{
|
||||||
|
this.minkowskiDifference = minkowskiDifference;
|
||||||
|
this.directionA = directionA;
|
||||||
|
this.directionB = directionB;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Position2D> Vertices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
yield return (Position2D)Support(directionA);
|
||||||
|
yield return (Position2D)Support(directionB);
|
||||||
|
yield return (Position2D)Support(-(directionB - directionA).Perpendicular());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AABB AABB(Transform2D transform)
|
||||||
|
{
|
||||||
|
return Bonk.AABB.FromTransformedVertices(Vertices, transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(IShape2D other)
|
||||||
|
{
|
||||||
|
if (other is Simplex polytope)
|
||||||
|
{
|
||||||
|
return minkowskiDifference.Equals(polytope.minkowskiDifference) &&
|
||||||
|
directionA == polytope.directionA &&
|
||||||
|
directionB == polytope.directionB;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 Support(Vector2 direction)
|
||||||
|
{
|
||||||
|
return minkowskiDifference.Support(direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector2 Support(Vector2 direction, Transform2D transform)
|
||||||
|
{
|
||||||
|
return Vector2.Transform(Support(direction), transform.TransformMatrix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,15 +2,15 @@ using Microsoft.Xna.Framework;
|
||||||
|
|
||||||
namespace MoonTools.Core.Bonk.Extensions
|
namespace MoonTools.Core.Bonk.Extensions
|
||||||
{
|
{
|
||||||
public static class Vector2Extensions
|
internal static class Vector2Extensions
|
||||||
{
|
{
|
||||||
public static Vector2 Cross(this Vector2 a, Vector2 b)
|
internal static Vector2 Cross(this Vector2 a, Vector2 b)
|
||||||
{
|
{
|
||||||
var vec3 = Vector3.Cross(new Vector3(a.X, a.Y, 0), new Vector3(b.X, b.Y, 0));
|
var vec3 = Vector3.Cross(new Vector3(a.X, a.Y, 0), new Vector3(b.X, b.Y, 0));
|
||||||
return new Vector2(vec3.X, vec3.Y);
|
return new Vector2(vec3.X, vec3.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector2 Perpendicular(this Vector2 v)
|
internal static Vector2 Perpendicular(this Vector2 v)
|
||||||
{
|
{
|
||||||
return new Vector2(v.Y, -v.X);
|
return new Vector2(v.Y, -v.X);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue