Berechnung von # oder Zeilen und Spalten

8

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

werden      

7 Bilder sollten 1 Zeile, 7 Spalten

werden      

8 Bilder sollten 2 Zeilen, 4 Spalten

werden      

9 Bilder sollten 3 Zeilen, 3 Spalten werden

     

10 Bilder sollten 2 Zeilen, 5 Spalten

werden

Hoffentlich hilft das erklären.

Ideen?

    
Amber Mac 16.06.2011, 19:21
quelle

6 Antworten

12

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!

    
smackcrane 16.06.2011, 19:48
quelle
0

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%     
Dilum Ranatunga 16.06.2011 19:29
quelle
0

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.

    
Woot4Moo 16.06.2011 19:29
quelle
0

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.

    
Andrei Zisu 16.06.2011 19:31
quelle
0

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".

  • Wenn Nummer mod i 0 ist, füge i und hinzu Nummer / i auf die Liste der Faktoren.

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)

    
Andrei 16.06.2011 19:34
quelle
-1

Sehen Sie sich die Ganzzahl-Faktorisierung

an

Vielleicht ist das was du brauchst.

    
Vinicius Kamakura 16.06.2011 19:24
quelle