Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 19-12-2017, 14:24:30

Название: Сортировка набора точек по ходу полилинии
Отправлено: Алексей (IdeaSoft) от 19-12-2017, 14:24:30
Есть исходной 2d-полилиния которая пересекается с перечнем примитивов.
В результате я получаю набор точек пересечения, которые
мне нужно сортировать от начала до конца 2d-полилинии.

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

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

Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 14:30:13
Я думаю, что лучше брать GetParameterAtPoint()
Создать словарь Dictionary<double, Point3d>, где ключом будет параметр, а значением - точка. Затем просто отсортировать словарь, используя метод OrderBy по ключу. Метода Sort нету у словаря
Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 14:33:39
Что-то типа того
Код - 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.  
Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Дмитрий Загорулькин от 19-12-2017, 15:22:19
Создать словарь Dictionary<double, Point3d>
А если попадутся совпадающие точки? :)
Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 15:24:11
Создать словарь Dictionary<double, Point3d>
А если попадутся совпадающие точки? :)
Ну этого легко избежать, удалив дубликаты из начальной коллекции точек
Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Дмитрий Загорулькин от 19-12-2017, 15:35:25
Всё не так просто из-за точности чисел с плавающей точкой. Эта погрешность может вылезти и при сравнении точек, и при получении параметра полилинии. Зачем усложнять?
Код - C# [Выбрать]
  1. intersectedPoints.OrderBy(pt => pline.GetParameterAtPoint(pt)).ToArray();
Название: Re: Сортировка набора точек по ходу полилинии
Отправлено: Александр Пекшев aka Modis от 19-12-2017, 15:37:40
Всё не так просто из-за точности чисел с плавающей точкой. Эта погрешность может вылезти и при сравнении точек, и при получении параметра полилинии. Зачем усложнять?
Код - C# [Выбрать]
  1. intersectedPoints.OrderBy(pt => pline.GetParameterAtPoint(pt)).ToArray();
Хороший вариант! Что-то мне в голову не пришел)