2014 dxdy logo

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

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


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 определение вложенности фигур
Сообщение21.05.2021, 09:59 


21/05/21
8
Здравствуйте, пробую найти способ разделения пересекающихся фигур в 2D плоскости, пример указан во вложенном файле. Известны все координаты фигур. Если у фигур есть точки пересечения или фигура лежит внутри другой фигуры – то эти фигуры тоже пересекающиеся.
В моем примере в итоге эти фигуры должны разделится на три массива
1- фигуры1,2,3,4,5,13,14 ,
2- фигуры 11 и 12 ,
3- фигуры 9 и 10.
Одиночные не пересекающиеся фигуры 6,7,8 не в счет – показал их для примера.
Для решения рассматривал алгоритм сканирующей прямой и алгоритмы проецирования сторон фигур на оси Х и У но они не подходят для ее решения, так как они не помогут разделить эти пересекающиеся фигуры на разные массивы.
Прошу вас подсказать как можно разделить такие фигуры. Спасибо.
Изображение

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 12:50 
Заслуженный участник


26/05/14
981
Если нужно быстро, то алгоритм Бентли-Оттмана. В простейшем варианте он ищет пересечения отрезков. Есть модификация, которая строит подразбиение плоскости. Это такая структура в которой про каждый участок плоскости можно указать каким многоугольникам он принадлежал изначально. Это сложно, очень сложно.

Более простой алгоритм следущий: пересекаете фигуры попарно. Каждому пересечению сопоставляется ребро в графе, где вершины - сами фигуры. Компоненты связности графа - нужные вам "массивы".

Пересечь две фигуры можно так: все отрезки границы первой фигуры пересекаете со всеми отрезками второй. Если есть пересечение, то фигуры пересекаются. Если нет, то проверяете любую вершину первой фигуры на принадлежность второй и наоборот. Если оба теста отрицательные, то фигуры не пересекаются, иначе одна из фигур целиком внутри другой.

Работает медленно (квадратичная сложность от суммарного числа вершин всех фигур), но он простой и надёжный.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 13:41 


21/05/21
8
да, я могу найти пересечения 2 любых фигур например:
фигура 13 с фигурой 14,
2 с 3,
1 с 2,
4 с 3 и т.д.
но, подскажите, пожалуйста, как мне определить , что 1,2,3,4,5,13,14 один общий (граф) массив?

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 14:16 
Заслуженный участник


12/08/10
1677
Поиск в глубину или ширину.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 14:56 


21/05/21
8
Null в сообщении #1519410 писал(а):
Поиск в глубину или ширину.

а вы не могли бы поподробнее описать свой ответ. Спасибо.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 16:30 
Заслуженный участник


26/05/14
981
Поиск в глубину.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение21.05.2021, 16:55 


21/05/21
8
спасибо буду изучать

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение23.05.2021, 12:26 


21/05/21
8
slavav в сообщении #1519399 писал(а):

Более простой алгоритм следущий: пересекаете фигуры попарно. Каждому пересечению сопоставляется ребро в графе, где вершины - сами фигуры. Компоненты связности графа - нужные вам "массивы".

Пересечь две фигуры можно так: все отрезки границы первой фигуры пересекаете со всеми отрезками второй. Если есть пересечение, то фигуры пересекаются. Если нет, то проверяете любую вершину первой фигуры на принадлежность второй и наоборот. Если оба теста отрицательные, то фигуры не пересекаются, иначе одна из фигур целиком внутри другой.

Работает медленно (квадратичная сложность от суммарного числа вершин всех фигур), но он простой и надёжный.

Сделал по вашему совету определил соседние грани всех графов:
1,2
2,3
3,4
3,13
3,14
13,14
3,5
9,10
11,12
Только непонятно как отделить грани одного графа от другого ведь они у меня находятся в одном массиве? Спасибо.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение23.05.2021, 12:34 
Заслуженный участник


26/05/14
981
Запускаете поиск в глубину с любой вершины графа. Когда он закончился, все фигуры из одного "массива" окрашены в чёрный. Удаляете их из графа, повторяете процесс.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение23.05.2021, 21:10 


21/05/21
8
slavav в сообщении #1519698 писал(а):
Запускаете поиск в глубину с любой вершины графа. Когда он закончился, все фигуры из одного "массива" окрашены в чёрный. Удаляете их из графа, повторяете процесс.

спасибо - буду пробовать

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение23.05.2021, 23:06 


14/01/11
3040
slavav в сообщении #1519399 писал(а):
Работает медленно (квадратичная сложность от суммарного числа вершин всех фигур), но он простой и надёжный.

Для ускорения можно построить BVH-дерево.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение24.05.2021, 20:42 


21/05/21
8
а без прохождения графов можно ли отделить один граф от другого, например, анализируя его крайние грани?

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение24.05.2021, 20:46 
Заслуженный участник


26/05/14
981
Это будет преждевременная оптимизация. Но можно. Смотрите предыдущий комментарий про BVH-дерево.

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение25.05.2021, 08:14 


21/05/21
8
slavav в сообщении #1519873 писал(а):
Это будет преждевременная оптимизация. Но можно. Смотрите предыдущий комментарий про BVH-дерево.

вы не могли поподробнее объяснить ваш ответ - так как непонятно причем тут дерево ?- если я спрашиваю по каким признакам можно отличить одно дерево от другого, не проходя его?

 Профиль  
                  
 
 Re: определение вложенности фигур
Сообщение25.05.2021, 23:11 
Заслуженный участник


26/05/14
981
Bounding volume hierarchy. В вашем случае вокруг каждого многоугольника строится ориентированный по осям прямоугольник. Затем эти прямоугольники объединяются в дерево, таким образом что можно быстро понять что два прямоугольника не пересекаются. BVH дерево строится до построения графа или графов.

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

Приведенная оптимизация не меняет О-большое, но может серьезно ускорить построение графа.

Построение полного BVH дерева может улучшить О-большое, так как вы сразу отбрасываете большое количество пар фигур, которые находятся далеко друг от друга, и поэтому для них не нужно обнаруживать пересечения.

Предостережение: это оптимизации, от проверки пересечения фигур и поиска компонент связности в графе они вас не спасут.

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

Модераторы: Модераторы Математики, Супермодераторы



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

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


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

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