In diesem Beitrag suchen wir nach Algorithmen / Ideen, wie man das Maximum-Flächen-Rechteck innerhalb eines konvexen Polygons findet .
In der folgenden Abbildung sind Zahlen die Bereiche der angepassten Rechtecke. Wie gezeigt, kann ein gewünschtes Rechteck in jeder Abmessung variieren und kann in jedem Winkel sein.
Bearbeiten:
Wir haben keine klare Vorstellung davon, wie wir mit dem erwähnten Problem umgehen sollen, als wir hier fragten. Wir gehen jedoch davon aus, dass das Maximum-Area-Rectangle eines der Rechtecke sein kann, bei denen eine Kante an einer Kante des Polygons ausgerichtet ist (natürlich nicht unbedingt dieselbe Länge).
Python
erfolgt dannFortran
bei Bedarf. Wir haben eine Vermutung, dass basierend auf unserem vorherigen Beitrag hier auch oben erwähntwhuber
, dass ein Rechteck mit einer Kante, die mit Polygon gemeinsam ist, eine Antwort wäre.Antworten:
Einige Anmerkungen, die zu groß sind, um sie in einen Kommentar einzufügen (obwohl dies keinen offensichtlichen Algorithmus nahelegt):
Die Pointe (EDITED) : Mindestens zwei Eckpunkte des Rechtecks mit der maximalen Fläche müssen an der Grenze des Polygons liegen (dh entlang einer Kante oder an einem Eckpunkt). Wenn das Rechteck mit der maximalen Fläche kein Quadrat ist, müssen mindestens drei Eckpunkte an der Grenze des Polygons liegen.
Ich habe es mir in vier Schritten bewiesen:
Hinweis 1 : Mindestens ein Eckpunkt des Rechtecks mit der maximalen Fläche liegt immer an der Grenze des Polygons. Dies ist ziemlich offensichtlich, aber ein Beweis könnte (im Widerspruch) so lauten: Angenommen, Sie hätten ein "maximales" Rechteck ohne Scheitelpunkt an der Grenze des Polygons. Das bedeutet, dass um jeden seiner Scheitelpunkte mindestens ein kleiner Raum vorhanden ist. So können Sie Ihr Rechteck ein wenig erweitern, was seiner Maximalität widerspricht.
Hinweis Nr. 2 : Mindestens zwei Eckpunkte des Rechtecks mit der maximalen Fläche liegen immer an der Grenze des Polygons. Ein Beweis könnte so lauten (wieder im Widerspruch): Angenommen, Sie hätten ein "maximales" Rechteck mit nur einem Scheitelpunkt an der Grenze (garantiert durch Note # 1). Betrachten Sie die beiden Kanten, die diesem Scheitelpunkt nicht benachbart sind. Da sich ihre Endpunkte NICHT an der Grenze befinden, ist um jeden ein kleiner Raum vorhanden. So könnte eine dieser Kanten ein wenig "extrudiert" werden, was die Fläche des Polygons vergrößert und seiner Maximalität widerspricht.
Anmerkung 3 : Es gibt zwei diagonal gegenüberliegende Eckpunkte des Rechtecks mit der maximalen Fläche, die an der Grenze des Polygons liegen. (Aus Anmerkung 2 wissen wir, dass es mindestens zwei gibt, aber nicht unbedingt, dass sie einander gegenüberliegen.) Aber auch hier ist es ein Widerspruch, wenn die beiden Grenzscheitelpunkte nebeneinander liegen, dann die gegenüberliegende Kante (von deren beiden Scheitelpunkten keiner) an der Grenze) könnte ein wenig extrudiert werden, was die Fläche des Rechtecks vergrößert und seiner Maximalität widerspricht.
Hinweis Nr. 4 : (BEARBEITET) Wenn das Rechteck mit der maximalen Fläche kein Quadrat ist, liegen drei seiner Scheitelpunkte an der Grenze des Polygons.
Nehmen wir zum Beweis an, dass dies nicht der Fall ist, dh, dass das Rechteck mit der maximalen Fläche kein Quadrat ist, sondern nur zwei seiner Scheitelpunkte an der Grenze des Polygons liegen. Ich werde zeigen, wie man ein größeres Rechteck konstruiert, das der Maximalität widerspricht.
Rufen Sie die Eckpunkte des Rechtecks
A
,B
,C
, undD
. Nehmen Sie ohne Verlust der Allgemeinheit an, dassB
undD
die beiden sind, die sich an der Polygongrenze befinden. Da sichA
undC
im Inneren des Polygons befinden, gibt es einen Wackelraum um sie herum (dargestellt mit Kreisen umA
undC
im Bild unten). Zeichnen Sie nun einen Kreis um das Rechteck und schieben Sie die PunkteA
undC
ein wenig um den Kreis um den gleichen Betrag (zu machenA'
undC'
, siehe Abbildung unten), so dass das neue Rechteck entstehtA'BC'D
ist mehr Quadrat als das ursprüngliche Rechteck. Durch diesen Vorgang wird ein neues Rechteck erstellt, das sich ebenfalls innerhalb des ursprünglichen Polygons befindet und eine größere Fläche aufweist. Dies ist ein Widerspruch, daher ist der Beweis erbracht.Um diesen Beweis zu glauben, müssen Sie sich davon überzeugen, dass die Fläche eines Rechtecks, das in einen Kreis eingeschrieben ist, größer wird, wenn es "quadratischer" wird (dh der Unterschied zwischen den Kantenlängen wird kleiner). Außerdem muss das Polygon konvex sein, damit die neuen Linien darin enthalten sind. Und es gibt wahrscheinlich noch andere kleine Details, die unter den Teppich gekehrt werden, aber ich bin mir ziemlich sicher, dass sie alle funktionieren.
quelle
Ich habe eine sehr schnelle und abscheuliche Skizze über Ihre grüne Notiz in der Frage gemacht. Ich konnte es nicht als Kommentar posten, also musste ich eine Antwort schreiben, auch wenn es keine ist.
Ich glaube, dass wir im Bild unten ein Rechteck mit maximaler Fläche haben (nicht perfekt, es ist nur eine Skizze, die auf Paint erstellt wurde, um eine Idee zu vermitteln), und ich glaube nicht, dass Sie eine größere finden können, die eine gemeinsame Seite mit der haben würde Grenzen des schwarzen Plygons ...
Allerdings kann ich mich irren, in diesem Fall haben Sie alle meine Entschuldigungen.
quelle
Die meisten anderen Algorithmen finden das in ein konvexes Polygon eingeschriebene geradlinige Rechteck mit maximaler Fläche und haben eine Komplexität von
O(log n)
. Ich glaube nicht, dass Ihre Vermutung, dass das maximale Flächenpolygon an einer der Seiten ausgerichtet ist, richtig ist, da Sie lediglich die Polygonzeiten drehen müsstenn
, was zu einer Komplexität von führtO(n log n)
, und in meinen kurzen Nachforschungen konnte ich das nicht finde alles, was sagt, dass es so einfach war.Das Papier Largest Inscribed Rectangles in Convex Polygons von Knauer et al . beschreibt einen Approximationsalgorithmus, mit dem Sie der richtigen Antwort nahe kommen.
Soweit ich den Algorithmus verstehe, baut er auf einem der bekannten achsenausgerichteten Maximalflächenpolygone auf und tastet dann zufällig Punkte im Polyonraum ab, generiert aus diesen Zufallsstichproben mehrere Achsen, iteriert über diese Achsen und wendet die Achse an -aligned Algorithmus zu jedem und gibt dann das größte Rechteck in diesem Satz zurück.
quelle