Пересечение окружностей

Разработать программу, которая определяет, пересекаются ли две окружности или нет.

Входные данные для программы: координаты центров окружностей и их радиусы. Выходные данные: строка «окружности пересекаются» или «окружности не пересекаются» в зависимости от входных данных. В случае пересечения вывести количество точек пересечения.

Код программы для определения пересекаются окружности или нет

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();
    }
}

Смотрите также: