Array um 90° Drehen

  • Hey.

    Ich habe ein Array, wobei die Größe der ersten Dimension der Anzahl der Felder enspricht.
    Die Anzahl der Felder in die Breite und höhe müssen bzw. sind gleich.
    In der zweiten Dimension stehen andere Werte, welche natürlich an die neue Position im gedrehen Array landen sollen.

    Stehe momentan etwas auf dem Schlauch :

    Spoiler anzeigen
    [autoit]

    Func _ArrayRotate(ByRef $aArray)
    ; 0 1 2
    ; 3 4 5
    ; 6 7 8

    [/autoit] [autoit][/autoit] [autoit]

    ; 6 3 0
    ; 7 4 1
    ; 8 5 2

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUbounD1 = UBound($aArray,1)
    Local $iUbounD2 = UBound($aArray,1)
    Local $iFeldAnz = Sqrt($iUbounD1)
    ;; >> Wenn kein Int
    If Not IsInt($iFeldAnz) Then Return SetError(1,'',-1)
    Local $aNarr[$iUbounD1][$iUbounD2]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $iUbounD1 - 1
    For $j = 0 To $iUbounD2 - 1

    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Hey.
    Ist leider nicht ganz das was ich suche.
    Diese Funktion verstauscht ja nur die erste Dimension mit der zweiten.
    Anscheinden versteht man nicht ganz was ich meine xD

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Hier:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aArray[3][3] = [[0, 1, 2],[3, 4, 5],[6, 7, 8]]
    ;Global $aArray[4][3] = [[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]]
    _ArrayDisplay($aArray)
    _Array2DRotate($aArray, 0)
    _ArrayDisplay($aArray)

    [/autoit] [autoit][/autoit] [autoit]

    Func _Array2DRotate(ByRef $aArray, $iClockwise = True)
    If UBound($aArray, 0) <> 2 Then Return SetError(1, 0, False)
    Local $iDim1 = UBound($aArray, 1)
    Local $iDim2 = UBound($aArray, 2)
    Local $aNew[$iDim2][$iDim1]
    Switch $iClockwise
    Case True
    For $i = 0 To $iDim1 - 1
    For $j = 0 To $iDim2 - 1
    $aNew[$iDim2 - $j - 1][$i] = $aArray[$i][$j]
    Next
    Next
    Case Else
    For $i = 0 To $iDim1 - 1
    For $j = 0 To $iDim2 - 1
    $aNew[$j][$iDim1 - $i - 1] = $aArray[$i][$j]
    Next
    Next
    EndSwitch
    $aArray = $aNew
    Return True
    EndFunc ;==>_Array2DRotate

    [/autoit]

    Für BlockOut musste ich das mit einem 3D Array machen :D

    E

  • Hey.
    Ganau so hatte ich es schon, nun hätte ich es aber so machen wollen, 2 Dimensionen hat, wobei die 2 dimension nicht gleich groß sein muss wie die erste, sodass ich den feldern ganz einfach in der 2 DImension spezielle werte zuweisen kann.

    EDIT : Um zu vermeiden, dass ich ein 3 D Array nehem muss hatte ich nach einer anderen lösung gesucht, um die fehlerfindeung, bsw. mit dem Arraydisplay einfacher zu gestallten(da Arraydisplay nur 2 D Arrays darstellen kann).

    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    Einmal editiert, zuletzt von Darter (8. Januar 2011 um 08:47)

  • eukalyptus hat doch schon die richtige Funktion gepostet. Diese kann alle 2D-Arrays auch mit unterschiedlichen Dimensionen rotieren bzw transformieren ;)