2016-11-30 2 views
0

J'ai écrit une rotation de tableau 2D qui fonctionne très bien, mais j'ai un point qui est concentré sur un seul emplacement sur la matrice et affiche un "!" au lieu du nombre lors de l'affichage du tableau. Je pensais que si je vérifiais le point pendant la rotation du tableau, puis changeais la position du point à la nouvelle position du tableau, le point de mise au point tournerait alors avec le tableau, mais le nouvel emplacement du point ne correspond tout simplement pas. correspondre au point de rotation.Rotation de tableau 2D et rotation d'un point dans vb.net

Dans l'exemple, je me concentre sur le nombre "5" (position 1,1), et devrait toujours afficher le "!" au lieu de "5".

Cette rotation fonctionne pour un point focal de 0,0, mais pas pour d'autres points. Quelqu'un peut-il me signaler ce que je fais de mal et expliquer pourquoi la logique ne fonctionne pas toujours?

Public Module Module1 

    Dim focalX As Integer = 1 
    Dim focalY As Integer = 1 

    Sub Main() 
     Dim src(,) As String = 
      { 
       {"1", "2", "3"}, 
       {"4", "5", "6"}, 
       {"7", "8", "9"}, 
       {"0", "1", "2"} 
      } 

     ShowArray(src) 

     src = RotatedCW(src) 

     ShowArray(src) 

     src = RotatedCW(src) 

     ShowArray(src) 

     src = RotatedCW(src) 

     ShowArray(src) 

     Console.WriteLine() 
     Console.WriteLine("Press Enter to exit...") 
     Console.ReadLine() 
    End Sub 

    Sub ShowArray(src(,) As String) 
     Console.WriteLine(focalX & ", " & focalY) 

     For i = 0 To src.GetUpperBound(0) 
      For j = 0 To src.GetUpperBound(1) 
       If focalX = j And focalY = i Then 
        Console.Write("!" & " ") 
       Else 
        Console.Write(src(i, j) & " ") 
       End If 
      Next 
      Console.WriteLine() 
     Next 

     Console.WriteLine() 
    End Sub 

    Function RotatedCW(src(,) As String) As String(,) 
     Dim maxX As Integer = src.GetUpperBound(0) 
     Dim maxY As Integer = src.GetUpperBound(1) 

     Dim newArray(maxY, maxX) As String 
     For i = 0 To maxX 
      For j = 0 To maxY 
       newArray(j, maxX - i) = src(i, j) 

       If focalX = j And focalY = i Then 
        focalX = maxX - i 
        focalY = j 
       End If 
      Next 
     Next 
     Return newArray 
    End Function 

End Module 

Répondre

1

Juste fixe votre rotate logique de fonction

Function RotatedCW(src(,) As String) As String(,) 
    Dim maxX As Integer = src.GetUpperBound(0) 
    Dim maxY As Integer = src.GetUpperBound(1) 

    Dim oldFocalY = focalY 
    focalY = focalX 
    focalX = maxX - oldFocalY 

    Dim newArray(maxY, maxX) As String 
    For i = 0 To maxX 
     For j = 0 To maxY 
      newArray(j, maxX - i) = src(i, j) 
     Next 
    Next 
    Return newArray 
End Function 

A pris les affectations de point focal de la boucle, car ils ne sont faits une fois le calcul est très simple.

+1

Merci pour votre aide! Le simple fait de voir le vôtre m'a finalement permis de me rendre compte de ce que j'avais fait de mal, de le mettre dans la boucle, et quand il a été tourné (correctement) et que les boucles ont rencontré le nouvel emplacement pivoté, il a appliqué le même calcul. – Fozzedout