Obwohl Ihre Frage es nicht sagt, gehe ich davon aus, dass Sie nicht möchten, dass sich Fenster überlappen.
Ein Ansatz für dieses Problem ist die Verwendung eines Constraint-Lösers wie Choco . Man schreibt einfach die Einschränkungen auf, die Ihr Problem codieren, stimmt den Löser so ab, dass er intelligent agiert, und lässt ihn dann laufen. Dies bedeutet, dass Sie nur überlegen müssen, wie Sie das Problem gut codieren können, statt einen Algorithmus zu entwickeln und die Programmierung und Abstimmung vorzunehmen. Hier ist eine Teilantwort, um Ihnen den Einstieg zu erleichtern.
Angenommen, die Bildschirmgröße ist .xm a x× ym a x
Für jedes Fenster haben Sie eine Reihe von Variablen und Einschränkungenx i , y i , h i , w iWichxich, yich, hich, wich
- xich, yich, hich, wich≥ 0
- xich+ wich≤ xm a x
- yich+ hich≤ ym a x
- Möglicherweise gibt es auch einige Einschränkungen für die minimale Größe von Fenstern, z. B. und so weiter.hich≥ 100
- Aspektbeschränkungen: Wenn das Seitenverhältnis 3: 4 beträgt, könnte die Beschränkung etwa , wobei ein kleiner Nicht-Null-Fehlerbegriff ist, um Nicht-Perfektes zuzulassen Fenstergrößen, da Sie sonst das Problem übermäßig einschränken würden.& egr;4 hich- & egr; ≤ 3 wich≤ 4 hich+ ϵϵ
Nun müssen Sie auf die Fensterüberlappung achten. Für jedes Fensterpaar , in dem , generieren Sie Einschränkungen wie die folgenden, die erfassen, dass in keine Ecke von erscheint . für die Einschränkung: i ≠ j W j W i ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , y j + h j ) , ( x j + w j , y j + h jWich, Wjich ≠ jWjWich( x , y) ∈ { ( xj, yj) , ( xj+ wj, yj) , ( xj, yj+ hj) , ( xj+ wj, yj+ hj) }
- ¬ ( xich≤ x ≤ xich+ wj∧ yich≤ y≤ yich+ hj) .
Die bisher angegebenen Einschränkungen beschreiben nur nicht überlappende Fenster, die nicht über die Seiten des Bildschirms verlaufen, die einige minimale Größenbeschränkungen erfüllen und deren Seitenverhältnis beibehalten.
Um eine gute Anpassung zu erhalten, müssen Sie eine Metrik angeben, die erfasst, was es heißt, ein gutes Layout zu sein. Eine Möglichkeit besteht darin anzunehmen, dass Sie die Fenster ungefähr gleich groß halten und / oder den "Leerraum" minimieren möchten. Ich glaube nicht, dass dies mit Choco spezifiziert werden kann, aber es kann mit einer anderen Einschränkung gelöst werden (jemand anderes könnte hier helfen).
Mit Choco kann man die Anzahl auf eine Zielfunktion maximieren, die als einzelne Variable angegeben ist. Basierend auf dieser Idee können Sie Folgendes maximieren:
- ∑ich( hich+ wich)
indem Sie eine Bedingung und Choco , zu maximieren .c o s tc o s t = ∑ich( hich+ wich)c o s t