Разработать программу, которая определяет, пересекаются ли две окружности или нет.
Входные данные для программы: координаты центров окружностей и их радиусы. Выходные данные: строка «окружности пересекаются» или «окружности не пересекаются» в зависимости от входных данных. В случае пересечения вывести количество точек пересечения.
Код программы для определения пересекаются окружности или нет
using System;
// Точка
public class Point
{
public Point(double x, double y)
{
X = x;
Y = y;
}
public double X { get; private set; }
public double Y { get; private set; }
// Расстояние до точки
public double DistanceTo(Point other)
{
return Math.Sqrt(Math.Pow(X - other.X, 2) + Math.Pow(Y - other.Y, 2));
}
}
// Пересечение
public enum Intersect
{
NotIntersect,
OnePoint,
TwoPoint,
Same
}
// Окружность
public class Circle
{
public Circle(double x, double y, double r) : this(new Point(x, y), r)
{
}
public Circle(Point center, double radius)
{
Center = center;
Radius = radius;
}
public Point Center { get; private set; }
public double Radius { get; private set; }
public Intersect IntersectWith(Circle other)
{
Intersect result;
var distance = Center.DistanceTo(other.Center);
// Окружности совпадают (это одна и та же окружность)
if (distance == 0 && Radius == other.Radius)
{
result = Intersect.Same;
}
// Окружности не касаются друг друга
else if (distance > Radius + other.Radius)
{
result = Intersect.NotIntersect;
}
// Одна окружность содержится внутри другой и не касается ее
else if (distance < Math.Abs(Radius - other.Radius))
{
result = Intersect.NotIntersect;
}
// Окружности соприкасаются в одной точке
else if ((distance == Radius + other.Radius) || (distance == Math.Abs(Radius - other.Radius)))
{
result = Intersect.OnePoint;
}
// Окружности пересекаются в двух точках
else
{
result = Intersect.TwoPoint;
}
return result;
}
}
class Program
{
private static Circle CircleFromConsole(string name)
{
Console.Write("Введите координату X центра окружности {0}: ", name);
var x = double.Parse(Console.ReadLine());
Console.Write("Введите координату Y центра окружности {0}: ", name);
var y = double.Parse(Console.ReadLine());
var p = new Point(x, y);
Console.Write("Введите радиус окружности {0}: ", name);
var radius = double.Parse(Console.ReadLine());
return new Circle(p, radius);
}
private static string IntersectToString(Intersect intersect)
{
switch (intersect)
{
case Intersect.NotIntersect:
return "Окружности не пересекаются";
case Intersect.OnePoint:
return "Окружности соприкасаются в одной точке";
case Intersect.TwoPoint:
return "Окружности пересекаются в двух точках";
case Intersect.Same:
return "Окружности совпадают";
default: throw new ArgumentException();
}
}
public static void Main()
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
var a = CircleFromConsole("A");
var b = CircleFromConsole("B");
var intersectResult = a.IntersectWith(b);
Console.WriteLine(IntersectToString(intersectResult));
Console.ReadLine();
}
}