Ich habe eine Anzahl von Bildern, die ich zusammen in ein Sprite-Blatt stecke. Wie kann ich die Anzahl der Zeilen und Spalten so berechnen, dass sie gleichmäßig in ein gerades Rechteck passen (keine Leerzeichen)?
Einige Beispiele:
6 Bilder sollten 2 Zeilen, 3 Spalten
werden7 Bilder sollten 1 Zeile, 7 Spalten
werden8 Bilder sollten 2 Zeilen, 4 Spalten
werden9 Bilder sollten 3 Zeilen, 3 Spalten werden
10 Bilder sollten 2 Zeilen, 5 Spalten
werden
Hoffentlich hilft das erklären.
Ideen?
Hier ist ein sehr schneller und einfacher Algorithmus (wobei N die Anzahl der Bilder ist)
%Vor% Und rows
ist die Anzahl der benötigten Zeilen. Spalten können natürlich mit N / rows
gefunden werden.
Ich hoffe, das hilft!
Scheint so, als müsstest du alle Faktorpaare der Zahl finden, dann wähle das Paar, das dir die am meisten "wünschenswerte" Zeile: Spaltenverhältnis gibt.
Also zum Beispiel:
%Vor%Nun, wenn Sie die Zahl als Primzahl betrachten, wollen Sie eine Zeile mit x Spalten haben, wobei x die Primzahl ist. Sonst, wenn die Zahl ein perfektes Quadrat ist, wären die Zeilen die Quadratwurzel der Zahl durch die Quadratwurzel der Zahl (9 == 3x3). Else Faktor den Rest.
Was ist Ihre Priorität? Willst du, dass es den Unterschied zwischen Höhe, Breite, Minimum oder etwas anderem hat?
Gegeben die Anzahl n von Bildern. Sie sollten jede Zahl i von 1 bis sqrt (n) nehmen. Wenn n durch i geteilt werden kann (n% i == 0), dividiere und inkrementiere eine Array-Potenz [i] jedes Mal, wenn sie sich teilt. Wenn n nicht mehr durch i geteilt werden kann (aka n% i! = 0) inkrementiere ich ise noch einmal.
Sie sollten alle Teiler und ihre größte Potenz in einer gegebenen Zahl n erhalten.
Machen Sie Kombinationen daraus und Sie erhalten die Dimensionen Ihres Quadrats.
Da es unwahrscheinlich ist, dass Sie eine große Zahl haben, gibt es eine Menge Möglichkeiten, wie Sie mit der Faktorisierung fortfahren können.
Siehe Am besten zu finden alle Faktoren einer gegebenen Nummer in C # für einige von ihnen.
Das einfachste ist: - Schleife von 1 bis zur Quadratwurzel des Nummer, rufen Sie den Index "i".
Dies gibt Ihnen alle Ganzzahlen, die Ihre Zahl N teilen. Die "andere" Zahl wird natürlich erhalten, indem N durch diese ganze Zahl geteilt wird.
Dann müssen Sie das beste Paar nach einer Regel auswählen. Sie können diejenigen mit der kleinsten Differenz auswählen: Wenn a * b = N
, wählen Sie diejenigen mit dem kleinsten absoluten Wert von (a-b)
Sehen Sie sich die Ganzzahl-Faktorisierung
anVielleicht ist das was du brauchst.
Tags und Links algorithm language-agnostic design