Як знайти прямокутник максимальної площі всередині опуклого багатокутника?


21

У цій публікації ми шукаємо алгоритми / ідеї, як знайти прямокутник максимальної площі всередині опуклого багатокутника .

На наступному малюнку цифри - це площі встановлених прямокутників. Як показано, бажаний прямокутник може змінюватися в кожному вимірі і може бути в будь-якому куті.

Редагувати:

Ми не маємо чіткої ідеї, як боротися із згаданою проблемою, тому запитали тут. Тим не менш, ми здогадуємося, що прямокутник з максимальною площею може бути одним із тих, у кого один край вирівняний на (необов'язково, однаковій довжині ребра, звичайно), краю полігона.

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


1
Чи можете ви вказати, яке програмне забезпечення ви використовуєте? Крім того, опублікуйте свою роботу на сьогоднішній день або загальний підхід, який ви виробили для її вирішення. Можливо, хтось може вдосконалити те, що ви вже зробили. На мій досвід, це дасть набагато корисніші відповіді, ніж просто поставити запитання "не в силі".
Мартін

1
Тісно пов'язані з : gis.stackexchange.com/questions/22895 / ... .
whuber

Програмне забезпечення @Martin: програмування Pythonтоді буде включено, Fortranякщо потрібно. Ми здогадуємось, що виходячи з нашої попередньої публікації тут, про яку також згадувалося вище whuber, може бути прямокутником із спільним краєм з багатокутником.
Розробник

1
Ваша проблема справді цікава, і я думаю, що мені вдалося знайти алгоритм вирішення тут і тут .
ніки

1
@nickves Дякуємо за посилання. Чи можете ви поставити цю інформацію як відповідь з невеликим поясненням алгоритмів? Це буде корисною відповіддю.
Розробник

Відповіді:


4

Деякі зауваження занадто великі для коментарів (хоча це не передбачає очевидного алгоритму):

Лінія перфорації (EDITED) : Принаймні дві вершини прямокутника максимальної площі повинні лежати на межі полігона (тобто вздовж ребра або у вершини). І якщо прямокутник максимальної площі не є квадратом, то принаймні три вершини повинні лежати на межі багатокутника.

Я довів це собі в чотири кроки:

Примітка №1 : Принаймні одна вершина прямокутника максимальної площі завжди буде лежати на межі багатокутника. Це досить очевидно, але доказ може бути таким (протиріччя): припустимо, у вас був "максимальний" прямокутник без вершини на кордоні полігона. Це означає, що навколо кожної його вершини буде хоча б трохи місця. Так ви могли трохи розширити свій прямокутник, суперечивши його максимальності.

Примітка №2 : Принаймні дві вершини прямокутника максимальної площі завжди будуть лежати на межі полігона. Доказ може бути таким (знову ж таки суперечливим): Припустимо, у вас був "максимальний" прямокутник із лише однією вершиною на межі (гарантується Приміткою №1). Розглянемо два ребра, що не примикають до цієї вершини. Оскільки їх кінцеві точки НЕ знаходяться на межі, навколо є невелика кімната. Таким чином, будь-який з цих країв можна трохи «екструдувати», розширивши площу полігону і суперечивши його максимальності.

Примітка №3 : Існують дві діагонально протилежні вершини прямокутника максимальної площі, які лежать на межі багатокутника. (З Примітки №2 ми знаємо, що принаймні дві, але необов'язково, що вони перетинаються одна від одної.) Але знову ж таки суперечливістю, якщо єдині дві граничні вершини були сусідніми, то протилежний край (жоден з вершин чиїх) знаходяться на межі) можна було б трохи видавити, збільшивши площу прямокутника і суперечивши його максимальності.

Примітка №4 : (ЗДОРОВАНО) Якщо максимальний прямокутник площі не є квадратом, то три його вершини будуть лежати на межі багатокутника.

Щоб довести, припустимо, що це не так, тобто, що прямокутник максимальної площі не є квадратом, а лише дві його вершини знаходяться на межі багатокутника. Я покажу, як побудувати більший прямокутник, що суперечить максимальності.

Назвіть вершини прямокутника A, B, C, і D. Без обмеження спільності, припустимо , що Bі Dє два , які знаходяться на кордоні багатокутника. Оскільки Aі Cзнаходяться на внутрішній частині багатокутника, навколо них є пелена кімната (представлена ​​кружечками навколо Aта Cна малюнку нижче). Тепер намалюйте коло навколо прямокутника, а точки ковзання Aта Cтрохи по колу настільки ж (зробіть A'і C', як зображено нижче), щоб новий прямокутникA'BC'Dє більш квадратним, ніж оригінальний прямокутник. Цей процес створює новий прямокутник, який також знаходиться в межах початкового багатокутника і має більшу площу. Це суперечність, тому доказ робиться.

Побудова нового прямокутника

Щоб вважати це доказом, вам доведеться переконати себе в тому, що площа прямокутника, вписаного в коло, збільшується в міру того, як він стає «більш квадратним» (тобто різниця між довжинами ребер стає меншою). Також вам потрібно багатокутник бути опуклим, щоб нові лінії були всередині нього. І, мабуть, є й інші дрібниці, що потрапляють під килим, але я впевнений, що вони все виходять.


Примітка №4 є рибкою, тому що, "помахуючи", дві інші вершини створять не прямокутники.
whuber

Правда. Однак ваша візуалізація 4-го прикладу не зовсім правильна (якщо 2 вершини знаходяться на межі полігону, ви не можете розтягнути його далі). Я не можу точно знайти, як це пояснити (спробував написати коментар, але став занадто безладним), але я вірю, що ви праві.
Сарик

Я вважаю, що існують контрприклади до примітки №4. Ті, кого я знайшов, беруть до уваги деякі підрахунки; найпростішим є збурення неправильного шестикутника (квадрат з двома протилежними кутами злегка відрізаний).
whuber

Погодився, що Примітка №4 є рибною. Я детальніше ознайомлюсь сьогодні ввечері і або виправляю, або виймаю.
csd

+1 Це гарне рішення труднощів. Дякуємо за редагування!
whuber

3

Я зробив дуже швидкий і огидний етюд про вашу зелену ноту в питанні. Я не міг опублікувати це як коментар, тому мені довелося написати відповідь, навіть якщо це не одна.
Я вважаю, що на зображенні нижче у нас є максимальний прямокутник (не ідеальний, це лише ескіз, зроблений на Paint, щоб дати уявлення), і я не думаю, що ви можете знайти більшого, який мав би спільну сторону з межі чорного плігону ...
Однак я можу помилитися, у такому випадку ви маєте всі свої вибачення.
Швидкий ескіз я зробив на Paint


3
Хороший бал (+1). Однак є набагато простіший контрприклад: розглянемо проблему вписання прямокутника максимальної площі у звичайний восьмикутник. Неважко помітити (і легко довести, спершу знаходячи максимальний квадрат у окружності восьмикутника), що кути розчину збігаються з чергуються вершинами восьмикутника і що це рішення істотно більше, ніж будь-який вписаний у край прямокутник.
whuber

Насправді (я просто маю великі сумніви зараз), зовнішній найменший прямокутник (з цієї посади ) цього багатокутника не має такої ж орієнтації, як одна зі сторін, чи не так? (Я бачив би це та ж орієнтація, що і мій червоний прямокутник)
Сарик

3
Цей багатокутник, до речі, не опуклий. Оригінальне запитання обмежується опуклими багатокутниками.
csd

2
@csd Це чудовий момент, але Сарик все-таки правильний, як показує мій контрприклад. Сарик, немає проблеми з обмеженням мінімальної площі прямокутника: легко довести (жорстко), що він повинен містити сторону опуклого корпусу. Я вважаю, що на прямокутнику з максимальною площею (опуклого багатокутника) потрібно мати лише дві вершини, що торкаються кордону, не більше.
whuber

2

Більшість інших алгоритмів знаходять максимальну площу прямолінійного прямокутника, вписаного у опуклий багатокутник, і мають складність O(log n). Я не думаю, що ваша здогадка про те, що полігон максимальної площі вирівняний з однією із сторін, є правильним, тому що все, що вам потрібно зробити, це повернути багатокутник nраз, що спричинить складність O(n log n), і в моєму короткому дослідженні я не міг знайти щось, що говорить, що це було так просто.

Однак, у статті найбільші вписані прямокутники у опуклі багатокутники Knauer et al. ін., описує алгоритм наближення, який наблизить вас до правильної відповіді.

Як найкраще я розумію алгоритм, він будується на вершині одного з відомих вирівнюваних по осі полігонів максимальної площі, а потім випадковим чином відбирає точки всередині поліонного простору, генерує множинні осі з цих випадкових вибірок, ітераціює над цією віссю і застосовує вісь -порівняти алгоритм до кожного, а потім повернути найбільший прямокутник у цьому наборі.


Чи є помилка друку в першому реченні? Можливо, не може бути алгоритму O (log (n)), оскільки просто зчитування координат є операцією O (n)!
whuber

Посилання мертве
небезпечно,

1
@dangerousdave - Знайшов альтернативне посилання, як би довго це не було ....
lreeder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.