2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение12.01.2008, 18:03 
Аватара пользователя


24/10/05
400
У меня есть невыпуклая фигура. Ее нужно разбить на фигуры, которые являются выпуклыми. Какие существуют алгоритмы для решения данной задачи? Всем заранее спасибо! ссылка на изображение, где указан пример разбиения http://content.foto.mail.ru/mail/zurix/2/i-24.jpg

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


01/08/06
3133
Уфа
Фигура, как я полагаю --- это многоугольник? (а то, если ограничивающие отрезки непрямые, то может получиться, что на конечное число частей нельзя разбить).
Первое, что приходит в голову --- это триангулировать область, и затем пытаться объединять смежные треугольники, чтобы полученные в результате объединения фигуры оставались выпуклыми (как первое, так и второе можно делать разными способами).

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


11/04/07
1352
Москва
worm2 писал(а):
затем пытаться объединять смежные треугольники

Насколько я понимаю треугольник является выпуклой фигурой и триангуляции вполне достаточно.
Наиболее простой алгоритм триангуляции - поиск минимального угла в внешней однополостной петле. Устранение узла с меньшим углом дает новую петлю. Рекурентное применение данного алгоритма всегда даст искомое разбиение.

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


01/03/06
13626
Москва
Zai писал(а):
Наиболее простой алгоритм триангуляции - поиск минимального угла в внешней однополостной петле.
Это как? Все слова по отдельности знаю, но вот вместе - просто не укладываются в голове, и всё тут....

 Профиль  
                  
 
 
Сообщение13.01.2008, 11:19 
Аватара пользователя


24/10/05
400
а как быть если нужно построить миниамальное число триангуляций?

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


11/04/07
1352
Москва
Brukvalub писал(а):
Zai писал(а):
Наиболее простой алгоритм триангуляции - поиск минимального угла в внешней однополостной петле.
Это как? Все слова по отдельности знаю, но вот вместе - просто не укладываются в голове, и всё тут....

Пусть контур буквы "З" разбит на отрезки (назовем его петлей, угловые точки - вершины). Вычислим все углы между отрезками. Вычисление углов следующее. Если линия соединяющая две соседние вершины к данной лежит внутри разбиваемой области - угол меньше 180 градусов. Если нет - больше 180 градусов. Для вырожденного треугольника 180 градусов. Находим вершину с минимальным уголом. Образуем из двух отрезков, примыкающих к вершине треугольник. Исключаем из петли два отрезка прилежащих к данной вершине. Взамен вставляем один, соединяющий две соседние вершины. Проводим повторный поиск минимального угла и исключение.

Буду очень признателен Вам, если еще что-то нужно уточнить. Данный алгоритм я использовал для конечно-элементных сеток лет десять назад, до повсеместного в настоящее время использования коммерческих генераторов сеток.

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


01/03/06
13626
Москва
Zai писал(а):
Буду очень признателен Вам, если еще что-то нужно уточнить.
Спасибо, теперь мне стало понятно.

 Профиль  
                  
 
 Re:
Сообщение07.07.2015, 04:30 


18/09/14
10
Zai писал(а):
Вычисление углов следующее. Если линия соединяющая две соседние вершины к данной лежит внутри разбиваемой области - угол меньше 180 градусов. Если нет - больше 180 градусов. Для вырожденного треугольника 180 градусов. Находим вершину с минимальным уголом. Образуем из двух отрезков, примыкающих к вершине треугольник. Исключаем из петли два отрезка прилежащих к данной вершине. Взамен вставляем один, соединяющий две соседние вершины. Проводим повторный поиск минимального угла и исключение.

Буду очень признателен Вам, если еще что-то нужно уточнить. Данный алгоритм я использовал для конечно-элементных сеток лет десять назад, до повсеместного в настоящее время использования коммерческих генераторов сеток.

Каким образом с помощью этого алгоритма можно разбить, скажем, четырёхугольник с координатами (0;10) (2;-1) (0;-0.5) (-2;-1) ?

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


11/05/08
32166
Zai в сообщении #95595 писал(а):
Находим вершину с минимальным уголом. Образуем из двух отрезков, примыкающих к вершине треугольник. Исключаем из петли два отрезка прилежащих к данной вершине. Взамен вставляем один, соединяющий две соседние вершины.

И если повезёт, то запросто получаем самопересечение.

 Профиль  
                  
 
 Re: алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение10.07.2015, 15:13 


01/12/11

1047
На рисунке ТС изображён ключ с отверстием, т.е. ключ содержит кольцо. Как кольцо разбить на выпуклые части?

 Профиль  
                  
 
 Re:
Сообщение10.07.2015, 17:15 
Заслуженный участник


26/05/14
981
Zai в сообщении #95344 писал(а):
Наиболее простой алгоритм триангуляции - поиск минимального угла в внешней однополостной петле. Устранение узла с меньшим углом дает новую петлю.

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

-- 10.07.2015, 17:17 --

Skeptic в сообщении #1035484 писал(а):
На рисунке ТС изображён ключ с отверстием, т.е. ключ содержит кольцо. Как кольцо разбить на выпуклые части?


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

 Профиль  
                  
 
 Re: алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение10.07.2015, 21:22 
Заслуженный участник


11/05/08
32166
slavav в сообщении #1035511 писал(а):
(алгоритм отрезания ушей)

А почему, кстати, его обзывают $O(n^2)$? Гарантировано ведь вроде лишь $O(n^3)$ -- ведь на каждом шаге бог весть, через сколько подшагов очередное ухо встретится.

 Профиль  
                  
 
 Re: алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение10.07.2015, 21:43 
Заслуженный участник


26/05/14
981
ewert в сообщении #1035575 писал(а):
slavav в сообщении #1035511 писал(а):
(алгоритм отрезания ушей)

А почему, кстати, его обзывают $O(n^2)$? Гарантировано ведь вроде лишь $O(n^3)$ -- ведь на каждом шаге бог весть, через сколько подшагов очередное ухо встретится.

Это правда, если без опитимизации.
Оптимизация такая - для всех вершин вычисляется валидность диагонали (в совокупности $O(N^2)$). Флажки с валидностью собираются в кольцо. При удалении валидной вершины, надо удалить из кольца три значения и вставить два. Эти два надо вычислить. На это уйдёт $O(N)$. В совокупности, на модификацию кольца тоже уйдёт $O(N^2)$.
Ещё одна оптимизация: можно показать, что если "правильно" перемещаться по кольцу, то его вообще можно не вычислять заранее. Но это требует сложного доказательства и никому не интересно потому что сама сложность в $O(N^2)$ не интересна.

 Профиль  
                  
 
 Re: алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение10.07.2015, 22:01 
Заслуженный участник


11/05/08
32166

(Оффтоп)

slavav в сообщении #1035581 писал(а):
и никому не интересно потому что сама сложность в $O(N^2)$ не интересна.

Всего предыдущего я, естественно, не понял, т.к. лень врубаться. А вот тут скромно позволю себе понять так: не нужна нафик потому, что нафик не нужна триангуляция именно в этом смысле. К разбиению на треугольнички в смысле, скажем, МКЭ это ведь имеет отношение как минимум косвенное.

 Профиль  
                  
 
 Re: алгоритм разбиение невыпуклой фигуры на выпуклые фигуры
Сообщение11.07.2015, 00:02 
Заслуженный участник


26/05/14
981
ewert в сообщении #1035588 писал(а):

(Оффтоп)

slavav в сообщении #1035581 писал(а):
и никому не интересно потому что сама сложность в $O(N^2)$ не интересна.

Всего предыдущего я, естественно, не понял, т.к. лень врубаться. А вот тут скромно позволю себе понять так: не нужна нафик потому, что нафик не нужна триангуляция именно в этом смысле. К разбиению на треугольнички в смысле, скажем, МКЭ это ведь имеет отношение как минимум косвенное.


Триангуляция в этом смысле важна и нужна. Например, для задачи Art Gallery. Не интересен медленный алгоритм. Практически полезные алгоритмы работают за $NlogN$. Теоретически триангулировать можно за линейное время.

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

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



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

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


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

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