public List <FBVerletEdge> CollisionAxes(IVerletCollidable otherShape)
 {
     return(collisionEdges);
 }
        public static bool CollidesWith(this IVerletCollidable a, IVerletCollidable b, out FBVerletCollision collisionResult)
        {
            collisionResult = null;

            var axes = a.CollisionAxes(b);

            axes.AddRange(b.CollisionAxes(a));

            FBVerletCollision collisionInfo = new FBVerletCollision();

            foreach (var edge in a.CollisionAxes(b))
            {
                var   axis = edge.NormalLeft;
                float aMin, aMax, bMin, bMax;
                a.Project(axis, out aMin, out aMax);
                b.Project(axis, out bMin, out bMax);

                var intervalDistance = IntervalDistance(aMin, aMax, bMin, bMax);
                if (intervalDistance >= 0)
                {
                    return(false);
                }

                if ((intervalDistance = Math.Abs(intervalDistance)) < collisionInfo.mtvAmount)
                {
                    collisionInfo.mtv                = axis;
                    collisionInfo.mtvAmount          = intervalDistance;
                    collisionInfo.collisionEdge      = edge;
                    collisionInfo.collisionEdgeShape = a;
                }
            }

            foreach (var edge in b.CollisionAxes(a))
            {
                var   axis = edge.NormalLeft;
                float aMin, aMax, bMin, bMax;
                a.Project(axis, out aMin, out aMax);
                b.Project(axis, out bMin, out bMax);

                var intervalDistance = IntervalDistance(aMin, aMax, bMin, bMax);
                if (intervalDistance >= 0)
                {
                    return(false);
                }

                if ((intervalDistance = Math.Abs(intervalDistance)) < collisionInfo.mtvAmount)
                {
                    collisionInfo.mtv                = axis;
                    collisionInfo.mtvAmount          = intervalDistance;
                    collisionInfo.collisionEdge      = edge;
                    collisionInfo.collisionEdgeShape = a;
                }
            }

            if (collisionInfo.collisionEdgeShape == b)
            {
                var temp = b;
                b = a;
                a = temp;
            }

            float minDistance = float.MaxValue;

            foreach (var point in a.CollisionPoints())
            {
                var distance = (collisionInfo.mtv * (point.Position - b.Center)).LengthSquared();
                if (distance < minDistance)
                {
                    minDistance = distance;
                    collisionInfo.collisionPoint = point;
                }
            }

            collisionResult = collisionInfo;
            return(true);
        }