bool GetSlidePositionOffBlock(Point2 LastPosition, Point2 newPosition, Point2 tileCentre, int tileSize, float radius, ref Point2 slidePosition) { bool basicMethod = true; if (basicMethod) { OgreMaths.Point[] positions = new OgreMaths.Point[4]; Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize + radius * 2); l_tile.GetLine((int)Box.Corner.TOP_LEFT); positions[0] = new OgreMaths.Point(newPosition); positions[0].x = Math.Min(newPosition.X, l_tile.corners[(int)Box.Corner.TOP_LEFT].x); positions[1] = new OgreMaths.Point(newPosition); positions[1].y = Math.Min(newPosition.Y, l_tile.corners[(int)Box.Corner.TOP_LEFT].y); positions[2] = new OgreMaths.Point(newPosition); positions[2].x = Math.Max(newPosition.X, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].x); positions[3] = new OgreMaths.Point(newPosition); positions[3].y = Math.Max(newPosition.Y, l_tile.corners[(int)Box.Corner.BOTTOM_RIGHT].y); int shortestLengthIndex = 0; float shortestLength = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[0]); for (int i = 0; i < 4; i++) { float length = OgreMaths.Point.DistanceSquared(new OgreMaths.Point(newPosition), positions[i]); if (length < shortestLength) { shortestLength = length; shortestLengthIndex = i; } } slidePosition = new Point2(positions[shortestLengthIndex]); return true; } else { Box l_tile = new Box(new OgreMaths.Point(tileCentre), tileSize); Line l_vectorIn = new Line(new OgreMaths.Point(LastPosition), new OgreMaths.Point(newPosition.X, newPosition.Y)); OgreMaths.Point l_vectorNormalised = l_vectorIn.GetNormalisedVector(); l_vectorIn.b += l_vectorNormalised.Mult(radius); Line lineChosen = new Line(); OgreMaths.Point intersect = new OgreMaths.Point(); OgreMaths.Point reflectionPoint = new OgreMaths.Point(); bool intersectionHappened = Box.CalcReflectVectorWithBox(new OgreMaths.Point(tileCentre), tileSize, l_vectorIn, ref reflectionPoint, ref intersect); if (intersectionHappened) { OgreMaths.Point reflectVec = reflectionPoint - intersect; reflectVec.Normalise(); slidePosition = new Point2(intersect + reflectVec.Mult(radius + 4.5f)); } /* if (intersectionHappened) { OgreMaths.Point vecDir = l_vectorIn.GetVector(); OgreMaths.Point newDirection = lineChosen.GetVector(); float temp = newDirection.x; newDirection.x = newDirection.y; newDirection.y = newDirection.x; newDirection.x = Math.Abs(newDirection.x) * vecDir.x / -Math.Abs(vecDir.x); newDirection.y = Math.Abs(newDirection.y) * vecDir.y / -Math.Abs(vecDir.y); OgreMaths.Point directionApplied = intersect + newDirection; slidePosition = new Point2(intersect);//directionApplied); slidePosition = new Point2(directionApplied); } */ return intersectionHappened; } }