Ich versuche, ein einfaches konkaves Polygon mit einem Minimum an Rechtecken zu bedecken. Meine Rechtecke können beliebig lang sein, aber sie haben maximale Breiten, und das Polygon hat niemals einen spitzen Winkel.
Ich dachte darüber nach, mein konkaves Polygon in Dreiecke zu zerlegen, die einen Satz minimal überlappender Rechtecke erzeugen, die jedes Dreieck minimal begrenzen, und diese Rechtecke dann zu größeren zusammenzuführen. Ich denke jedoch nicht, dass dies für kleine Kerben in den Kanten des Polygons funktioniert. Die Dreiecke, die durch die Reflexscheitelpunkte in diesen Kerben erzeugt werden, erzeugen die falschen Rechtecke. Ich suche nach Rechtecken, die Kerben überspannen / ignorieren.
Ich weiß nicht wirklich etwas über Computergeometrie, daher bin ich mir nicht sicher, wie ich anfangen soll, die Frage zu stellen.
Ich habe andere Beiträge gefunden, die ähnlich waren, aber nicht das, was ich brauche:
- Teilen Sie das Polygon in eine minimale Anzahl von Rechtecken und Dreiecken
- Bedecken eines beliebigen Polygons mit einer minimalen Anzahl von Quadraten
- Finden Sie Rechtecke so, dass sie die maximale Anzahl von Punkten abdecken
- Algorithmus zum Finden der wenigsten Rechtecke, um eine Reihe von Rechtecken abzudecken
Einige Beispiele: Schwarz ist die Eingabe. Rot ist die akzeptable Ausgabe.
Ein weiteres Beispiel: Die zweite Ausgabe wird bevorzugt. Es ist jedoch wahrscheinlich notwendig, beide Ausgaben zu generieren und einen anderen Faktor zur Bestimmung der Präferenz zu verwenden, und nicht die Verantwortung dieses Algorithmus.
Polygone, die Kurven imitieren, sind äußerst selten. In diesem Szenario wird ein Großteil der Fläche der Rechtecke verschwendet. Dies ist jedoch akzeptabel, da jedes Rechteck die maximale Breitenbeschränkung einhält.
Außerdem habe ich festgestellt, dass dieser Artikel genau dem entspricht, was ich brauche:
- Bedeckung mit rechteckigen Stücken von Paul Iacob, Daniela Marinescu und Cristina Luca
Vielleicht ist eine bessere Frage: "Wie kann ich rechteckige Teile eines konkaven Polygons identifizieren?"
Hier ist ein Bild, das die gewünschte Implementierung zeigt:
Das Grün ist der tatsächliche Materialverbrauch. Die roten Rechtecke sind die Layouts. Das Blau ist der MBR des gesamten Polygons. Ich denke, ich sollte versuchen, kleine MBRs zu bekommen und sie auszufüllen. Die 2-3 grünen Rechtecke in der oberen linken Ecke, die in der Mitte des Polygons enden, sind teuer. Das möchte ich minimieren. Die grünen Rechtecke haben eine minimale und maximale Breite und Höhe, aber ich kann so viele Zeilen und Spalten verwenden, wie zum Abdecken eines Bereichs erforderlich sind. Auch hier muss ich die Anzahl der Rechtecke minimieren, die sich nicht über die Eingabe erstrecken. Ich kann auch die Form des grünen Rechtecks ändern, um sie an kleine Stellen anzupassen, was ebenfalls sehr teuer ist. Mit anderen Worten, es ist ideal, so viele Rechtecke wie möglich so weit wie möglich zu überspannen.