Ich habe ein 3-dimensionales Array. Betrachten Sie es als einen Ziegelstein. Es gibt 24 mögliche Drehungen dieses Ziegels (die seine Kanten parallel zu den Koordinatenachsen halten). Wie generiere ich alle entsprechenden 3-dimensionalen Arrays?Wie bekommt man alle 24 Rotationen eines 3-dimensionalen Arrays?
Antwort
Sie können Rotationsmatrizen verwenden. Drehen eines 3D-Arrays um die X-Achse bedeutet, dass das Element an Position (i,j,k)
auf Position (i,-k,j)
abgebildet wird. Natürlich, wenn Ihr Array 0-indiziert ist, müssen Sie wahrscheinlich -k
durch size-1-k
oder etwas ähnliches ersetzen.
In ähnlicher Weise wird die Drehung um die y-Achse (i,j,k)
zu (k,j,-i)
. Diese zwei Rotationen können als Matrizen dargestellt werden. Für die X-Achsen-Rotation:
|i'| |1 0 0| |i|
|j'| = |0 0 -1|*|j|
|k'| |0 1 0| |k|
Und für die y-Achsen-Rotation:
|i'| |0 0 1| |i|
|j'| = |0 1 0|*|j|
|k'| |-1 0 0| |k|
Jede allgemeine Drehung kann als eine Folge von diesen beiden Rotationen beschrieben. Wenn Sie nacheinander zwei Rotationen anwenden, multiplizieren Sie einfach die 3x3-Matrizen. Also, wenn Sie alle möglichen Produkte von ihnen finden, würden Sie 24 Matrizen (einschließlich der Identität) erhalten, jeder entspricht einer gültigen Rotation Ihres Arrays. Es ist ein wenig schwierig, alle möglichen Multiplikationen zu finden, weil sie nicht pendeln.
Ich denke, man kann nur Brute-Force alle Produkte der Form (A^p)*(B^q)*(A^r)*(B^s)
, wobei A und B sind die beiden Matrizen vor und p,q,r,s
ihre Kräfte sind, und der Bereich von 0 bis 3 (Potenzieren A oder B bis 4 werden sie nehmen zurück zur Identitätsmatrix).
Auf diese Weise können Sie alle 24 gültigen Rotationsmatrizen generieren und das 3D-Array mit jedem von ihnen drehen. Achten Sie dabei darauf, die negativen Indizes so zu verschieben, dass Sie nicht außerhalb der Grenzen zugreifen.
Ein Würfel (ein halbes Würfelpaar) ist praktisch, um die 24 verschiedenen Orientierungen zu beobachten und kann Operationssequenzen vorschlagen, um diese zu erzeugen. Sie werden sehen, dass eine beliebige der sechs Flächen die oberste sein kann und die darunter liegenden Seiten in vier verschiedene Himmelsrichtungen gedreht werden können. Lassen Sie uns zwei Operationen bedeuten: von Ihnen „ drehen“ und „Rolle“, wo wiederum die Düse um die z-Achse von einem Kardinal auf die nächste dreht und Rolle die 90 dreht sterben ° weg, so das Auswärts-Gesicht wird zur Unterseite und das Nah-Gesicht zur Oberseite. Diese Operationen können unter Verwendung von Rotationsmatrizen ausgedrückt werden, wie in der Antwort von Felipe Lopes erwähnt, oder können als einfache Funktionen ausgedrückt werden, die, wenn sie gegeben sind (x, y, z), zurückkehren (-y, x, z) oder (x, z, - y) jeweils.
Wenn Sie den Würfel mit 1 auf der nahen Seite, 2 auf der rechten und 3 auf der oberen Seite platzieren, werden Sie feststellen, dass die folgende Schrittfolge die zwölf verschiedenen Orientierungen mit 1, 2 oder 3 Punkten erzeugt oben: RTTTRTTTRTTT. Dann legt die Sequenz RTR 6, 4, 5 offen, wo ursprünglich 1, 2, 3 waren, und eine Wiederholung der Sequenz RTTTRTTTRTTT erzeugt die zwölf Orientierungen mit 4, 5 oder 6 Punkten oben. Die genannte Sequenz ist in den folgenden Python-Code eingebettet.
def roll(v): return (v[0],v[2],-v[1])
def turn(v): return (-v[1],v[0],v[2])
def sequence (v):
for cycle in range(2):
for step in range(3): # Yield RTTT 3 times
v = roll(v)
yield(v) # Yield R
for i in range(3): # Yield TTT
v = turn(v)
yield(v)
v = roll(turn(roll(v))) # Do RTR
p = sequence((1, 1, 1))
q = sequence((-1,-1, 1))
for i in sorted(zip(p,q)):
print i
Die Begründung für eine sortierte Liste von transformierten Punktpaare Ausdrucken ist zweifach: (i) eine beliebige Flächenorientierung durch die Positionen von zwei seiner Ecken festgelegt werden können; (ii) es ist dann einfach, die Eindeutigkeit jedes Paares zu prüfen, z. B. durch Rohrleitungsausgabe an uniq
.
Hier ist, wie die sortierte Ausgabe beginnt:
((-1, -1, -1), (-1, 1, 1))
((-1, -1, -1), (1, -1, 1))
((-1, -1, -1), (1, 1, -1))
((-1, -1, 1), (-1, 1, -1))
((-1, -1, 1), (1, -1, -1))
((-1, -1, 1), (1, 1, 1))
((-1, 1, -1), (-1, -1, 1))
((-1, 1, -1), (1, -1, -1))
((-1, 1, -1), (1, 1, 1))
- 1. Wie bekommt man alle Blattknoten eines Baumes?
- 2. Wie bekommt man alle Frauen?
- 3. Wie man alle benutzten Bereiche eines Arbeitsbuchs bekommt
- 4. Wie bekommt man alle Geburtstage von heute?
- 5. Wie bekommt man alle Kommentare von Disqus?
- 6. Wie man alle Systemikonen in Xcode bekommt
- 7. Wie bekommt man alle Kurse auf Moodle?
- 8. Wie bekommt man das Alter eines Tweets?
- 9. wie alle Datensätze eines 2D-Arrays erhalten, durch die Schleife
- 10. Wie überprüft man ALLE Elemente eines booleschen Arrays sind wahr
- 11. Wie generiert man alle Permutationen eines Arrays in sortierter Reihenfolge?
- 12. Wie bekommt man wod_qty_req?
- 13. Wie bekommt man die Länge eines Tisches in Lua?
- 14. Wie bekommt man Abhängigkeiten Baum?
- 15. Wie bekommt man alle einzigartigen Positionen aus einer Liste?
- 16. EXT-GWT Portal: Wie bekommt man alle Portlets?
- 17. Slim 3 - Wie bekommt man alle Get/Put/Post-Variablen?
- 18. Wie bekommt man den Namen eines gesendeten Formulars in Flask?
- 19. Alle Teilmengen eines Arrays rekursiv drucken
- 20. Wie bekommt man seine Vertriebsgruppe von Lync
- 21. Zip-Datei alle 24 Stunden
- 22. Wie man die Größe eines Arrays verdoppelt
- 23. Wie kopiert man Teile eines 2D-Arrays?
- 24. Wie bekommt man die Größe eines Flex Akkordeon Kindes?
- 25. Pyqt wie man die Abmessungen eines Widgets bekommt
- 26. In Erlangs PropEr, wie bekommt man eine Probe eines Generators?
- 27. Wie bekommt man einen Scanner
- 28. Wie bekommt man die Ansicht?
- 29. Wie bekommt man Twitter URLs?
- 30. Ausführen einer PHP-Aufgabe alle 24 Stunden
Sie einen Versuch machen, sollten sich ... –
@ MitchWheat- Dies ist ein schwieriges Problem! Ich glaube, ich würde ziemlich schnell stecken bleiben, selbst wenn ich mich darum bemühen würde. – templatetypedef