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, Супермодераторы



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

Сейчас этот форум просматривают: Dmitriy40


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

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