|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Поясните принцип работы функции Е.Елпанова lib:pline_clockwise
Регистрация: 22.01.2010
Сообщений: 311
|
||
Просмотров: 4795
|
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Конечно никто, кроме самого Евгения Алексеевича лучше не объяснит, но я так понял алгоритм:
1). (list MinP (list (car minp) (cadr MaxP)) MaxP (list (car MaxP) (cadr MinP))) - здесь понятно, координаты вершин прямоугольника в коротый вписана полилиния 2). lst - cписок значений параметров (vlax-curve-getParamAtPoint) для точек лежащих на нашей полилинии и являющихся ближайшими (vlax-curve-getClosestPointTo) к точкам вершин прямоугольника в коротый вписана полилиния 3). (if (or ...)) - если значения полученных параметров в списке lst увеличиваются по кругу (1-ый < 2-го, 2<3, 3<4 или 2<3 ... 4<1 и т.д.) - то полилиния идет по часовой стрелке, иначе против. P. S. Параметром кривой для полилинии является количество предыдущих участков от начала (целая часть параметра) и доля следующего участка (в дробной части). Таким образом, как я понял, такой алгоритм корректно работает для полилиний, которые не пересекают сами себя, выпуклость полилинии необязятельна
__________________
cadtools |
|||
![]() |
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
swkx, см. рисунок. В результате список lst = (4.0 0.409426 1.69041 2.82796) и мы проверяем:
4.0 < 0.409426 < 1.69041 < 2.82796 - нет 0.409426 < 1.69041 < 2.82796 < 4.0 - да, значит полилиния по часовой стрелке
__________________
cadtools |
|||
![]() |
|
||||
Рад, что вы стремитесь не только использовать библиотечные функции, но и понимать их суть!
![]() По сути вопроса: Во первых, спасибо TararykovDG за оперативную помощь. Действительно, алгоритм довольно прост, но он оказался гораздо более эффективным и применимым, чем альтернативные. 1. находим vla объект кривой Код:
Код:
Код:
Код:
Стоит пояснить физический смысл параметра для полилинии - это номер сегмента, которому принадлежит точка, т.е начальная точка и весь сегмент до следующей - это первый сегмент, т.е начальная точка имеет нулевой параметр, середина первого сегмента - 0.5 три четверти первого сегмента - 0.75, а вторая точка полилинии, всегда 2.0 и так далее, т.е каждый сегмент имеет в целых числах номер равный номеру сегмента, а в дроби, это какая часть от начала сегмента. Возможно я пояснил слишком подробно, но надеюсь понятно! ![]() Код:
(0 1 2 3) (1 2 3 0) (2 3 0 1) (3 0 1 2) (3 2 1 0) (2 1 0 3) (1 0 3 2) (0 3 2 1) Для более сложных полииний, да еще с дуговыми сегментами, списки будут другие, цифры могут быть дробные и даже несколько цифр может быть на одном сегменте и отличаться только в дроби. Для некоторых треугольников, возможно совпадение двух последовательных параметров. Но суть полученного списка, для непересекающегося контура будет именно такой! 6. теперь рассматриваем список параметров и разбираемся, числа идут по возрастанию или убыванию. Код:
ps. осталось добавить, что у других контуров, те. не lwpolyline, а 2d полилиний, сплайнов итд, так же есть свои параметры, они могут иметь другой физический смысл, но все равно они будут правильно обрабатываться этой программой! ![]() Цитата:
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ Последний раз редактировалось Елпанов Евгений, 20.06.2011 в 16:36. |
||||
![]() |
|
||||
Регистрация: 22.01.2010
Сообщений: 311
|
Цитата:
Теперь дошло. Спасибо всем большое! |
|||
![]() |
|
||||
swkx, мы так сформировали список - можно и наоборот...
К тому же, никто не мешает использовать в алгоритме другой контейнер, например другой внешний контур и определять направленны ли они в одну сторону или нет. Удачи! ![]()
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Offtop: ИХМО оптимальность кода определяется в первую очередь временем в течении которого им пользуются - все остальное вторично
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Еще пару алгоритмов и познавательная дискуссия: LISP, VBA. Изменение направления обхода точек в полилинии Цитата:
Недавно на cadtutor.net появилась подобная тема all polylinienrichtungen counterclockwise, где поучавствовала вышеприведенная ф-ция. Там опубликован еще один алгоритм, он более "затратный", но, по заявлению автора, позволяет обрабатывать пересекающиеся полилинии. Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 20.06.2011 в 23:06. Причина: орфография |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
А куда направленна линия начинающиеся по часовой стрлке, а заканчивающиеся против (даже без самопересечений)?
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Действительно, до 2005 года, я редко выкладывал свои коды. Нормальный интернет у меня появился только в 2004 году...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
DwgRuLispLib: Функции работы со строками | VVA | Библиотека функций | 8 | 31.05.2012 14:19 |
Принцип работы расширительной камеры | DK | Разное | 23 | 16.05.2009 17:38 |
Поиск работы | Perezz!! | Разное | 46 | 21.03.2008 12:50 |
функции для работы с ini-файлами | ivspec | Программирование | 4 | 08.08.2006 11:43 |
Особенности работы функции TRANS | kp+ | Программирование | 10 | 31.05.2006 00:55 |