|
||
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
подниму темку, чтоб не создавать новую... Собственно сабж: Допустим есть некий контур (р1 р2 ... рn) и есть прямоугольник, заданный списком (list (list x y) width height). Необходимо определить, лежит ли прямоугольник внутри контура, находится ли за его пределами или пересекает контур, причем прямоугольник может иметь вершины на границе контура. Это меня больше всего смущает, так как проверка принадлежности вершин прямоугольника контуру не работает
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Контур и прямоугольник существуют в чертеже или они "виртуальные"?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Регистрация: 18.12.2010
Сообщений: 5,051
|
|
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
не ругайся, можешь популярно на пальцах объяснить метод? |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Если у тебя контур не содержит дуговых сегментов, то чем не устраивает inters ?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
В таком случае inters возвращает точку, лежащую на прямой, насколько я помню.
P.S. Только что проверил - так и есть: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,840
|
Если это не метод который надо крутить миллионами раз друг к другу - то создаешь две области (Region) и делаешь вычитание их копий. Если кто-то пропадает - то он внутри другого. Остаются как есть - без пересечения иначе - пересекаются.
з.ы. случайно не на "сетку" режешь? в конце темы код и описание
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
Цитата:
Если по хорошему не получится, придется рисовать и удалять, но мне это не очень нравится, должен быть математический путь |
|||
|
||||
Регистрация: 05.11.2015
Сообщений: 585
|
Цитата:
(в качестве доп. идеи): Код:
|
|||
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,833
|
Владимир_М, это предполагает построение примитивов, чего хотелось бы избежать
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
|
||||
КМД Регистрация: 26.03.2013
Я ЖЫВУ В РОССИИ.
Сообщений: 506
|
Цитата:
http://mysimpleengeneeringsolutions....-continue.html работает с помощью Clipper http://www.angusj.com/delphi/clipper.php Clipper, в свою очередь, основан на Алгоритме Ваати https://en.wikipedia.org/wiki/Vatti_clipping_algorithm Алгоритм Ваати основан на понятии "ветрянных чисел" - это как раз о количестве пересечений контура лучом из точки... "A generic solution to polygon clipping", Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. - платная статья(15$), но у автора появились другие ссылки - http://www.me.berkeley.edu/~mcmains/...setPolygon.pdf алгоритм работает и с дугами, и с отверстиями, устраняет самопересечения в контуре, позволяет пользоваться оффсетом, доступен на питоне дельфи плюсах, шарпе... Проект жив и развивается: http://codepen.io/timo22345/pen/LpEbWB?editors=101 Последний раз редактировалось hexD, 31.05.2016 в 10:34. |
|||
|
||||
Вроде как алгоритм работает. Зеленые - внутри контура, черные - вне, красный - частично в контуре
Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 31.05.2016 в 19:57. |
||||
|
||||
Изменил алгоритм построения луча в mip_IsPointInside. Там получалось, что луч строился горизонтально, 3-я вершина контура с координатами 128,64 лежала на этом луче. Поэтому две примыкающие стороны давали перечение. В итоге получалось 2 пересечения, хотя контур пересекается один раз в вершине. Четное количество пересечений - точка вне контура.
Обновил #54 Тестируй.
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
||||
Регистрация: 21.07.2008
Луцьк
Сообщений: 179
|
можно еще попробовать вот это http://www.cadtutor.net/forum/showth...l=1#post263330
там немного другой способ |
|||
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
|
|||
|
||||
В этом случае mip_IsPointInside вернет список из одного T и трех NIL. Добавил проверку в #54
----- добавлено через ~12 ч. ----- *** Добавлено *** Для упрощения анализа можно "обернуть" функцию mip_IsPointInside, которая будет возвращать не T или NIL, а 1 или 0. И анализировать сумму чисел полученного списка( 0 - не в контуре, 1 - касается одной точкой или одна точка в контуре (недостающие ф-ции в #54) Код:
__________________
Как использовать код на Лиспе читаем здесь Последний раз редактировалось VVA, 01.06.2016 в 08:19. |
||||
|
||||
*** Добавлено2 ***
В таком случае синий и зеленый квадрат будут считаться не в контуре. Это правильно?
__________________
Как использовать код на Лиспе читаем здесь |
||||
|
Опции темы | Поиск в этой теме |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Справка по форуму | Admin | FAQ: Часто задаваемые вопросы | 13 | 04.03.2014 11:12 |
У меня вопрос по Ansys, как правильно оформить контакт с жестким телом? | Цветочек | ANSYS | 17 | 10.11.2013 09:41 |
Проектирование человека. | FOXAL | Разное | 283 | 25.05.2010 09:52 |
Вопрос: Интерактивное построение полилинии внутри lisp-программы | Tonic | LISP | 5 | 26.04.2010 15:50 |
Как определить, что точка за пределами видимой области? VBA | den001 | Программирование | 6 | 20.01.2007 20:48 |