Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mo 10.10.16 06:50 
Hallo,

ich habe ein Programm in welchen es einen visuellen Container gibt, welcher mehrere rechteckige Unterelmente (Infotafeln) besitzt. Hierbei kann der User festlegen, wie viele Infotafeln es gibt. Eine neue Tafel wird immer rechts von der letzten eingefügt, stößt sie an den Rand wird eine neue Zeile eingefügt, überschreitetn die Tafeln die Höhe des Containers wird eine Scrollbar eingeblendet. Die größe des Containers selbst richtet sich nach der Fenstergröße. Die Größe aller Infotafeln ist gleich, kann aber vom User mittels zweier Schieberegler für Höhe und Breite der Tafeln verändert werden.

Soweit der aktuelle funktionierende Stand. Jetzt wurde der Wunsch an mich herangetragen einen Button mit der Funktion "beste größe" zu Implementiere. Dieser soll die Info Kacheln so Skalieren, das sie den im Container zur Verfügung stehenden Platz ideal ausfüllen, ohne das Scrollbalken angezeigt wird.

Ich tue mich ehrlich gesagt schon damit schwer, was die "beste Größe" ist, denn es gibt ja verschiedenste Kombinationen wie man mehrere Kacheln auf dem verfügbaren Platz aufteilen kann viele Schmale aber hohe Kacheln nebeneinander, viele Flache aber breite übereinander, versuchen die Kacheln Quadratisch zu halten, sofern es der Platz zulässt usw.

Aufgrund des Inhaltes der Kacheln würde ich schon annehmen dass es besser ist, wenn diese Breiter als hoch sind (auch wenn der Container vielleicht höher als Breit sein sollte), ansonsten kann ich aber auch keine allgemeingültige Regel für ein Optimales Seitenverhältnis der Kacheln aufstellen.

Somit habe ich folgende Werte:

  • Höhe und Breite des Containers
  • Anzahl der Client-Felder
  • Die Regel, das die Clients Breiter als hoch sein sollen.
  • Fester Abstand zwischen den einzelnen Kacheln.


Wie würdet ihr daran gehen, aus diesen Zutaten die "beste" Größe zu errechnen?

Ich bin gespannt auf eure Ansätze :)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 10.10.16 16:37 
Das klingt eigentlich wie das Treemap-Problem, nur dass alle Knoten gleich groß sind. Squarified Treemaps zielen auf Seitenverhältnis 1, das kriegt man bestimmt auch auf andere (goldener Schnitt oder sowas) gezielt.
Andererseits brauchst du dafür schon eine nach Platzbedarf sortierte Liste :gruebel:

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Di 11.10.16 22:27 
Also erstmal kann man ja alle möglichen Kachelgrößen auflisten. Da die Kachelbreite immer ganz in die Feldbreite passen soll, ergeben sich für n Kacheln bis zu n verschiedene Kachelbreiten. ("bis zu" weil die Breite ja immer größer als die Höhe sein soll. Ansonsten n. Angefangen von 1 Kachel pro Spalte über 2 Kacheln pro Spalte zu n Kacheln pro Spalte)
Zu jeder Kachelbreite wird dann ausgerechnet, wie hoch die Kachel sein muss. (Kachelhöhe = Floor(Feldhöhe / Ceil(Kacheln/KachelnProZeile))) das ergibt dann immer ein Paar aus Kachelbreite und -höhe, sodass kein Scollbalken entsteht.

Dann kann man diese potenziellen Kachelgrößen filtern. Man könnte beispielsweise ein Wunsch-Seitenverhältnis festlegen (wie 16:9) und dann die drei Kachelgrößen heraussuchen, die diesem am nächsten kommen und von diesen frei dann wieder die mit der größten Fläche. Der letzte Punkt macht es unwahrscheinlich, dass eine Größe genommen wird, wo die letzte Zeile nur eine Kachel enthält. Weil in diesem Fall die Fläche schlecht ausgenutzt wird, wären die Kacheln dann relativ klein.