public static bool DoSingleColision_Debug(Polygon MovingPoly, Polygon StationaryPoly, Velocity velocity, List <Vector2[]> lines, List <Color> linecolors) { Vector2[][] MovingLines = new Vector2[MovingPoly.NumberOfSides()][]; Vector2[][] StationaryLines = new Vector2[StationaryPoly.NumberOfSides()][]; bool doWork = false; for (int i = 0; i < MovingLines.Length; i++) { MovingLines[i] = new Vector2[] { velocity.Move(MovingPoly.GetCorner(i), -1f), velocity.Move(MovingPoly.GetCorner(i), 1f) }; lines.Add(MovingLines[i]); linecolors.Add(Color.Blue); if (!doWork && LocationManager.getBounds(MovingLines[i]).Intersects(StationaryPoly.Bounds)) { doWork = true; } } for (int i = 0; i < StationaryLines.Length; i++) { StationaryLines[i] = new Vector2[] { velocity.Move(StationaryPoly.GetCorner(i), -1f), velocity.Move(StationaryPoly.GetCorner(i), 1f) }; lines.Add(StationaryLines[i]); linecolors.Add(Color.Green); if (!doWork && LocationManager.getBounds(StationaryLines[i]).Intersects(MovingPoly.Bounds)) { doWork = true; } } if (!doWork) { foreach (Vector2[] v in LocationManager.RectangleEdges(MovingPoly.Bounds)) { lines.Add(v); linecolors.Add(Color.Yellow); } foreach (Vector2[] v in LocationManager.RectangleEdges(StationaryPoly.Bounds)) { lines.Add(v); linecolors.Add(Color.Yellow); } return(false); } int lowindex = -1; int otherindex = -1; float lowdistance = 0; bool movingcloser = false; Vector2 intersect = new Vector2(); for (int i = 0; i < MovingLines.Length; i++) { for (int i2 = 0; i2 < StationaryLines.Length; i2++) { Vector2?V2 = LocationManager.getIntersectionPoint(StationaryPoly.GetEdge(i2), MovingLines[i]); if (V2.HasValue) { if (lowindex == -1 || LocationManager.distanceCheck(V2.Value, MovingLines[i][0], lowdistance)) { lowdistance = LocationManager.getDistance(V2.Value, MovingLines[i][0]); lowindex = i; otherindex = i2; movingcloser = true; intersect = V2.Value; } } } } for (int i = 0; i < StationaryLines.Length; i++) { for (int i2 = 0; i2 < MovingLines.Length; i2++) { Vector2?V2 = LocationManager.getIntersectionPoint(MovingPoly.GetEdge(i2), StationaryLines[i]); if (V2.HasValue) { //Console.Out.WriteLine("Intersection at {0}::{1} => Point at {2}", MovingPoly.GetEdge(i2)[0] + "," + MovingPoly.GetEdge(i2)[1], StationaryLines[i][0] + "," + StationaryLines[i][1], V2.Value); if (lowindex == -1 || LocationManager.distanceCheck(V2.Value, StationaryLines[i][1], lowdistance)) { lowdistance = velocity.M - LocationManager.getDistance(V2.Value, StationaryLines[i][0]); lowindex = i; otherindex = i2; movingcloser = false; intersect = V2.Value; } } } } if (lowindex != -1) { Velocity AddToVelocity = new Velocity(); if (movingcloser) { float angle = LocationManager.getRotation(intersect, LocationManager.getReflectionLine(MovingLines[lowindex], StationaryPoly.GetEdge(otherindex))[1]); AddToVelocity.A = angle; AddToVelocity.M = velocity.M; lines.Add(new Vector2[] { MovingLines[lowindex][0], MovingLines[lowindex][1] }); linecolors.Add(Color.Red); } else { float angle = LocationManager.getRotation(intersect, LocationManager.getReflectionLine(StationaryLines[lowindex], MovingPoly.GetEdge(otherindex))[1]); AddToVelocity.A = angle; AddToVelocity.M = velocity.M; lines.Add(new Vector2[] { StationaryLines[lowindex][0], StationaryLines[lowindex][1] }); linecolors.Add(Color.Red); } velocity.X = AddToVelocity.X; velocity.Y = AddToVelocity.Y; MovingPoly.Position = LocationManager.moveByRotation(MovingPoly.Position, lowdistance, velocity.A); return(true); } return(false); }
public static bool DoSingleColision(Polygon MovingPoly, Polygon StationaryPoly, ref Vector2 velocity, bool isMA) { if (!isMA) { velocity = Physics.ConvertToMA(velocity); } Vector2[][] MovingLines = new Vector2[MovingPoly.NumberOfSides()][]; Vector2[][] StationaryLines = new Vector2[StationaryPoly.NumberOfSides()][]; for (int i = 0; i < MovingLines.Length; i++) { MovingLines[i] = new Vector2[] { LocationManager.moveByRotation(MovingPoly.GetCorner(i), -velocity.X, velocity.Y), LocationManager.moveByRotation(MovingPoly.GetCorner(i), velocity.X, velocity.Y) }; } for (int i = 0; i < StationaryLines.Length; i++) { StationaryLines[i] = new Vector2[] { /*StationaryPoly.GetCorner(i)*/ LocationManager.moveByRotation(StationaryPoly.GetCorner(i), velocity.X, velocity.Y), LocationManager.moveByRotation(StationaryPoly.GetCorner(i), -velocity.X, velocity.Y) }; } int lowindex = -1; int otherindex = -1; float lowdistance = 0; bool movingcloser = false; Vector2 intersect = new Vector2(); for (int i = 0; i < MovingLines.Length; i++) { for (int i2 = 0; i2 < StationaryLines.Length; i2++) { Vector2?V2 = LocationManager.getIntersectionPoint(StationaryPoly.GetEdge(i2), MovingLines[i]); if (V2.HasValue) { if (lowindex == -1 || LocationManager.distanceCheck(V2.Value, MovingLines[i][0], lowdistance)) { lowdistance = LocationManager.getDistance(V2.Value, MovingLines[i][0]); lowindex = i; otherindex = i2; movingcloser = true; intersect = V2.Value; } } } } for (int i = 0; i < StationaryLines.Length; i++) { for (int i2 = 0; i2 < MovingLines.Length; i2++) { Vector2?V2 = LocationManager.getIntersectionPoint(MovingPoly.GetEdge(i2), StationaryLines[i]); if (V2.HasValue) { //Console.Out.WriteLine("Intersection at {0}::{1} => Point at {2}", MovingPoly.GetEdge(i2)[0] + "," + MovingPoly.GetEdge(i2)[1], StationaryLines[i][0] + "," + StationaryLines[i][1], V2.Value); if (lowindex == -1 || LocationManager.distanceCheck(V2.Value, StationaryLines[i][1], lowdistance)) { lowdistance = velocity.X - LocationManager.getDistance(V2.Value, StationaryLines[i][0]); lowindex = i; otherindex = i2; movingcloser = false; intersect = V2.Value; } } } } if (lowindex != -1) { //Console.Out.WriteLine("Colis=> Lowindex: {0}, distance: {1}, whose:{2}", lowindex, lowdistance, movingcloser); Vector2 AddToVelocity = new Vector2(); if (movingcloser) { float angle = LocationManager.getRotation(intersect, LocationManager.getReflectionLine(MovingLines[lowindex], StationaryPoly.GetEdge(otherindex))[1]); AddToVelocity.Y = angle; AddToVelocity.X = velocity.X; } else { float angle = LocationManager.getRotation(intersect, LocationManager.getReflectionLine(StationaryLines[lowindex], MovingPoly.GetEdge(otherindex))[1]); AddToVelocity.Y = angle; AddToVelocity.X = -velocity.X; } velocity = AddToVelocity; MovingPoly.Position = LocationManager.moveByRotation(MovingPoly.Position, lowdistance - .4f, velocity.Y); if (!isMA) { velocity = Physics.ConvertToXY(velocity); } return(true); } if (!isMA) { velocity = Physics.ConvertToXY(velocity); } return(false); }