|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Вопрос по сортировке списка отрезков и дуг, составляющих единое целое
Воронеж
Регистрация: 26.06.2007
Сообщений: 151
|
||
Просмотров: 3208
|
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Хорошая функция - я её использовал. Но в данном случае она не подходит, т.к. на самом деле точки последовательных сегментов (отрезков и дуг) на чертеже не совпадают (они разорваны другими отрезками), однако содержат в расширенных данных величину дистанции от начальной и конечной точки до предполагаемого реального конца или начала, как если бы не было разрыва. Поэтому полученные в списке точки я получил, добавивив эти данные, если они есть, к данным о конце/начале сегмента. Так что операцию сортировки нужно выполнять только по имеющемуся списку...
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Tonic, Там есть алгоритм. Просто тебе нужно изменить способ получения координат. Вместо vlax-curve-getStartPoint взять точку из твоего списка.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Да, что-то я невнимательно прочитал...
Но это огромная функция. Неужели нет способа сортировки средствами vl-sort? Я представляю, что нужно найти сегмент, не имеющий одной общей точки с другими (таких два - первый и последний), а потом от него сортировать в другую сторону: если у какого-то отрезка совпадает с ним точка, он будет вторым, у следующего совпадает точка со вторым - сделаем его третьим и т.д. Что-то вроде (vl-sort lines_list (function (lambda (x1 x2) (equal (nth 1 x1) (nth 1 x2) 1)))) для приведённого выше списка. Ну, только эта строка не работает, конечно =) P.S. Пока что самый короткий путь, который я придумал, выглядит так: 1. В цикле repeat поиск точки и соответствующего ей примитива, которая не свопадает ни с одной другой. Это будет начало или конец плеяды сегментов; 2. В цикле ищем последовательно точки, совпадающие с предыдущими точками примитива, и добавляем этот примитив следующим в список. Последний раз редактировалось Tonic, 22.04.2009 в 16:23. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Tonic, Есть. Написать свою функцию.
Код:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Можно попробывать так
Код:
Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 27.04.2009 в 12:21. Причина: Добавлена fuzz |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
VVA, вложенный mapcar - это не так просто понять, а тем более написать =) В приведённой выше функции получается нужный список, но я попробовал список с реальными примитивами - и не получилось:
Код:
Код:
то функция нормально не срабатывает! |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
На твоем примере она срабатывает нормально. Имелось ввиду, что
Цитата:
В своем примере таких 2 Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
Нет-нет, я имел ввиду немного другое: приведённый список из 3 элементов должен был показать другое, а именно имена примитивов вместо строк "Имя1", "Имя2" и т.д. Т.е. пусть имеется последовательность отрезков/дуг; указывая точкой на один из сегментов, мы получаем итоговый список в виде ((<Имя объекта: aaaaaaaa> (x1 y1 z1) (x2 y2 z2)) ...), и в этом случает у меня функция не заработала - выдала список из 4 элементов (на самом деле в первоначальном списке их было 9!), а вот с искусственным случаем, когда вместо имени примитива стоит строка "имяN", всё работает на "ура".
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Tonic, Если я скопирую твой список с форума, то получу как раз список из 4 элементов.
Цитата:
Код:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 26.06.2007
Воронеж
Сообщений: 151
|
VVA, спасибо за помощь! Кстати, я понял эту хитрую проблему - дело было в ошибке в строке:
Код:
Код:
|
|||
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Отрисовка произвольной трассы из отрезков и дуг. | Profan | Готовые программы | 40 | 02.08.2011 14:35 |