/// <summary> /// /// </summary> /// <param name="selection"></param> /// <param name="points"></param> /// <param name="dx"></param> /// <param name="dy"></param> /// <returns></returns> public static bool Overlap(Vector2[] selection, IList <XPoint> points, double dx, double dy) { Vector2[] vertices = GetVertices(points, dx, dy); return(sat.Overlap(selection, vertices)); }
static void TestSat() { var sat = new SeparatingAxisTheorem(); // shape1 var shape1 = new Polygon(); shape1.Vertices = new Vector2[4]; shape1.Vertices[0] = new Vector2(0.0, 0.0); shape1.Vertices[1] = new Vector2(10.0, 0.0); shape1.Vertices[2] = new Vector2(10.0, 10.0); shape1.Vertices[3] = new Vector2(0.0, 10.0); // shape2 var shape2 = new Polygon(); shape2.Vertices = new Vector2[4]; // overlaps //shape2.Vertices[0] = new Vector2(5.0, 5.0); //shape2.Vertices[1] = new Vector2(20.0, 5.0); //shape2.Vertices[2] = new Vector2(20.0, 20.0); //shape2.Vertices[3] = new Vector2(5.0, 20.0); // do not overlaps //shape2.Vertices[0] = new Vector2(15.0, 5.0); //shape2.Vertices[1] = new Vector2(20.0, 5.0); //shape2.Vertices[2] = new Vector2(20.0, 20.0); //shape2.Vertices[3] = new Vector2(15.0, 20.0); // shape1 contains shape2 shape2.Vertices[0] = new Vector2(2.0, 2.0); shape2.Vertices[1] = new Vector2(8.0, 2.0); shape2.Vertices[2] = new Vector2(8.0, 8.0); shape2.Vertices[3] = new Vector2(2.0, 8.0); // sat get axes //var axes1 = sat.GetAxes(shape1.Vertices); //var axes2 = sat.GetAxes(shape2.Vertices); //Console.WriteLine("axes1:"); //foreach(var axis in axes1) Console.WriteLine(axis); //Console.WriteLine("axes2:"); //foreach(var axis in axes2) Console.WriteLine(axis); // sat overlap bool overlap = sat.Overlap(shape1.Vertices, shape2.Vertices); Console.WriteLine("overlap: " + overlap); //TestSatProjectionGetOverlap(); // sat mtv MinimumTranslationVector?mtv; bool overlapMTV = sat.MinimumTranslationVector( shape1.Vertices, shape2.Vertices, out mtv); Console.WriteLine("overlapMTV: " + overlapMTV); if (mtv.HasValue) { Console.WriteLine("mtv.overlap: " + mtv.Value.Overlap); Console.WriteLine("mtv.smallest: " + mtv.Value.Smallest); } // sat mtv with containment MinimumTranslationVector?mtvContainment; bool overlapMTVContainment = sat.MinimumTranslationVectorWithContainment( shape1.Vertices, shape2.Vertices, out mtvContainment); Console.WriteLine("overlapMTVContainment: " + overlapMTVContainment); if (mtv.HasValue) { Console.WriteLine("mtvContainment.overlap: " + mtvContainment.Value.Overlap); Console.WriteLine("mtvContainment.smallest: " + mtvContainment.Value.Smallest); } }