public static T[,] Transform <T>(this T[,] array, FlipRotate2D transformation) { if (ReferenceEquals(array, null)) { return(null); } byte t = transformation.Value; int dim = t >> 2; int w = array.GetLength(dim); int h = array.GetLength(dim ^ 1); int dx = (t >> 1 ^ t) & 1, dy = t & 1; int ax_init = dx * (w - 1); dx = 1 - (dx << 1); int ay_init = dy * (h - 1); dy = 1 - (dy << 1); T[,] result = new T[w, h]; int[] a = new int[2]; a[dim ^ 1] = ax_init; for (int rx = 0; rx < w; ++rx, a[dim ^ 1] += dx) { a[dim] = ay_init; for (int ry = 0; ry < h; ++ry, a[dim] += dy) { result[rx, ry] = array[a[1], a[0]]; } } return(result); }
public static T[,] Transform <T>(this T[,] array, RotateFlipType transformation) { return(Transform <T>(array, FlipRotate2D.FromRotateFlipType(transformation))); }