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

Учитывая выпуклый многоугольник, я пытаюсь увеличить его форму (как в «максимальной площади»), сохраняя при этом его диаметр. Диаметр определяется как длина самого длинного сегмента, который может быть размещен внутри многоугольника. Поскольку многоугольник выпуклый, я предполагаю, что этот диаметр всегда можно найти, просмотрев все пары вершин.

Например, если в качестве входного многоугольника задан равносторонний треугольник, диаметр треугольника равен длине любого ребра; сглаживание приведет к 3 круговым сегментам, как показано на изображенииbefore-and-after-smoothing

Для произвольных выпуклых многоугольников очень неэффективным алгоритмом является вычисление пересечения окружностей максимального диаметра с центром в каждой вершине многоугольника; это то, что я сейчас использую (в Java). есть что-нибудь получше? Любой псевдокод или указатель на алгоритм будут оценены.

Другой пример: сжатый пятиугольник и соответствующая ему максимальная форма с сохранением диаметра. Идея состоит в том, что вы не можете увеличить площадь этой фигуры, не увеличивая диаметр (то есть позволяя провести прямую линию в пределах формы, которая длиннее исходного диаметра). В данном конкретном случае кажется, что один круг с радиусом = диаметр_полигона/2 (розовый) лучше, чем пересечение нескольких больших кругов с радиусом = диаметр_полигона (голубой). На втором изображении обе области наложены друг на друга, чтобы упростить сравнение, но области должны полностью охватывать полигон.

введите здесь описание изображения


person tucuxi    schedule 14.09.2010    source источник
comment
Я думаю, было бы полезно объяснить вывод, который вам нужен для многоугольников странной формы - треугольника или другого правильного многоугольника (под правильным я подразумеваю равные длины сторон и углы), ваше решение тривиально, и решение, которое удовлетворяет простой форме, может быть недостаточно для менее регулярного.   -  person Flynn1179    schedule 12.07.2012
comment
Я подумал о примере многоугольника, с которым мне не ясно, какой результат вам нужен. В комментариях я это явно не нарисую, но вершины имеют координаты (0,3), (1,6), (2,5), (2,1), (1,0). Возможно, вам понадобится решение для поддержки такой формы, и если да, то какой результат вы ожидаете?   -  person Flynn1179    schedule 13.07.2012
comment
Добавлен пример, охватывающий ваш пример с раздавленным пятиугольником. Спасибо за предложение - я думаю, это поможет прояснить проблему.   -  person tucuxi    schedule 13.07.2012
comment
С этими критериями, не будет ли оптимальным результатом моего примера просто круг (радиус 3, с центром в [1,3])? Однако ваш исходный пример не может быть выполнен с кругом. Я думаю, что любая фигура, в которой круг с центром вокруг середины между двумя самыми удаленными вершинами будет охватывать все остальные вершины, будет иметь круг как оптимальное решение. В случае треугольника или любого другого правильного многоугольника с нечетным числом сторон это не сработает.   -  person Flynn1179    schedule 14.07.2012
comment
Я думаю, вы правы - обновите вопрос, чтобы отразить это. Вы случайно не знаете хороший пакет, в котором я могу а) рисовать фигуры и б) запрашивать их площади впоследствии, в идеале без накопления потерь точности, не так ли?   -  person tucuxi    schedule 16.07.2012
comment
Круг, по сути, просто естественный вывод алгоритма, который итеративно добавляет новые вершины по мере необходимости - возможно, стоит изучить возможность круга, основанного на средней точке двух самых удаленных вершин в качестве НАЧАЛЬНОЙ точки, и разработать алгоритм который затем корректирует форму, чтобы включить любые вершины, которые находятся за пределами круга, начиная с самых удаленных от центра. Хотя я не совсем уверен, как это сделать, мне нужно подумать.   -  person Flynn1179    schedule 16.07.2012
comment
Не слишком уверен в естественном выводе - посмотрите на пример с треугольником выше; это результат пересечений, а не дополнительных дополнений.   -  person tucuxi    schedule 16.07.2012
comment
В этом примере нет, так как никаких дополнений не требовалось. В моем примере это необходимо. Я полагаю, что в некоторых случаях я должен был сказать естественный вывод; Я пытался проработать, как можно получить решение для квадрата (вручную), и после одной итерации получилось восьмиугольник, затем 16-сторонняя фигура после второй итерации, и так продолжалось до тех пор, пока я не получил круг.   -  person Flynn1179    schedule 16.07.2012
comment
Возможно, стоит отметить, что обе фигуры в примере с пятиугольником (розовый круг и светло-голубая фигура чуть меньшего размера) являются максимальными. Максимальный означает, что их нельзя постепенно увеличивать, сохраняя при этом соответствие требованиям; это не значит максимум. Круг, когда решение (см. второй комментарий Flynn1179), всегда является формой максимальной площади; но и круг, и синяя форма максимальны в том смысле, что их нельзя увеличить, не превысив диаметра.   -  person cvoinescu    schedule 19.07.2012
comment
Я изо всех сил пытался придумать хороший способ заставить эту идею работать, но мне не очень повезло - в основном, я думаю, что решение заключается в алгоритме, который НАЧИНАЕТ с круга, используя две самые удаленные вершины в качестве диаметр и итеративно корректирует эту фигуру, добавляя вершину, наиболее удаленную от центра фигуры. Однако я не уверен, как определить эту «корректирующую» часть алгоритма. Я пытаюсь понять, как ваш треугольник будет рассчитываться с помощью такого алгоритма, но я не могу понять это.   -  person Flynn1179    schedule 19.07.2012


Ответы (3)


Оказывается, этот вопрос уже задавали на Math Overflow, и люди пришли к выводу, что это сложная задача. Есть даже несколько основных вопросов без ответа, например, уникальна ли такая форма.

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

Задний план

Для простоты можно считать без ограничения общности, что диаметр исходного многоугольника равен 1.

Об одном обобщении теоремы Бляшке-Лебега для диско- многоугольники (М. Бездек, 2009 г.) описывает ряд полезных концепций. Соответствующие включают:

  • диск-многоугольник - это, неформально, выпуклое множество, которое образует «толстый» многоугольник, в котором ребра заменены дугами кривизны 1.
  • набор точек, которые мы можем добавить к набору точек D так, чтобы получившаяся фигура имела диаметр не более 1, называется двойным дисковым многоугольником D* из < эм>Д.
  • двойственное к двойственному D** называется выпуклой оболочкой веретена D: это наименьший дисковый многоугольник, содержащий D.

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

У нас есть DD*, когда D имеет диаметр 1 и D = D*< /em> тогда и только тогда, когда D имеет постоянную ширину 1. Решение S будет иметь постоянную ширину 1 (хотя этого, конечно, недостаточно). Следовательно, DS тогда и только тогда, когда DSD*: в частности, чтобы аппроксимировать S, нам нужно только найти достаточно большое подмножество дисковых полигонов D в S. Это очень мощно, потому что, как мы увидим, утверждение о том, что некоторая точка принадлежит или не принадлежит S, преобразуется как в верхнюю границу , так и в нижнюю границу S (и, следовательно, его площадь).

Теоретические проблемы

В идеале, чтобы найти эффективный алгоритм, было бы полезно ответить на следующие вопросы:

  • Является ли глобально оптимальная форма, т. е. решение, обязательно уникальным?
  • обязательно ли локально оптимальная форма единственна?
  • является ли изодиаметрическая оболочка многоугольника обязательно кругом диаметра 1 или многоугольником Рело ширины 1?
  • если да, то являются ли вершины многоугольника Рело производными от конечного числа пересечений окружностей единичного радиуса, начиная с вершин исходного многоугольника?
  • существует ли ограничение на количество вершин многоугольника Рело в зависимости от количества вершин исходного многоугольника?

Вопросы о площади дисков-многоугольников могут быть трудными: проблема решена в Раздвигание дисков - Кнезер -Гипотеза Поульсена на плоскости (К. Бездек, Р. Коннелли, 2001) представляла собой простой вопрос о площади пересечения дисков на плоскости, который долгое время оставался нерешенным.

Практические(?) подходы

Глобальный поиск.
Начните со шпиндельной выпуклой оболочки многоугольника и лениво постройте бесконечное дерево поиска из растущих дисковых многоугольников, где каждый узел разбивает набор всех постоянной ширины X. удовлетворяющие DXD*, в зависимости от того, является ли некоторая точка x из D* \ D принадлежит или не принадлежит X. Левая ветвь — это выпуклая оболочка веретена D ∪ {x}. Правая ветвь — это двойственный круг-многоугольник D* ∩ {y : x ∉ [y, < em>z
] для всех z в D}.

Если вы не выбрали x очень неудачно (например, на границе D* \ D), каждый бесконечный путь этого дерева должен сходиться к константе - ширина кривой.

Идея состоит в том, чтобы исследовать дерево несколько вширь. Надеюсь, если x выбрать разумным образом, вы сможете отбросить все ветви, где D* имеет меньшую площадь, чем наибольшая площадь D найдено пока, так как такие ветки не могут содержать решения. Тогда у вас будет набор дисковых полигонов, которые сходятся к набору решений проблемы по мере того, как вы углубляетесь в дерево, надеюсь, не слишком быстро.

Некоторыми эвристиками для x могут быть: взять точку как можно ближе к внутренней части D* \ D, взять случайную точку и скоро. Также может быть интересно включить некоторое количество поиска в глубину, чтобы иметь более точные нижние границы области решения, что позволило бы раньше отбрасывать целые ветви дерева.

Локальный поиск:
Мы также могли работать только с дисковыми многоугольниками постоянной ширины (полигонами Рело) и смотреть на влияние небольших отклонений. Но пространство поиска довольно большое, поэтому непонятно, как это сделать.

person Generic Human    schedule 20.07.2012

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

person Flynn1179    schedule 14.09.2010
comment
Существует целая линия точек, равноудаленных от любых двух соседних вершин. - person tucuxi; 14.09.2010
comment
Но только два, где это расстояние равно вашему диаметру. - person Flynn1179; 14.09.2010
comment
(Чтобы закрыть этот ответ, вопрос заключается не в том, «как мне рассчитать дополнительную точку в пределах границы формы», а в том, «как мне эффективно найти всю форму, ограниченную диаметром») - person tucuxi; 12.07.2012

Мне кажется, что ваш нынешний алгоритм не только неэффективен, но и неверен. Возьмите прямоугольник (0,0)-(10,0)-(10,1)-(0,1), который в настоящее время имеет диаметр чуть больше 10. Пересеките круги с этим радиусом по всему углу, и вы получите довольно большую линзообразную вещь с диаметром, значительно превышающим 16. Таким образом, этот алгоритм не работает.

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

Это просто интуиция, но я сомневаюсь, что желаемый результат однозначно определяется входным полигоном и вашими требованиями. Хотя у меня еще нет примера на этот счет, я полагаю, что могут быть входные полигоны, для которых существует несколько «сглаженных» форм, все с одинаковой площадью и одинаковым диаметром, но все же не конгруэнтные друг другу. Возможно, стоит обратиться к бирже математических стеков для дальнейшего обсуждения этого экзистенциального вопроса.

person MvG    schedule 16.07.2012
comment
Назовите диаметр вашего многоугольника «d». Если вы пересечете 4 круга радиуса d, да, диаметр результата будет слишком большим. Затем вы продвигаетесь вперед, как во втором примере выше, пересекая больше кругов радиуса d с центром во вновь созданных вершинах. - person tucuxi; 16.07.2012
comment
@tucuxi: я понимаю ваш алгоритм, но он все еще не дает требуемого результата максимальной площади. - person MvG; 20.07.2012