2010-03-28 6 views
6

I einen Satz von N positive Zahlen haben, und ein Rechteck mit den Abmessungen X und Y, die ich in N kleinere Rechtecke partitionieren müssen, so dass:Partition ein Rechteck in der Nähe Quadrate gegebener Bereiche

  • die Oberfläche jeden kleineren Rechteck ist, seine entsprechende Anzahl proportional in dem angegebenen Wert
  • alle Räume großer Rechtecke belegt sind und es kein übriggebliebenen Raum zwischen kleineren Rechtecken
  • jedes kleine Rechteck sollte so nah geformt sein, wie möglich
  • die Ausführungszeit relativ klein sein sollte

ich Anweisungen hierzu zu quadrieren müssen. Kennen Sie einen solchen im Internet beschriebenen Algorithmus? Hast du irgendwelche Ideen (Pseudo-Code ist in Ordnung)?

Danke.

Antwort

8

Was Sie beschreiben, klingt wie ein treemap:

Treemaps hierarchischen (Baumstruktur) Daten als eine Reihe von verschachtelten Rechtecke angezeigt werden soll. Jeder Zweig des Baums erhält ein Rechteck, das dann mit kleineren Rechtecken, die Unterzweige darstellen, gefliest wird. Das Rechteck eines Blatt-Knotens hat eine Fläche proportional zu einer angegebenen Dimension der Daten.

Das Wikipedia-Seite Links zu a page by Ben Shneiderman, die einen schönen Überblick und Links zu Java-Implementierungen gibt:

Dann, während darüber in der Fakultät Lounge rätselhaft, ich das Aha hatte! Erfahrung beim Aufteilen des Bildschirms in Rechtecke in abwechselnden horizontalen und vertikalen Richtungen, während Sie die Ebenen durchlaufen. Dieser rekursive Algorithmus schien attraktiv, aber ich brauchte ein paar Tage, um mich davon zu überzeugen, dass es immer funktionieren würde und einen Sechs-Zeilen-Algorithmus zu schreiben.

Wikipedia auch "Squarified Treemaps" by Mark Bruls, Kees Huizing and Jarke J. van Wijk (PDF), die einen möglichen Algorithmus präsentiert:

Wie können wir ein Rechteck rekursiv in Rechtecke, so dass ihre Seitenverhältnisse (zB max (Höhe/Breite tesselate, Breite/height)) Annäherung 1 so nah wie möglich? Die Anzahl aller möglichen Tesselationen ist sehr groß. Dieses Problem fällt in die Kategorie der NP-harten Probleme. Für unsere Anwendung benötigen wir jedoch nicht die optimale Lösung, eine gute Lösung , die in kurzer Zeit berechnet werden kann, ist erforderlich.

Sie erwähnen keine Rekursion in der Frage, also könnte Ihre Situation nur eine Ebene der Treemap sein; Da die Algorithmen jedoch jeweils auf einer Ebene arbeiten, sollte dies kein Problem darstellen.

+0

Ich werde mir die Links, die Sie zur Verfügung gestellt haben, etwas genauer ansehen, aber ich denke, es ist keine hierarchische Baumkarte, obwohl Sie recht haben, dass es wie eins aussehen sollte. Ich sah diese Baumkarten mehrmals (z. B. grafisches Maß dafür, wie stark sich eine API von Version zu Version oder Darstellung der Plattennutzung pro Ordner/Datei verändert hat). Ich habe keine Hierarchie in meinen Daten. Z.B. Angenommen, ich möchte den Handel von 100 Marktanteilen für die letzten 24 Stunden grafisch darstellen, wo die Fläche proportional zum Handelsvolumen ist (und die Preisänderung wird durch Farbe dargestellt). –

+0

Von Bruls et al .: "Erstens betrachten wir nicht die Unterteilung für alle Ebenen gleichzeitig. Dies führt zu einer Explosion in der Rechenzeit. Stattdessen bemühen wir uns, quadratische Rechtecke für eine Reihe von Geschwistern zu erzeugen, wenn das Rechteck gegeben sie müssen hineinpassen und die gleiche Methode rekursiv anwenden. " Es klingt also so, als würde das für dich funktionieren. Das Beispiel in Abschnitt 3.1 sollte Ihnen bereits eine gute Vorstellung davon geben, wie es funktioniert. Pseudocode ist in Abschnitt 3.2. – Thomas

1

Ich habe an etwas ähnliches gearbeitet. Ich bevorzuge Einfachheit, um möglichst ähnliche Seitenverhältnisse zu bekommen. Dies sollte (theoretisch) funktionieren. Getestet auf Papier für einige Werte von N zwischen 1 und 10.

N = Gesamtzahl der Rects Q = max (Breite, Höhe)/min (Breite, Höhe), zu schaffen, R = N/Q

Wenn Q> N/2, die rect aufgeteilt in N Teilen entlang seiner längsten Seite. Wenn Q < = N/2, teilen Sie die Rect in R (gerundet Int) Teile entlang ihrer kürzesten Seite. Dann teilen Sie die Teilbilder in N/R (abgerundet int) Teile entlang seiner kürzesten Seite. Subtrahieren Sie den abgerundeten Wert vom Ergebnis der nächsten Subrects Division. Wiederholen Sie dies für alle Unterverzeichnisse oder bis die erforderliche Anzahl an Verweisen erstellt wurde.

Verwandte Themen