/// <summary> /// Returns the two intersection points between two circles. /// </summary> public static Vector2[] CircleCircleIntersection(Vector2 center1, Vector2 center2, float radius1, float radius2) { var D = center1.Distance7(center2); //The Circles dont intersect: if (D > radius1 + radius2 || (D <= Math.Abs(radius1 - radius2))) { return new Vector2[] { }; } var A = (radius1 * radius1 - radius2 * radius2 + D * D) / (2 * D); var H = (float)Math.Sqrt(radius1 * radius1 - A * A); var Direction = (center2 - center1).Normalized2(); var PA = center1 + A * Direction; var S1 = PA + H * Direction.Perpendicular2(); var S2 = PA - H * Direction.Perpendicular2(); return new[] { S1, S2 }; }
internal static Vector2[] GetCandidates(Vector2 from, Vector2 to, float radius, float range) { var middlePoint = (from + to) / 2; var intersections = Geometry2.CircleCircleIntersection( from, middlePoint, radius, from.Distance7(middlePoint)); if (intersections.Length > 1) { var c1 = intersections[0]; var c2 = intersections[1]; c1 = from + range * (to - c1).Normalized2(); c2 = from + range * (to - c2).Normalized2(); return new[] { c1, c2 }; } return new Vector2[] { }; }