2016-11-30 4 views
0

Я написал двумерное вращение массива, которое работает отлично, однако у меня есть точка, которая ориентирована на одно место в массиве и отображает «!». вместо числа при отображении массива.Вращение 2D-массива и вращение точки в vb.net

Я думал, что если бы я проверил точку во время вращения массива, а затем изменил положение точки на новую позицию в массиве, то точка фокусировки затем вращалась бы с массивом, однако новое местоположение точки просто не совпадают с вращающейся точкой.

В этом примере я фокусируюсь на числе «5» (позиция 1,1) и всегда должен отображать «!». вместо «5».

Это вращение работает для фокуса 0,0, но не для других точек. Может ли кто-нибудь указать мне, что я делаю неправильно, и объяснить, почему логика не всегда работает?

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 

ответ

1

Просто фиксированной вашей функции поворота логики

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 

Принимал фокусные задания точек из цикла, потому что они только сделать один раз и математика очень проста.

+1

Благодарим вас за это! Просто увидев, что вы наконец поняли, что я сделал неправильно, поставьте его в петлю, поэтому, когда он был повернут (правильно), и петли затем столкнулись с новым поворотным местом, он снова применил ту же математику, отправив ее где-то неожиданным. – Fozzedout