Перетин кіл

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

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

Код програми для визначення перетинаються кола чи ні

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

Дивіться також: