Guest User

Untitled

a guest
Aug 14th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. Rotating a 2d array -> reversing a loop
  2. typedef struct bitmask {
  3. int w,h;
  4. BITMASK_W bits[1];
  5. } bitmask_t;
  6.  
  7. bitmask_t* bitmask_rotate(const bitmask_t *mask, float angle) {
  8. bitmask_t *newmask = NULL;
  9.  
  10. double radangle, sangle, cangle;
  11. int isin, icos;
  12. double cx, cy, sx, sy;
  13. int x, y, ax, ay, xd, yd, dx, dy;
  14. int nxmax, nymax, xmaxval, ymaxval;
  15.  
  16. radangle = angle * DEG_TO_RAD;
  17. sangle = sin(radangle);
  18. cangle = cos(radangle);
  19. isin = (int)(sangle * 65536);
  20. icos = (int)(cangle * 65536);
  21.  
  22. x = mask->w;
  23. y = mask->h;
  24. cx = cangle*x;
  25. cy = cangle*y;
  26. sx = sangle*x;
  27. sy = sangle*y;
  28. nxmax = (int) (MAX (MAX (MAX (fabs (cx + sy), fabs (cx - sy)), fabs (-cx + sy)), fabs (-cx - sy)));
  29. nymax = (int) (MAX (MAX (MAX (fabs (sx + cy), fabs (sx - cy)), fabs (-sx + cy)), fabs (-sx - cy)));
  30.  
  31. newmask = bitmask_create(nxmax, nymax, 0);
  32. if (!newmask) return NULL;
  33.  
  34. cy = newmask->h / 2;
  35. xd = ((mask->w - newmask->w) << 15);
  36. yd = ((mask->h - newmask->h) << 15);
  37.  
  38. ax = ((newmask->w) << 15) - (int)(cangle * ((newmask->w - 1) << 15));
  39. ay = ((newmask->h) << 15) - (int)(sangle * ((newmask->w - 1) << 15));
  40.  
  41. xmaxval = ((mask->w) << 16) - 1;
  42. ymaxval = ((mask->h) << 16) - 1;
  43.  
  44. for (y = 0; y < newmask->h; y++) {
  45. dx = (ax + (isin * (cy - y))) + xd;
  46. dy = (ay - (icos * (cy - y))) + yd;
  47. for (x = 0; x < newmask->w; x++) {
  48. if (!(dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval)) {
  49. if (bitmask_getbit(mask, dx >> 16, dy >> 16)) {
  50. bitmask_setbit(newmask, x, y);
  51. }
  52. }
  53.  
  54. dx += icos;
  55. dy += isin;
  56. }
  57. }
  58.  
  59. return newmask;
  60. }
  61.  
  62. for (x = 0; x < newmask->w; x++) {
  63. dx = (ax + (isin * cy + icos * x)) + xd;
  64. dy = (ay - (icos * cy - isin * x)) + yd;
  65. for (y = 0; y < newmask->h; y++) {
  66. if (!(dx < 0 || dy < 0 || dx > xmaxval || dy > ymaxval)) {
  67. if (bitmask_getbit(mask, dx >> 16, dy >> 16)) {
  68. bitmask_setbit(newmask, x, y);
  69. }
  70. }
  71.  
  72. dx -= isin;
  73. dy += icos;
  74. }
  75. }
Add Comment
Please, Sign In to add comment