Соединить 4 точки ломаной линией без пересечений - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, вопрос заключается в следующем: Пользователь вводит координаты 4-х точек на плоскости, необходимо максимально простым способом соединить эти точки ломаной линией в четырехугольник без пересечений между линиями. Я набросал оболочку программы, но когда дело дошло до алгоритма соединения ничего не выходит. Помогите пожалуйста написать адекватно работающую функцию GetNext() которая определяет след. точку. Я определяю крайнюю левую точку и двигаюсь от неё.
    class DotsConnecter
    {
        private dot[] dots;
 
        public DotsConnecter()
        {
            dots = new dot[4];
        }
 
        private struct dot
        {
            public double x;
            public double y;
            public bool isActive;
            public int id;
        }
 
        public void Start()
        {
            Console.WriteLine("Hello World!");
 
            GetDots();
            ShowResults(ConnectDots());
 
        }
 
        private void GetDots()
        {
            Console.WriteLine("Enter coordinates of your points:");
 
            for (byte i = 0; i < 4; i++)
            {
                Console.Write("dot" + (i + 1).ToString() + ".x = ");
                dots[i].x = Convert.ToDouble(Console.ReadLine());
                Console.Write("dot" + (i + 1).ToString() + ".y = ");
                dots[i].y = Convert.ToDouble(Console.ReadLine());
 
                dots[i].isActive = true;
                dots[i].id = i + 1;
            }
        }
 
        private dot[] ConnectDots()
        {
            dot[] sequence = new dot[5];
            sequence[0] = GetLeft();
            sequence[4] = sequence[0];
            sequence[1] = dots[GetNext(sequence[0])];
            sequence[2] = dots[GetNext(sequence[1])];
            for (byte i = 0; i < 4; i++)
                if (dots[i].isActive == true)
                {
                    sequence[3] = dots[i];
                    dots[i].isActive = false;
                }
 
            return sequence;
        }
 
        private void ShowResults(dot[] sequence)
        {
            Console.WriteLine("It will be:");
            Console.Write(
                "dot" + sequence[0].id + "->" +
                "dot" + sequence[1].id + "->" +
                "dot" + sequence[2].id + "->" +
                "dot" + sequence[3].id + "->" +
                "dot" + sequence[4].id
            );
        }
 
        private double Angle(dot a, dot b)
        {
            if (a.x == b.x)
                if (a.y < b.y)
                    return Math.PI / 2;
                else
                    return Math.PI / (-2);
            else
                if (a.y == b.y)
                    if (a.x < b.x)
                        return 0;
                    else
                        return Math.PI;
                else
                    return Math.Atan((b.y - a.y) / (b.x - a.x));
        }
 
        private dot GetLeft()
        {
            dot min = dots[0];
            byte j = 0;
 
            for (byte i = 1; i < 4; i++)
                if (dots[i].x < min.x)
                {
                    min = dots[i];
                    j = i;
                }
 
            dots[j].isActive = false;
            return min;
        }
 
        private byte GetNext(dot a)
        {
            byte j = 0;
            double maxAngle = 0;
            double currentAngle = 0;
 
            for (byte i = 0; i < 4; i++)
            {
                if (dots[i].isActive == true)
                {
                    currentAngle = Math.Abs(Angle(a, dots[i]));
 
                    if (maxAngle < currentAngle)
                    {
                        j = i;
                        maxAngle = currentAngle;
                    }
                }
            }
 
            dots[j].isActive = false;
            return j;
        }
    }

Решение задачи: «Соединить 4 точки ломаной линией без пересечений»

textual
Листинг программы
struct dot
{
    public double x;
    public double y;
    public bool isActive;
    public int id;
 
    public override string ToString()
    {
        return string.Format("x={0}; y={1}", x, y);
    }
}
 
class Program
{
    static IEnumerable<dot> Foo(dot[] dots)
    {
        return dots.Take(1).Union(
            dots.Skip(1).OrderBy(dot => 
                Math.Atan2(dot.x - dots[0].x, dot.y - dots[0].y)));
    }
 
    static void Main()
    {
        dot[] dots = {
            new dot() { x = 1, y = 1 },
            new dot() { x = 3, y = 3 },
            new dot() { x = 5, y = 1 },
            new dot() { x = 2, y = 3 },
            new dot() { x = 4, y = 2 }
        };
 
        foreach(var dot in Foo(dots))
        {
            Console.WriteLine(dot);
        }
            
        Console.ReadLine();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5
Похожие ответы