2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Пересечение многоугольников.
Сообщение26.04.2007, 23:02 


30/06/06
313
На плоскости заданы координатами своих вершин два многоугольника (необязательно выпуклых). Как можно определить, пересекаются ли они?

 Профиль  
                  
 
 
Сообщение26.04.2007, 23:30 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Вас интересует алгорифм? Для компа? Тогда это — вычислительная геометрия, и ее лучше переместить в «Computer Science».

Один из подходов (сложность $\Theta(n \times m)$: просто проверяете попарное пересечение отрезков. Обычно это организовывают при помощи алфавитного упорядоченного отрезков. (я обычно рекомендую книгу Препарата Ф., Шеймос М. — Вычислительная геометрия: введение).

 Профиль  
                  
 
 
Сообщение27.04.2007, 00:17 


24/03/07
321
Рассмотрения попарного пересечения отрезков не хватит, один многоугольник может лежать в другом (я так понимаю тогда тоже имеет место пересечение). В этом случае нужно брать точку одного многоугольника и смотреть, лежит ли она в другом. Это не очень сложно делается. Проводим через эту точку луч. Если он пересекает границу многоугольника в нечетном числе точек(вершина считается за две) - значит взятая точка лежит внутри, иначе - снаружи.

 Профиль  
                  
 
 
Сообщение27.04.2007, 00:38 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Dandan писал(а):
Рассмотрения попарного пересечения отрезков не хватит

Тоже верно. :oops:

Dandan писал(а):
пересекает нечетном числе точек(вершина считается за две)

С этим нужно поосторожнее. Намного поосторожнее. Потому как возможны два варианта (1) луч касается ломаной внешним образом (считаем два раза); (2) пересекает ломаную (считаем один раз). Проще всего этого избежать, выбрав луч не проходящий ни через одну из точек. Благо в выборе луча мы свободны. Альтернатива (может быть и много лучшая): смотреть, находятся ли свободные концы отрезков в разных полуплоскостях. Плюс проверять на еще одну радость, лежащие на луче отрезки (их выбрасываем, но как-бы совмещаем смежные с ними).

Итого, суммарный алгорифм выглядит так: быстро проверяем вложенность многоугольника $A$ в $B$, потом $B$ в $A$. Если не повезло и ответа не получили, гоним пересечение отрезков.

Еще один вопрос, требующий некоторого внимания, это возможность самопересечения ломаной (границы многоугольника). В случае, если это возможно, есть разные определения того, что значит внутри многоугольника.

 Профиль  
                  
 
 
Сообщение27.04.2007, 08:37 
Заслуженный участник
Аватара пользователя


11/04/07
1352
Москва
Проверять в лоб требует значительного количества операций. Как предиктор,проще вычислить центр тяжести по отрезкам многоугольников и средний радиус.

 Профиль  
                  
 
 
Сообщение27.04.2007, 10:39 


22/04/06
144
СПб (Тула)
любой многоугольник можно представить в виде объединения конечного числа треугольников - провести триангуляцию. А для треугольника проверить принадлежность точки не трудно

По поводу же определения, лежит ли точка внутри многоугольника, в википедии есть статья Алгоритм точки в многоугольнике
PS. незваный гость, спасибо за книгу

проверяйте отображение ссылок // нг

 Профиль  
                  
 
 
Сообщение27.04.2007, 14:30 
Заслуженный участник
Аватара пользователя


23/07/05
17973
Москва
Dandan писал(а):
(вершина считается за две)


Это неправильно. Иногда за две, а иногда за одну. А ещё целая сторона может лежать на этом луче, и не одна... Лучше выбирать луч, не проходящий через вершины.

 Профиль  
                  
 
 
Сообщение27.04.2007, 20:11 


24/03/07
321
ну да, да, уже писали, что лучше чтобы луч не проходил через вершины и был непараллелен сторонам :)

 Профиль  
                  
 
 
Сообщение08.05.2007, 19:05 


08/05/07
4
ХАИ
а может лучше так:
берете, описываете множество неравенствами вида k*x+b<=y
потом решаете полученную систему чем-нибудь(хоть бы симплекс-метод). И узнаете, есть ли точки принадлежащие этому множеству.

 Профиль  
                  
 
 
Сообщение17.10.2007, 05:47 


17/10/07
1
Привет,

Давным давно (около 30 лет назад) я разработал алгоритм и написал программу нахождения общей области двух произвольных многоугольников. Если интересно, могу вспомнить основные решения. В ответе получается новый многоугольник, который принадлежит обоим исходным многоугольникам одновременно, если таковой имеется.

В основе алгоритма лежал алгоритм нахождения общей области отрезка и многоугольника. Этот же алгоритм может быть использован в вашем случае.

Проверяете все стороны первого многоугольника на пересечение со вторым многоугольником и наоборот. Проверку можно закончить при обнаружении первого пересечения.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group