Advertisement
_who___

Lab5555

Jun 19th, 2023 (edited)
699
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. #ifdef _MSC_VER
  6. #  include <intrin.h>
  7. #  define __builtin_popcount __popcnt
  8. #endif
  9.  
  10. #define ISBIT(n,x) (((01<<(n))&(x))?1:0)
  11.  
  12. void outbyte(char byte)
  13. {          
  14.     int i;
  15.     for (i = 7; i > -1; i--)
  16.         putchar(ISBIT((i), byte) ? '*' : ' ');
  17.     fflush(stdout);
  18. }
  19.  
  20. void outbytes(int n, char* byte)
  21. {          
  22.     int i;
  23.     for (i = 0; i < n; i++)
  24.         outbyte(byte[i]);
  25.     putchar('\n');
  26. }
  27.  
  28.  
  29.  
  30. typedef struct img {
  31.     int w; int h;  // ширина, высота глифа
  32.     int dx;     //хз
  33.     int count;   //кол-во черных пикселей
  34.     int id;      //номер глифа
  35.     int bytes;  //количество байтов
  36.     double density; //плотность черных пикселей
  37.     int diam; //диаметр(самое большое расстояние межуду чеными пикселями), нужно найти
  38.     int perim; //периметр
  39.     int conn; //кол-во слияний
  40.     unsigned char* data; //битовая карта
  41. } IMG;
  42.  
  43. int popcnt16(unsigned short int i)
  44. {
  45.     return __builtin_popcount(i);
  46.     //   i = i - ((i >> 1) & 0x5555);
  47.     //   i = (i & 0x3333) + ((i >> 2) & 0x3333);
  48.     //   return (((i + (i >> 4)) & 0x0F0F) * 0x0101) >> 8;
  49. }
  50. int popcnt8(unsigned char i)
  51. {
  52.     int count;
  53.     count = 0;
  54.     while (i)
  55.     {
  56.         ++count;
  57.         i = (i - 1) & i;
  58.     }
  59.     return count;
  60. }
  61. int popcnt64(unsigned long long w) {
  62.     //  return __builtin_popcountll(w);
  63.     w -= (w >> 1) & 0x5555555555555555ULL;
  64.     w = (w & 0x3333333333333333ULL) + ((w >> 2) & 0x3333333333333333ULL);
  65.     w = (w + (w >> 4)) & 0x0f0f0f0f0f0f0f0fULL;
  66.     return (int)((w * 0x0101010101010101ULL) >> 56);
  67. }
  68. int popcnt32(unsigned int i)
  69. {
  70.     //   return __builtin_popcountl(i);
  71.     i = i - ((i >> 1) & 0x55555555);
  72.     i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
  73.     return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
  74. }
  75.  
  76.  
  77. IMG* init_img(int id, int w, int h)
  78. {          
  79.     IMG* t;
  80.     t = (IMG*)malloc(sizeof(IMG));
  81.     t->w = w; t->h = h; t->dx = 0;
  82.     t->count = 0;
  83.     t->id = id;
  84.     t->bytes = (((w + 7) / 8) * h);
  85.     t->data = (unsigned char*)calloc(t->bytes, 1);
  86.     return t;
  87. }
  88.  
  89.  
  90.  
  91. IMG* load_img(int id, char* s)      
  92. {
  93.     FILE* F;        
  94.     IMG* I;
  95.     I = (IMG*)malloc(sizeof(IMG));
  96.     F = fopen(s, "rb");
  97.     fread(&(I->w), sizeof(int), 1, F);
  98.     fread(&(I->h), sizeof(int), 1, F);
  99.     fread(&(I->dx), sizeof(int), 1, F);
  100.     fread(&(I->count), sizeof(int), 1, F);
  101.     fread(&(I->id), sizeof(int), 1, F);
  102.     fread(&(I->bytes), sizeof(int), 1, F);
  103.     I->data = (unsigned char*)calloc(I->bytes, 1);
  104.     fread(I->data, 1, I->bytes, F);
  105.     fclose(F);
  106.     I->conn = 0;
  107.     I->perim = 0;
  108.     return I;
  109. }
  110. int xcomp(IMG** a, IMG** b)
  111. {
  112.     return  -(*a)->w + (*b)->w;
  113. }
  114. int ycomp(IMG** a, IMG** b)
  115. {
  116.     return  -(*a)->h + (*b)->h;
  117. }
  118.  
  119. IMG* G[50000];
  120. int N;
  121. bool matr[100][100];
  122. bool flag[100][100];
  123.  
  124. int ISPIX(int argc, int i, int j)
  125. {
  126.     if (i < 0) return 0;
  127.     if (j < 0) return 0;
  128.     if (i >= G[argc]->w) return 0;
  129.     if (j >= G[argc]->h) return 0;
  130.  
  131.     return ISBIT((7 - j % 8), G[argc]->data[i * (G[argc]->bytes / G[argc]->h) + j / 8]);
  132. }
  133.  
  134. int offset[4][2] = { {-1, 0 }, { 0, -1 }, { 0, 1 }, { 1, 0 } };
  135.  
  136. double N_density(int h, int w, int count)// плотность писелей
  137. {
  138.     double co = count;
  139.     return co / (h * w);
  140. }
  141.  
  142. void dfs(int i, int j, int h, int w)//это бфс, тут ничего не нужно
  143. {
  144.     if (i < 0 || i >= h || j < 0 || j >= w || flag[i][j] || !matr[i][j])
  145.     {
  146.         return;
  147.     }
  148.  
  149.     flag[i][j] = true;
  150.     dfs(i - 1, j, h, w);
  151.     dfs(i + 1, j, h, w);
  152.     dfs(i, j - 1, h, w);
  153.     dfs(i, j + 1, h, w);
  154. }
  155.  
  156. int perim(int i, int j, int h, int w) //тут периметр, тоже ничего не нужно
  157. {
  158.     int k;
  159.     int p = 0;
  160.     bool f = false;
  161.  
  162.     for (k = 0; k < 4; k++)
  163.     {
  164.         int tmpi = i + offset[k][0];
  165.         int tmpj = j + offset[k][1];
  166.  
  167.         if (!matr[tmpi][tmpj] || (tmpi < 0 || tmpj < 0 || tmpi >= h || tmpj >= w))
  168.         {
  169.             f = true;
  170.         }
  171.     }
  172.  
  173.     if (f)
  174.     {
  175.         p++;
  176.     }
  177.     return p;
  178. }
  179.  
  180. int bfs(int h, int w)  //это диаметр, но она не робит, можешь попробовать доделать или переделать
  181. {
  182.     int i, j;
  183.  
  184.     for (i = 0; i < h; i++)
  185.     {
  186.         for (j = 0; j < w; j++)
  187.         {
  188.             if (!matr[i][j])
  189.             {
  190.                 continue;
  191.             }
  192.  
  193.             //stack[0] = i * w + j;
  194.             //size++;
  195.            
  196.         }
  197.     }
  198. }
  199.  
  200. int main(int argc, char* argv[])
  201. {
  202.     long int c;
  203.     int len, i, j, k;
  204.     unsigned char* s;
  205.     unsigned long long* t;
  206.     N = argc - 1;
  207.  
  208.     for (argc--; argc; argc--)
  209.     {
  210.         G[argc] = load_img(argc, argv[argc]);
  211.         printf("Loaded %s\n", argv[argc]); //зарузка глифа
  212.  
  213.         c = 0;
  214.         t = (unsigned long long*)G[argc]->data;
  215.         s = (unsigned char*)G[argc]->data; // на это забей, я не знаю что это оно тут было изначально
  216.  
  217.         len = G[argc]->bytes;//длина
  218.  
  219.         for (int i = 0; i < len / 8; i++)
  220.             c += popcnt64(t[i]);
  221.  
  222.         for (int i = (len / 8) * 8; i < len; i++)
  223.             c += popcnt8(s[i]);
  224.  
  225.         int q = 0;//это q, для создания матрицы
  226.         for (i = 0; i < G[argc]->h; i++)//тут создается матрица булевая где черные - true
  227.         {
  228.             for (j = 0; j < G[argc]->bytes / G[argc]->h; j++)
  229.             {
  230.                 char byte = G[argc]->data[q++];
  231.                 for (k = 0; k < 8; k++)
  232.                 {
  233.                     matr[i][j * 8 + (8 - k)] = ISBIT((k), byte);
  234.                 }
  235.             }
  236.         }
  237.  
  238.         G[argc]->conn = 0;// это слияния или что-то такое, ну тебе это не нужно
  239.         for (i = 0; i < G[argc]->h; i++) //это conn, тут не делай ничего
  240.         {
  241.             for (j = 0; j < G[argc]->w; j++)
  242.             {
  243.                 if (matr[i][j] && !flag[i][j])
  244.                 {
  245.                     dfs(i, j, G[argc]->h, G[argc]->w);
  246.                     G[argc]->conn++;
  247.                 }
  248.             }
  249.         }
  250.         for (int i = 0; i < G[argc]->h; i++)//это вывод глифа на экран
  251.         {
  252.             for (int j = 0; j < G[argc]->w; j++)
  253.             {
  254.                 printf(matr[i][j] ? "*" : " ");
  255.             }
  256.             printf("\n");
  257.         }
  258.  
  259.         for (i = 0; i < G[argc]->h; i++)//посчет периметра
  260.         {
  261.             for (j = 0; j < G[argc]->w; j++)
  262.             {
  263.                 if (matr[i][j])
  264.                 {
  265.                     G[argc]->perim += perim(i, j, G[argc]->h, G[argc]->w);
  266.                 }
  267.             }
  268.         }
  269.  
  270.         for (i = 0; i < G[argc]->h; i++)//обнуление матрицы
  271.         {
  272.             for (j = 0; j < G[argc]->w; j++)
  273.             {
  274.                 flag[i][j] = false;
  275.                 matr[i][j] = false;
  276.             }
  277.         }
  278.  
  279.         G[argc]->count = c;
  280.  
  281.         G[argc]->density = N_density(G[argc]->h, G[argc]->w, G[argc]->count);
  282.         printf("h : %d   w : %d\n", G[argc]->h, G[argc]->w);
  283.         printf("density: %lf\n", G[argc]->density);
  284.         printf("conn: %d\n", G[argc]->conn);
  285.         //printf("diam: %d\n", G[argc]->diam);
  286.         printf("perim: %d\n", G[argc]->perim);
  287.  
  288.     }
  289.     printf("%d\n", N);
  290. }
  291.  
  292. //Нужно найти схожие глифы и диаметр
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement