Benötigte Kapazität berechnen?

Hallo zusammen,

eigentlich hab ich ein informatisches Problem.
Aber ich versuch’s hier mal auf die Mathematik runterzubrechen:

Ich habe n Würfel, die ich hier mal „Cubes“ nenne bzw. schlicht C.
Für C gilt immer eine Seitenlänge von a = 1.

Außerdem habe ich einen großen Würfel ( nennen wir ihn Container oder Ctn) unbekannter Seitenlänge, in den alle Cubes hineinpassen müssen.

Frage: Wie groß muss die Seitenlänge und/oder das Volumen von Ctn sein, damit ich n Cubes hineinpassen? Oder anders: Wie muss die Funktion F(n) aussehen, damit da das Volumen oder die Seitenlänge von Ctn rauskommt?

Frage 2: Wie ist das Ergebnis zu modifizieren wenn ich außerdem zwischen jedem C einen Abstand von a haben möchte?

Frage 3: Wenn ich meine Cubes in Ctn „hineinlege“, gibt es eine dann Möglichkeit (Iteration), die Cubes zentrisch zu Ctn zu verteilen, sodass Ctn also nicht bspw. von unten nach oben befüllt wird sondern von der Mitte ausgehend?

Tausend Dank vorab für Lösungsvorschläge oder allein schon für’s kurz drüber nachdenken! :smile:

Wenn Du meist, was Du beschreibst, muss die Seitenlänge größer als die Kubikwurzel der Anzahl sein.

Überschlägig einfach mal zwei. Exakt berechnet man noch, dass der Abstand in jeder Richtung nur n-1 mal gebraucht wird.

Ja, bestimme die Position mit einer Zufallszahl oder kollissionsfrei einer geeigneten Permutationsfunktion.

Ciao, Allesquatsch

Danke dir für deine Antwort :slight_smile:

zu 1.) hm… clever. Aber nehmen wir an, ich habe 3 Cubes. Die Kubikwurzel liegt irgendwo bei 1,4. Wie komm ich denn von da aus auf das gewünschte Ergebnis von 8 (Volumen) bzw. 2 (Seitenlänge). Wenn du sagst „größer als“, reicht da einfach ein Aufrunden? (habe vergessen zu erwähnen, dass ich hier ein ganzzahliges Ergebnis brauche).

zu 3.) ähm… mit einer Zufallszahl?

Ja, genau das war angedeutet.

Ein wenig Nachdenken ist schon gefordert. In Deinem Beispiel wäre das Würfelvolumen 9. Also eine Zufallszahl zwischen 0 und 8, die die Position bestimmt. Durch geeignete Modulorechnung kann Du dann x,y,z-Index ermitteln. So würde man es bei einem Spiel machen, wenn die Positionen nicht vorhersagbar sein sollen. Kollissionen muss man abfangen.
Alternative eine deterministische Lösung: Eine bijektive Abbildung der Reihenfolgezahl i des i-ten Würfels.

Hallo,

wie wäre es mit

   ceil((n – 1/2)^(1/3))

wobei die Funktion ceil die nächst größere oder gleiche ganze Zahl bezogen auf ihr Argument zurückliefert (das Gegenstück dazu ist floor).

Hier in roter Farbe der Graph von ceil((x – 1/2)^(1/3)) und dazu noch grün die Funktion x^(1/3):

Wenn die von Dir verwendete Programmiersprache ceil nicht kennen sollte, kann man das auch über die Funktionen round oder trunc lösen.

Gruß
Martin

1 Like

Danke nochmals für die Antworten :smile:

@Martin: Vielen Dank für die Mühen! Das ist eigentlich genau was ich in Punkt 1 gesucht habe.
Deshalb würd ich gern zwei Antworten als „Beste Antwort“ markieren. Im Grunde hat Allesquatsch aber bereits formuliert was du dann in Code ausgedrückt hast. Daher muss ich hier leider das Recht des zu erst Malenden geltend machen ^^ Aber ich dank dir trotzdem für deine Antwort :smile:
PS: Die Graphik hab ich hier auf meinem Block auch schon aufgekritzelt :smiley:

@Allesquatsch: Mit Punkt 3 bin ich noch nicht ganz durch, aber ich werd die Antwort ma markieren ^^ Das ganze muss (inkl. Container) so kompakt wie möglich sein, da es hier um Performance geht. Viel Logic, draw calls, framerates, etc. Deshalb find ich den deterministischen Ansatz schomma gut. Werd mich da aber erst reinlesen müssen. Ansonsten danke für die Antworten :slight_smile: Bei Punkt 2 haben meine Synapsen irgendwie nicht geschaltet und Punkt 1 is einfach clever, da fehlt mir die Übung :smiley:

@WWW-Team: Die Smiley-Funktion bei diesem IntelliSense-mäßigen Autovervollständigungsgedöns is für jemanden, der Smileys benutzt, echt ziemlich nervig. Der RTE mit Vorschaufunktion und Wiki-Syntax hat aber an sich was " : ) ". Strg+z hätte nur echt auch noch was ; )

zu 3.:

wie willst du denn genau deine Würfelchen packen? Sind die unterscheidbar? Mein Verständnis ist „nein“

Dein Container ist immer gerade so groß, dass alle deine Würfel gerade so reinpassen. Kein Grund, von der Mitte anzufangen. Überleg dir lieber wo am Rand du die „Löcher“ haben möchtest, also die Positionen, die nicht befüllt sind.

Oder ist dein Container doch um einiges Größer als dein Paket?
Dann musst du da einen Hauptwürfel der Kantenlänge floor((n)^(1/3)) reinpacken und hast noch einen „Rest“, den du frei außen rum positionieren kannst. Das Ganze lässt sich jetzt ziemlich einfach in der Mitte von deinem Container zentrieren…