2010-07-19 37 views
5

Làm cách nào để xoay một dãy số nguyên hình chữ nhật 2D có số hàng lẻ gấp 45 độ?Xoay 2D Array 45 độ

Vì vậy, một cái gì đó giống như

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

vào

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

đối với bất kỳ kích thước (3x3, 5x5, 7x7, vv). Bằng cách thức này 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 

vào

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 

vào

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 

Trả lời

1

Đây là một mã được viết bởi tôi và một người bạn có thể giải quyết này:

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

Bạn có thể thử thư viện này:

Math.NET Project cho các hoạt động ma trận ... http://numerics.mathdotnet.com/

Mã này dường như là hữu ích quá:

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

Đừng quên Các không gian tên và lớp không được quản lý DirectX được quản lý và không được quản lý. Rất nhiều và rất nhiều công cụ tốt để kiểm tra.

Ví dụ:

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

+0

những ma trận chỉ 4x4 hoặc 3x3, tôi sẽ cố gắng math.net, nhưng tôi sợ xoay này là quá cụ thể – Kikaimaru

+4

Đây là các ma trận xoay để chuyển đổi. Một điều hoàn toàn khác. – Cloudanger

0

Tôi nghĩ rằng chúng tôi có những quy tắc:

  1. Hãy tưởng tượng ma trận như một bộ "khung hoặc hộp không có tâm" trong mỗi khác như "Nga búp bê ".

  2. Các phần tử ở giữa cạnh (trên cùng/trái/phải/dưới) di chuyển về phía góc gần nhất theo chiều kim đồng hồ.

  3. Góc di chuyển về phía tâm tiếp theo theo chiều kim đồng hồ.

  4. Các yếu tố không phải là góc cũng như các trung tâm di chuyển đến vị trí tiếp theo (theo chiều kim đồng hồ) có cùng khoảng cách với một góc như hiện tại.

Tôi đã bắt đầu viết một số mã nhưng tôi không nghĩ nó tầm thường và tôi không có thời gian để kiểm tra.

Các vấn đề liên quan