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

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

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

Доброго времени суток, вопрос заключается в следующем: Пользователь вводит координаты 4-х точек на плоскости, необходимо максимально простым способом соединить эти точки ломаной линией в четырехугольник без пересечений между линиями. Я набросал оболочку программы, но когда дело дошло до алгоритма соединения ничего не выходит. Помогите пожалуйста написать адекватно работающую функцию GetNext() которая определяет след. точку. Я определяю крайнюю левую точку и двигаюсь от неё.
Листинг программы
  1. class DotsConnecter
  2. {
  3. private dot[] dots;
  4. public DotsConnecter()
  5. {
  6. dots = new dot[4];
  7. }
  8. private struct dot
  9. {
  10. public double x;
  11. public double y;
  12. public bool isActive;
  13. public int id;
  14. }
  15. public void Start()
  16. {
  17. Console.WriteLine("Hello World!");
  18. GetDots();
  19. ShowResults(ConnectDots());
  20. }
  21. private void GetDots()
  22. {
  23. Console.WriteLine("Enter coordinates of your points:");
  24. for (byte i = 0; i < 4; i++)
  25. {
  26. Console.Write("dot" + (i + 1).ToString() + ".x = ");
  27. dots[i].x = Convert.ToDouble(Console.ReadLine());
  28. Console.Write("dot" + (i + 1).ToString() + ".y = ");
  29. dots[i].y = Convert.ToDouble(Console.ReadLine());
  30. dots[i].isActive = true;
  31. dots[i].id = i + 1;
  32. }
  33. }
  34. private dot[] ConnectDots()
  35. {
  36. dot[] sequence = new dot[5];
  37. sequence[0] = GetLeft();
  38. sequence[4] = sequence[0];
  39. sequence[1] = dots[GetNext(sequence[0])];
  40. sequence[2] = dots[GetNext(sequence[1])];
  41. for (byte i = 0; i < 4; i++)
  42. if (dots[i].isActive == true)
  43. {
  44. sequence[3] = dots[i];
  45. dots[i].isActive = false;
  46. }
  47. return sequence;
  48. }
  49. private void ShowResults(dot[] sequence)
  50. {
  51. Console.WriteLine("It will be:");
  52. Console.Write(
  53. "dot" + sequence[0].id + "->" +
  54. "dot" + sequence[1].id + "->" +
  55. "dot" + sequence[2].id + "->" +
  56. "dot" + sequence[3].id + "->" +
  57. "dot" + sequence[4].id
  58. );
  59. }
  60. private double Angle(dot a, dot b)
  61. {
  62. if (a.x == b.x)
  63. if (a.y < b.y)
  64. return Math.PI / 2;
  65. else
  66. return Math.PI / (-2);
  67. else
  68. if (a.y == b.y)
  69. if (a.x < b.x)
  70. return 0;
  71. else
  72. return Math.PI;
  73. else
  74. return Math.Atan((b.y - a.y) / (b.x - a.x));
  75. }
  76. private dot GetLeft()
  77. {
  78. dot min = dots[0];
  79. byte j = 0;
  80. for (byte i = 1; i < 4; i++)
  81. if (dots[i].x < min.x)
  82. {
  83. min = dots[i];
  84. j = i;
  85. }
  86. dots[j].isActive = false;
  87. return min;
  88. }
  89. private byte GetNext(dot a)
  90. {
  91. byte j = 0;
  92. double maxAngle = 0;
  93. double currentAngle = 0;
  94. for (byte i = 0; i < 4; i++)
  95. {
  96. if (dots[i].isActive == true)
  97. {
  98. currentAngle = Math.Abs(Angle(a, dots[i]));
  99. if (maxAngle < currentAngle)
  100. {
  101. j = i;
  102. maxAngle = currentAngle;
  103. }
  104. }
  105. }
  106. dots[j].isActive = false;
  107. return j;
  108. }
  109. }

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

textual
Листинг программы
  1. struct dot
  2. {
  3.     public double x;
  4.     public double y;
  5.     public bool isActive;
  6.     public int id;
  7.  
  8.     public override string ToString()
  9.     {
  10.         return string.Format("x={0}; y={1}", x, y);
  11.     }
  12. }
  13.  
  14. class Program
  15. {
  16.     static IEnumerable<dot> Foo(dot[] dots)
  17.     {
  18.         return dots.Take(1).Union(
  19.             dots.Skip(1).OrderBy(dot =>
  20.                 Math.Atan2(dot.x - dots[0].x, dot.y - dots[0].y)));
  21.     }
  22.  
  23.     static void Main()
  24.     {
  25.         dot[] dots = {
  26.             new dot() { x = 1, y = 1 },
  27.             new dot() { x = 3, y = 3 },
  28.             new dot() { x = 5, y = 1 },
  29.             new dot() { x = 2, y = 3 },
  30.             new dot() { x = 4, y = 2 }
  31.         };
  32.  
  33.         foreach(var dot in Foo(dots))
  34.         {
  35.             Console.WriteLine(dot);
  36.         }
  37.            
  38.         Console.ReadLine();
  39.     }
  40. }

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


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

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

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы