Exemple #1
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="vertices1"></param>
 /// <param name="vertices2"></param>
 /// <param name="mtv"></param>
 /// <returns></returns>
 public bool MinimumTranslationVectorWithContainment(
     Vector2[] vertices1,
     Vector2[] vertices2,
     out MinimumTranslationVector? mtv)
 {
     double overlap = Double.PositiveInfinity; // really large value;
     Vector2 smallest = default(Vector2);
     Vector2[] axes1 = GetAxes(vertices1);
     Vector2[] axes2 = GetAxes(vertices2);
     // loop over the axes1
     for (int i = 0; i < axes1.Length; i++)
     {
         Vector2 axis = axes1[i];
         // project both shapes onto the axis
         Projection p1 = Project(vertices1, axis);
         Projection p2 = Project(vertices2, axis);
         // do the projections overlap?
         if (!p1.Overlap(p2))
         {
             // then we can guarantee that the shapes do not overlap
             mtv = default(MinimumTranslationVector?);
             return false;
         }
         else
         {
             // get the overlap
             double o = p1.GetOverlap(p2);
             // check for containment
             if (p1.Contains(p2) || p2.Contains(p1))
             {
                 // get the overlap plus the distance from the minimum end points
                 double mins = Math.Abs(p1.Min - p2.Min);
                 double maxs = Math.Abs(p1.Max - p2.Max);
                 // NOTE: depending on which is smaller you may need to
                 // negate the separating axis!!
                 if (mins < maxs)
                 {
                     o += mins;
                 }
                 else
                 {
                     o += maxs;
                 }
             }
             // 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];
         // project both shapes onto the axis
         Projection p1 = Project(vertices1, axis);
         Projection p2 = Project(vertices2, axis);
         // do the projections overlap?
         if (!p1.Overlap(p2))
         {
             // then we can guarantee that the shapes do not overlap
             mtv = default(MinimumTranslationVector?);
             return false;
         }
         else
         {
             // get the overlap
             double o = p1.GetOverlap(p2);
             // check for containment
             if (p1.Contains(p2) || p2.Contains(p1))
             {
                 // get the overlap plus the distance from the minimum end points
                 double mins = Math.Abs(p1.Min - p2.Min);
                 double maxs = Math.Abs(p1.Max - p2.Max);
                 // NOTE: depending on which is smaller you may need to
                 // negate the separating axis!!
                 if (mins < maxs)
                 {
                     o += mins;
                 }
                 else
                 {
                     o += maxs;
                 }
             }
             // check for minimum
             if (o < overlap)
             {
                 // then set this one as the smallest
                 overlap = o;
                 smallest = axis;
             }
         }
     }
     mtv = new MinimumTranslationVector(smallest, overlap);
     // if we get here then we know that every axis had overlap on it
     // so we can guarantee an intersection
     return true;
 }
Exemple #2
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="vertices1"></param>
 /// <param name="vertices2"></param>
 /// <param name="mtv"></param>
 /// <returns></returns>
 public bool MinimumTranslationVector(
     Vector2[] vertices1,
     Vector2[] vertices2,
     out MinimumTranslationVector? mtv)
 {
     double overlap = Double.PositiveInfinity; // really large value;
     Vector2 smallest = default(Vector2);
     Vector2[] axes1 = GetAxes(vertices1);
     Vector2[] axes2 = GetAxes(vertices2);
     // loop over the axes1
     for (int i = 0; i < axes1.Length; i++)
     {
         Vector2 axis = axes1[i];
         // project both shapes onto the axis
         Projection p1 = Project(vertices1, axis);
         Projection p2 = Project(vertices2, axis);
         // do the projections overlap?
         if (!p1.Overlap(p2))
         {
             // then we can guarantee that the shapes do not overlap
             mtv = default(MinimumTranslationVector?);
             return false;
         }
         else
         {
             // get the overlap
             double o = p1.GetOverlap(p2);
             // 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];
         // project both shapes onto the axis
         Projection p1 = Project(vertices1, axis);
         Projection p2 = Project(vertices2, axis);
         // do the projections overlap?
         if (!p1.Overlap(p2))
         {
             // then we can guarantee that the shapes do not overlap
             mtv = default(MinimumTranslationVector?);
             return false;
         }
         else
         {
             // get the overlap
             double o = p1.GetOverlap(p2);
             // check for minimum
             if (o < overlap)
             {
                 // then set this one as the smallest
                 overlap = o;
                 smallest = axis;
             }
         }
     }
     mtv = new MinimumTranslationVector(smallest, overlap);
     // if we get here then we know that every axis had overlap on it
     // so we can guarantee an intersection
     return true;
 }