Come trovare il rettangolo di massima area all'interno di un poligono convesso?


21

In questo post stiamo cercando algoritmi / idee su come trovare il rettangolo di massima area all'interno di un poligono convesso .

Nella figura seguente, i numeri sono le aree dei rettangoli montati. Come mostrato, un rettangolo desiderato può variare in ogni dimensione e può essere in qualsiasi angolo.

Modificare:

Non abbiamo idea chiara di come affrontare il problema menzionato, così abbiamo chiesto qui. Tuttavia, supponiamo che il rettangolo della massima area possa essere uno di quelli con un bordo allineato (non necessariamente lo stesso bordo di lunghezza, ovviamente) a un bordo del poligono.

inserisci qui la descrizione dell'immagine


1
Potresti specificare quale software stai usando? Inoltre, pubblica il tuo lavoro così lontano o l'approccio generale che hai elaborato per risolverlo. Forse qualcuno può migliorare ciò che hai già fatto. Nella mia esperienza, ciò porterà a risposte molto più utili della semplice pubblicazione di una domanda "di punto in bianco".
Martin,

1
Strettamente correlato: gis.stackexchange.com/questions/22895/… .
whuber

Software @Martin: la programmazione Pythonverrà eseguita Fortranse necessario. Abbiamo ipotizzato che sulla base del nostro post precedente qui menzionato anche sopra whuberche potrebbe essere una risposta un rettangolo con un bordo in comune con il poligono.
Sviluppatore

1
Il tuo problema è davvero interessante e penso di essere riuscito a trovare un algoritmo di risoluzione qui e qui .
Nichel

1
@nickves Grazie per i collegamenti. Vorresti inserire queste informazioni come risposta con una piccola spiegazione degli algoritmi? Sarà potenzialmente una buona risposta da accettare.
Sviluppatore

Risposte:


4

Alcune note troppo grandi per essere inserite in un commento (anche se questo non suggerisce un algoritmo ovvio):

La linea di punzonatura (EDITED) : almeno due vertici del rettangolo dell'area massima devono trovarsi sul bordo del poligono (cioè lungo un bordo o su un vertice). E se il rettangolo dell'area massima non è un quadrato, almeno tre vertici devono trovarsi sul bordo del poligono.

L'ho dimostrato a me stesso in quattro passaggi:

Nota n. 1 : almeno un vertice del rettangolo di area massima si troverà sempre sul bordo del poligono. Questo è abbastanza ovvio, ma una prova potrebbe andare così (per contraddizione): supponiamo di avere un rettangolo "massimo" senza vertici sul confine del poligono. Ciò significa che ci sarebbe almeno una piccola stanza attorno a ciascuno dei suoi vertici. Quindi potresti espandere un po 'il tuo rettangolo, contraddicendone la massima.

Nota n. 2 : almeno due vertici del rettangolo di area massima si troveranno sempre sul bordo del poligono. Una prova potrebbe andare così (sempre per contraddizione): supponiamo di avere un rettangolo "massimo" con un solo vertice sul confine (garantito dalla Nota n. 1). Considera i due bordi non adiacenti a quel vertice. Poiché i loro endpoint NON sono al limite, c'è una piccola stanza attorno a ciascuno. Quindi uno di questi bordi potrebbe essere "estruso" un po ', espandendo l'area del poligono e contraddicendone la massima.

Nota n. 3 : ci sono due vertici diagonalmente opposti del rettangolo dell'area massima che giacciono sul bordo del poligono. (Sappiamo dalla Nota n. 2 che ce ne sono almeno due, ma non necessariamente che sono uno di fronte all'altro). Ancora una volta per contraddizione, se gli unici due vertici di confine fossero adiacenti, quindi il bordo opposto (nessuno dei cui vertici sono al limite) potrebbe essere un po 'estruso, aumentando l'area del rettangolo e contraddicendone la massima.

Nota n. 4 : (MODIFICATO) Se il rettangolo dell'area massima non è un quadrato, tre dei suoi vertici si troveranno sul bordo del poligono.

Per dimostrare, supponiamo che non sia così, cioè che il rettangolo dell'area massima non sia un quadrato, ma solo due dei suoi vertici si trovano sul bordo del poligono. Mostrerò come costruire un rettangolo più grande, contraddicendo la massima.

Chiamare i vertici del rettangolo A, B, C, e D. Senza perdita di generalità, supponiamo che Be Dsiano i due che si trovano sul confine del poligono. Dato che Ae Csono all'interno del poligono, c'è un po 'di spazio attorno a loro (rappresentato con cerchi intorno Ae Cnella foto sotto). Ora disegna un cerchio attorno al rettangolo e fai scorrere i punti Ae Cun po 'attorno al cerchio della stessa quantità (da realizzare A'e C', nella foto sotto) in modo che il nuovo rettangoloA'BC'Dè più quadrato del rettangolo originale. Questo processo crea un nuovo rettangolo che si trova anche all'interno del poligono originale e presenta un'area più ampia. Questa è una contraddizione, quindi la prova è fatta.

Costruire un nuovo rettangolo

Per credere a quella prova, devi convincerti che l'area di un rettangolo inscritta in un cerchio aumenta man mano che diventa "più quadrata" (cioè la differenza tra le lunghezze del bordo si riduce). È inoltre necessario che il poligono sia convesso in modo che le nuove linee siano tutte al suo interno. E probabilmente ci sono altri piccoli dettagli che vengono spazzati sotto il tappeto, ma sono abbastanza sicuro che funzionino tutti.


Nota # 4 è sospetto, perché "agitando" gli altri due vertici creerà non rettangoli.
whuber

Vero. Tuttavia, la visualizzazione del quarto esempio non è del tutto corretta (se 2 vertici si trovano sul limite del poligono, non è possibile allungarlo ulteriormente). Non riesco a trovare esattamente come spiegarlo (ho provato a scrivere un commento ma sono diventato troppo disordinato), ma credo che tu abbia ragione.
Saryk,

Credo che ci siano controesempi alla nota n. 4. Tuttavia, quelli che ho trovato richiedono alcuni calcoli da mostrare; il più semplice è una perturbazione di un esagono irregolare (un quadrato con due angoli opposti leggermente tagliati).
whuber

Concordato che la nota n. 4 è sospetta. Daremo un'occhiata più da vicino stasera e lo riparerò o lo rimuoverò.
CSD,

+1 Questa è una buona risoluzione della difficoltà. Grazie per la modifica!
whuber

3

Ho fatto uno schizzo molto rapido e orribile sulla tua nota verde nella domanda. Non ho potuto pubblicarlo come commento, quindi ho dovuto scrivere una risposta, anche se non è una.
Credo che nell'immagine qui sotto abbiamo un rettangolo di area massima (non perfetto, è solo uno schizzo fatto su Paint per dare un'idea), e non penso che tu possa trovarne uno più grande che avrebbe un lato comune con il bordi del plygon nero ...
Comunque posso sbagliarmi, in quel caso hai tutte le mie scuse.
Schizzo rapido che ho fatto su Paint


3
Buon punto (+1). C'è un controesempio molto più semplice, però: considera il problema di iscrivere un rettangolo ad area massima all'interno di un ottagono normale. È facile da vedere (e facile da provare trovando prima un quadrato massimo all'interno del cerchio dell'ottagono) che gli angoli della soluzione coincidono con i vertici alternati dell'ottagono e che questa soluzione è sostanzialmente più grande di qualsiasi rettangolo inscritto allineato ai bordi.
whuber

In realtà (ho solo un grosso dubbio in questo momento), il rettangolo più piccolo esterno (quelli di questo post ) di questo poligono non ha lo stesso orientamento di uno dei lati, vero? (Lo vedrei con lo stesso orientamento del mio rettangolo rosso)
Saryk,

3
A proposito, quel poligono non è convesso. La domanda originale si limita ai poligoni convessi.
CSD,

2
@csd Questo è un ottimo punto, ma Saryk ha ancora ragione, come dimostra il mio controesempio. Saryk, non c'è alcun problema con il rettangolo di delimitazione dell'area minima: è facile dimostrare (rigorosamente) che deve includere un lato dello scafo convesso. Credo che il rettangolo inscritto nell'area massima (di un poligono convesso) debba avere solo due vertici che toccano il confine, non di più.
whuber

2

La maggior parte degli altri algoritmi trova il rettangolo rettilineo della massima area inscritto in un poligono convesso e presenta una complessità di O(log n). Non credo che la tua ipotesi che il poligono dell'area massima sia allineato con uno dei lati sia corretta, perché tutto ciò che dovresti fare è ruotare i ntempi del poligono , risultando in una complessità di O(n log n), e nella mia breve ricerca non sono riuscito trovare qualcosa che dica che è stato così facile.

Tuttavia, il più grande rettangolo inscritto in carta nei poligoni convessi di Knauer, et. al., descrive un algoritmo di approssimazione che ti avvicina alla risposta giusta.

Per quanto io capisca l'algoritmo, si basa su uno dei poligoni dell'area massima allineati agli assi noti, quindi campiona casualmente punti all'interno dello spazio polionico, genera più assi da quei campioni casuali, scorre su quegli assi e applica l'asse -allineato algoritmo a ciascuno e quindi restituisce il rettangolo più grande in quell'insieme.


C'è forse un refuso nella prima frase? Non può esserci un algoritmo O (log (n)) perché la semplice lettura delle coordinate è un'operazione O (n)!
whuber

Il collegamento è morto
dangerousdave

1
@dangerousdave - Trovato un collegamento alternativo per quanto tempo dura ....
lreeder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.