2010-07-19 208 views
5

如何旋轉奇數行45度的整數的二維矩形陣列?將2D陣列旋轉45度

因此,像

int[] myArray = new int[,] 
{ 
    {1, 0 ,1}, 
    {0, 1 ,0}, 
    {0, 0 ,0}, 
} 

int[] rotatedArray = new int[,] 
{ 
    {0, 1 ,0}, 
    {0, 1 ,1}, 
    {0, 0 ,0}, 
} 

任何尺寸(3x3的,5x5的,7x7的,等等)。由該式http://yfrog.com/n6matrix45p

5x5的

0 0 0 0 0 
2 0 0 0 0 
1 1 1 1 1 
0 0 0 0 0 
0 0 0 0 0 

1 2 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
0 0 0 0 1 

5x5的

0 0 0 3 0 
0 0 0 3 0 
0 0 0 3 0 
0 0 0 3 0 
0 0 0 3 0 

0 0 0 0 0 
0 0 0 0 3 
0 0 0 3 0 
0 0 3 3 0 
0 3 0 0 0 

回答

1

這是我寫的代碼,並可以解決這個朋友:

public static class ArrayExtensions 
{ 
    public static Point RoundIndexToPoint(int index, int radius) 
    { 
     if (radius == 0) 
      return new Point(0, 0); 
     Point result = new Point(-radius, -radius); 

     while (index < 0) index += radius * 8; 
     index = index % (radius * 8); 

     int edgeLen = radius * 2; 

     if (index < edgeLen) 
     { 
      result.X += index; 
     } 
     else if ((index -= edgeLen) < edgeLen) 
     { 
      result.X = radius; 
      result.Y += index; 
     } 
     else if ((index -= edgeLen) < edgeLen) 
     { 
      result.X = radius - index; 
      result.Y = radius; 
     } 
     else if ((index -= edgeLen) < edgeLen) 
     { 
      result.Y = radius - index; 
     } 

     return result; 
    } 

    public static T[,] Rotate45<T>(this T[,] array) 
    { 
     int dim = Math.Max(array.GetLength(0), array.GetLength(0)); 

     T[,] result = new T[dim, dim]; 

     Point center = new Point((result.GetLength(0) - 1)/2, (result.GetLength(1) - 1)/2); 
     Point center2 = new Point((array.GetLength(0) - 1)/2, (array.GetLength(1) - 1)/2); 
     for (int r = 0; r <= (dim - 1)/2; r++) 
     { 
      for (int i = 0; i <= r * 8; i++) 
      { 
       Point source = RoundIndexToPoint(i, r); 
       Point target = RoundIndexToPoint(i + r, r); 

       if (!(center2.X + source.X < 0 || center2.Y + source.Y < 0 || center2.X + source.X >= array.GetLength(0) || center2.Y + source.Y >= array.GetLength(1))) 
        result[center.X + target.X, center.Y + target.Y] = array[center2.X + source.X, center2.Y + source.Y]; 
      } 
     } 
     return result; 
    }  
} 

0

你可以試試這個庫:

Math.NET Project爲矩陣操作... http://numerics.mathdotnet.com/

此代碼似乎是太有用:

http://www.drunkenhyena.com/cgi-bin/view_net_article.pl?chapter=2;article=28#Rotation

不要忘了DirectX託管和非託管名稱空間和類。很多 和很多好東西在那裏檢查。

例如:

Matrix..::.Rotate Method (Single, MatrixOrder)

+0

這些矩陣只有4×4或3×3,我會盡力math.net,但我擔心這種旋轉是過於具體 – Kikaimaru 2010-07-19 07:59:08

+4

這些是用於轉換的旋轉矩陣。完全不同的事情。 – Cloudanger 2010-07-19 08:52:54

0

我認爲我們有以下規則:

  1. 想象矩陣中的每個其他類似的「俄羅斯一組「框架或箱子沒有中心」娃娃」。

  2. 一側(頂部/左側/右側/底部)中心的元素順時針移動到最近的角落。

  3. 角落順時針移向下一個中心。

  4. 不是拐角也不是中心的元素移動到距離拐角相同距離的下一個點(順時針)。

我已經開始寫一些代碼,但我不認爲這是小事,我還沒有時間來檢驗。