Let's say I have an array that is stored at 0 ° rotation:
0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
And I want it to come back in a good approximation, if I pass, for example 30 ° as a parameter, it will be something like this:
0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
45 ° would be
1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
I am aware of the solutions placed to rotate 90 °. But I do not think this will help me here?
I don't have an example code because I don’t even know where to start looking. If there are any keywords, I can point to google, which point me in the directions of some formula that I can adapt for this, which would also be great.
Solution for ghost code in C #:
class Rotation { public Rotation() { A = new int[xs,ys]{ {0,0,0,9,0,0,0}, {0,0,0,9,0,0,0}, {0,0,0,9,0,0,0}, {9,9,9,9,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, }; B = new int[xs, ys]; deg = (float)(Math.PI / 180.0); } public const int xs = 7; // matrix size public const int ys = 7; const int x0 = 3; // rotation center cell const int y0 = 3; readonly float deg; public int[,] A; public int[,] B; //--------------------------------------------------------------------------- public void rotcv(float ang) { rotcw(Rotation.x0, Rotation.y0, ang); } private void rotcw(int x0, int y0, float ang) // rotate A -> B by angle ang around (x0,y0) CW if ang>0 { int x, y, ix0, iy0, ix1, iy1, q; double xx, yy, fx, fy, c, s; // circle kernel c = Math.Cos(-ang); s = Math.Sin(-ang); // rotate for (y = 0; y < ys; y++) for (x = 0; x < xs; x++) { // offset so (0,0) is center of rotation xx = x - x0; yy = y - y0; // rotate (fx,fy) by ang fx = ((xx * c) - (yy * s)); fy = ((xx * s) + (yy * c)); // offset back and convert to ints and weights fx += x0; ix0 = (int)Math.Floor(fx); fx -= ix0; ix1 = ix0 + 1; if (ix1 >= xs) ix1 = ix0; fy += y0; iy0 = (int)Math.Floor (fy); fy -= iy0; iy1 = iy0 + 1; if (iy1 >= ys) iy1 = iy0; // bilinear interpolation A[fx][fy] -> B[x][y] if ((ix0 >= 0) && (ix0 < xs) && (iy0 >= 0) && (iy0 < ys)) { xx = (A[ix0,iy0]) + ((A[ix1,iy0] - A[ix0,iy0]) * fx); yy = (A[ix0,iy0]) + ((A[ix1,iy0] - A[ix0,iy0]) * fx); xx = xx + ((yy - xx) * fy); q =(int) xx; } else q = 0; B[x,y] = q; } } }
Test:
static void Main(string[] args) { Rotation rot = new Rotation(); for (int x = 0; x < Rotation.xs; x++) { for (int y = 0; y < Rotation.xs; y++) { Console.Write(rot.A[x,y] + " "); } Console.WriteLine(); } Console.WriteLine(); float rotAngle = 0; while (true) { rotAngle += (float)(Math.PI/180f)*90; rot.rotcv(rotAngle); for (int x = 0; x < Rotation.xs; x++) { for (int y = 0; y < Rotation.xs; y++) { Console.Write(rot.B[x, y] + " "); } Console.WriteLine(); } Console.WriteLine(); Console.ReadLine(); } }