Сортировка набора точек по ходу полилинии

Автор Тема: Сортировка набора точек по ходу полилинии  (Прочитано 5864 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Есть исходной 2d-полилиния которая пересекается с перечнем примитивов.
В результате я получаю набор точек пересечения, которые
мне нужно сортировать от начала до конца 2d-полилинии.

Есть ли в AutoCAD API готовое решение?

Или все же мне нужно применить функцию
pl.GetDistAtPoint(), которая возвращает расстояние
от начала полилинии то заданной точки


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я думаю, что лучше брать GetParameterAtPoint()
Создать словарь Dictionary<double, Point3d>, где ключом будет параметр, а значением - точка. Затем просто отсортировать словарь, используя метод OrderBy по ключу. Метода Sort нету у словаря

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что-то типа того
Код - C# [Выбрать]
  1. Polyline pline = new Polyline();
  2. List<Point3d> intersectedPoints = new List<Point3d>();
  3. Dictionary<double, Point3d> dictionary = new Dictionary<double, Point3d>();
  4. foreach (Point3d point in intersectedPoints)
  5. {
  6.     dictionary.Add(pline.GetParameterAtPoint(point), point);
  7. }
  8. var sortedPoints = dictionary.OrderBy(k => k.Key).ToList();
  9.  
  10. foreach (KeyValuePair<double, Point3d> keyValuePair in sortedPoints)
  11. {
  12.     var point = keyValuePair.Value;
  13. }
  14.  

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Создать словарь Dictionary<double, Point3d>
А если попадутся совпадающие точки? :)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Создать словарь Dictionary<double, Point3d>
А если попадутся совпадающие точки? :)
Ну этого легко избежать, удалив дубликаты из начальной коллекции точек

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Всё не так просто из-за точности чисел с плавающей точкой. Эта погрешность может вылезти и при сравнении точек, и при получении параметра полилинии. Зачем усложнять?
Код - C# [Выбрать]
  1. intersectedPoints.OrderBy(pt => pline.GetParameterAtPoint(pt)).ToArray();

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всё не так просто из-за точности чисел с плавающей точкой. Эта погрешность может вылезти и при сравнении точек, и при получении параметра полилинии. Зачем усложнять?
Код - C# [Выбрать]
  1. intersectedPoints.OrderBy(pt => pline.GetParameterAtPoint(pt)).ToArray();
Хороший вариант! Что-то мне в голову не пришел)