Advertisement
Guest User

lib

a guest
Dec 27th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.98 KB | None | 0 0
  1. #ifndef LIB
  2.  
  3. #define LIB
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define max(a,b) (a < b ? b : a)
  8. typedef struct picture
  9. {
  10. short** A;
  11. short** B;
  12. short** C;
  13. int rows;
  14. int cols;
  15. int rowsA;
  16. int colsA;
  17. int rowsB;
  18. int colsB;
  19. int rowsC;
  20. int colsC;
  21. } picture;
  22.  
  23. void pictureInit(picture* matrix, int n, int m);
  24. void picturePurge(picture* matrix, int n);
  25.  
  26. void rotate(picture* matrix, char code, int k);
  27. short** rotateArrayByNinety(short** a, int n, int m);
  28.  
  29. void flip(picture* matrix, char code, char dir);
  30. void flipArray(short** a, int n, int m, char dir);
  31.  
  32. void upscale(picture* matrix, char code, int n, int m);
  33. short** upscaleArray(short** a, int rows, int cols, int n, int m);
  34.  
  35. void downscale(picture* matrix, char code, int n, int m);
  36. short** downscaleArray(short** a, int rows, int cols, int n, int m);
  37.  
  38. void pictureInit(picture* matrix, int n, int m)
  39. {
  40. matrix->rows = n;
  41. matrix->cols = m;
  42. matrix->rowsA = n;
  43. matrix->colsA = m;
  44. matrix->rowsB = n;
  45. matrix->colsB = m;
  46. matrix->rowsC = n;
  47. matrix->colsC = m;
  48. matrix->A = (short**)(calloc(n, sizeof(short*)));
  49. matrix->B = (short**)(calloc(n, sizeof(short*)));
  50. matrix->C = (short**)(calloc(n, sizeof(short*)));
  51. for (int i = 0; i < n; ++i)
  52. {
  53. matrix->A[i] = (short*)(calloc(m, sizeof(short)));
  54. matrix->B[i] = (short*)(calloc(m, sizeof(short)));
  55. matrix->C[i] = (short*)(calloc(m, sizeof(short)));
  56. }
  57. return;
  58. }
  59.  
  60. void picturePurge(picture* matrix, int n)
  61. {
  62. for (int i = 0; i < n; ++i)
  63. {
  64. if (matrix->rowsA > i) free(matrix->A[i]);
  65. if (matrix->rowsB > i) free(matrix->B[i]);
  66. if (matrix->rowsC > i) free(matrix->C[i]);
  67. }
  68.  
  69. free(matrix->A);
  70. free(matrix->B);
  71. free(matrix->C);
  72. return;
  73. }
  74.  
  75. short** rotateArrayByNinety(short** a, int n, int m)
  76. {
  77. short** b = (short**)(calloc(m, sizeof(short*)));
  78. for (int i = 0; i < m; ++i)
  79. {
  80. b[i] = (short*)(calloc(n, sizeof(short)));
  81. }
  82. for (int j = 0; j < n; ++j)
  83. {
  84. for (int i = 0; i < m; ++i)
  85. {
  86. b[i][j] = a[j][i];
  87. }
  88. }
  89. for (int j = 0; j < n; ++j)
  90. {
  91. for (int i = 0; i < m / 2; ++i)
  92. {
  93. short tmp = b[i][j];
  94. b[i][j] = b[m - 1 - i][j];
  95. b[m - 1 - i][j] = tmp;
  96. }
  97. }
  98. for (int i = 0; i < n; ++i)
  99. {
  100. free(a[i]);
  101. }
  102. free(a);
  103. a = (short**)(calloc(m, sizeof(short*)));
  104. for (int i = 0; i < m; ++i)
  105. {
  106. a[i] = (short*)(calloc(n, sizeof(short)));
  107. }
  108. for (int i = 0; i < m; ++i)
  109. {
  110. for (int j = 0; j < n; ++j)
  111. {
  112. a[i][j] = b[i][j];
  113. }
  114. }
  115. return a;
  116. }
  117. void rotate(picture* matrix, char code, int k)
  118. {
  119. if (code == 'A')
  120. {
  121. for (int j = 0; j < k; ++j)
  122. {
  123. matrix->A = rotateArrayByNinety(matrix->A, matrix->rowsA, matrix->colsA);
  124. short tmp = matrix->rowsA;
  125. matrix->rowsA = matrix->colsA;
  126. matrix->colsA = tmp;
  127. }
  128. }
  129. else if (code == 'B')
  130. {
  131. for (int j = 0; j < k; ++j)
  132. {
  133. matrix->B = rotateArrayByNinety(matrix->B, matrix->rowsB, matrix->colsB);
  134. short tmp = matrix->rowsB;
  135. matrix->rowsB = matrix->colsB;
  136. matrix->colsB = tmp;
  137. }
  138. }
  139. else if (code == 'C')
  140. {
  141. for (int j = 0; j < k; ++j)
  142. {
  143. matrix->C = rotateArrayByNinety(matrix->C, matrix->rowsC, matrix->colsC);
  144. short tmp = matrix->rowsC;
  145. matrix->rowsC = matrix->colsC;
  146. matrix->colsC = tmp;
  147. }
  148. }
  149. return;
  150. }
  151.  
  152. void flipArray(short** a, int n, int m, char dir)
  153. {
  154. if (dir == 'H')
  155. {
  156. for (int j = 0; j < m; ++j)
  157. {
  158. for (int i = 0; i < n / 2; ++i)
  159. {
  160. short tmp = a[i][j];
  161. a[i][j] = a[n - 1 - i][j];
  162. a[n - 1 - i][j] = tmp;
  163. }
  164. }
  165. }
  166. else if (dir == 'V')
  167. {
  168. for (int i = 0; i < n; ++i)
  169. {
  170. for (int j = 0; j < m / 2; ++j)
  171. {
  172. short tmp = a[i][j];
  173. a[i][j] = a[i][m - 1 - j];
  174. a[i][m - 1 - j] = tmp;
  175. }
  176. }
  177. }
  178. }
  179. void flip(picture* matrix, char code, char dir)
  180. {
  181. if (code == 'A')
  182. {
  183. flipArray(matrix->A, matrix->rowsA, matrix->colsA, dir);
  184. }
  185. else if (code == 'B')
  186. {
  187. flipArray(matrix->B, matrix->rowsB, matrix->colsB, dir);
  188. }
  189. else if (code == 'C')
  190. {
  191. flipArray(matrix->C, matrix->rowsC, matrix->colsC, dir);
  192. }
  193. return;
  194. }
  195.  
  196. short** upscaleArray(short** a, int rows, int cols, int n, int m)
  197. {
  198. short** b = (short**)(calloc(rows * n, sizeof(short*)));
  199. for (int i = 0; i < n * rows; ++i)
  200. {
  201. b[i] = (short*)(calloc(cols * m, sizeof(short)));
  202. }
  203. for (int i = 0; i < n * rows; i++)
  204. {
  205. for (int j = 0; j < cols * m; j++)
  206. {
  207. b[i][j] = a[i / n][j / m];
  208. }
  209. }
  210. for (int i = 0; i < rows; ++i)
  211. {
  212. free(a[i]);
  213. }
  214. free(a);
  215. a = b;
  216. return a;
  217. }
  218. void upscale(picture* matrix, char code, int n, int m)
  219. {
  220. if (code == 'A')
  221. {
  222. matrix->A = upscaleArray(matrix->A, matrix->rowsA, matrix->colsA, n, m);
  223. matrix->rowsA *= n;
  224. matrix->colsA *= m;
  225. }
  226. else if (code == 'B')
  227. {
  228. matrix->B = upscaleArray(matrix->B, matrix->rowsB, matrix->colsB, n, m);
  229. matrix->rowsB *= n;
  230. matrix->colsB *= m;
  231. }
  232. else if (code == 'C')
  233. {
  234. matrix->C = upscaleArray(matrix->C, matrix->rowsC, matrix->colsC, n, m);
  235. matrix->rowsC *= n;
  236. matrix->colsC *= m;
  237. }
  238.  
  239. return;
  240. }
  241.  
  242. short** downscaleArray(short** a, int rows, int cols, int n, int m)
  243. {
  244. short** b = (short**)(calloc(rows / n, sizeof(short*)));
  245. for (int i = 0; i < rows / n; ++i)
  246. {
  247. b[i] = (short*)(calloc(cols / m, sizeof(short)));
  248. }
  249. for (int i = 0; i < rows; i += n)
  250. {
  251. for (int j = 0; j < cols; j += m)
  252. {
  253. b[i / n][j / m] = a[i][j];
  254. }
  255. }
  256. for (int i = 0; i < rows; ++i)
  257. {
  258. free(a[i]);
  259. }
  260. free(a);
  261. a = b;
  262. return a;
  263. }
  264. void downscale(picture* matrix, char code, int n, int m)
  265. {
  266. if (code == 'A')
  267. {
  268. matrix->A = downscaleArray(matrix->A, matrix->rowsA, matrix->colsA, n, m);
  269. matrix->rowsA /= n;
  270. matrix->colsA /= m;
  271. }
  272. else if (code == 'B')
  273. {
  274. matrix->B = downscaleArray(matrix->B, matrix->rowsB, matrix->colsB, n, m);
  275. matrix->rowsB /= n;
  276. matrix->colsB /= m;
  277. }
  278. else if (code == 'C')
  279. {
  280. matrix->C = downscaleArray(matrix->C, matrix->rowsC, matrix->colsC, n, m);
  281. matrix->rowsC /= n;
  282. matrix->colsC /= m;
  283. }
  284. return;
  285. }
  286. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement