您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

868 行
24 KiB

  1. /* test shit */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <SDL_image.h>
  8. #define MAXWIDTH 512
  9. #define MAXHEIGHT 512
  10. #define true 1
  11. #define false 0
  12. static int WIDTH, HEIGHT;
  13. static inline float get(float const *src, int x, int y)
  14. {
  15. return src[y * WIDTH + x];
  16. }
  17. static inline void put(float *src, int x, int y, float p)
  18. {
  19. src[y * WIDTH + x] = p;
  20. }
  21. static float *new(void)
  22. {
  23. return malloc(WIDTH * HEIGHT * sizeof(float));
  24. }
  25. static float *copy(float const *src)
  26. {
  27. float *dest = malloc(WIDTH * HEIGHT * sizeof(float));
  28. memcpy(dest, src, WIDTH * HEIGHT * sizeof(float));
  29. return dest;
  30. }
  31. #define N 5
  32. #define NN ((N * 2 + 1))
  33. static void makegauss(float mat[NN][NN], float sigma, float dx, float dy)
  34. {
  35. float t = 0;
  36. int i, j;
  37. sigma = 2. * sigma * sigma;
  38. for(j = 0; j < NN; j++)
  39. for(i = 0; i < NN; i++)
  40. {
  41. float a = (float)(i - N) + dx;
  42. float b = (float)(j - N) + dy;
  43. mat[i][j] = pow(M_E, - (a * a + b * b) / sigma);
  44. t += mat[i][j];
  45. }
  46. for(j = 0; j < NN; j++)
  47. for(i = 0; i < NN; i++)
  48. mat[i][j] /= t;
  49. }
  50. static float *gauss(float const *src, float mat[NN][NN])
  51. {
  52. float *dest = new();
  53. int x, y, i, j;
  54. for(y = N; y < HEIGHT - N; y++)
  55. for(x = N; x < WIDTH - N; x++)
  56. {
  57. float p = 0;
  58. for(j = 0; j < NN; j++)
  59. for(i = 0; i < NN; i++)
  60. p += get(src, x + i - N, y + j - N) * mat[i][j];
  61. put(dest, x, y, p);
  62. }
  63. return dest;
  64. }
  65. static float *fullgauss(float const *src, float mat[NN][NN])
  66. {
  67. float *dest = new();
  68. int x, y, i, j;
  69. for(y = 0; y < HEIGHT; y++)
  70. for(x = 0; x < WIDTH; x++)
  71. {
  72. float p = 0;
  73. for(j = 0; j < NN; j++)
  74. for(i = 0; i < NN; i++)
  75. if(x + i >= N && x + i < WIDTH + N
  76. && y + j >= N && y + j < HEIGHT + N)
  77. p += get(src, x + i - N, y + j - N) * mat[i][j];
  78. put(dest, x, y, p);
  79. }
  80. return dest;
  81. }
  82. static float fulldist(float const *p1, const float *p2)
  83. {
  84. float error = 0.;
  85. int x, y;
  86. for(y = 0; y < HEIGHT; y++)
  87. for(x = 0; x < WIDTH; x++)
  88. {
  89. float t = get(p1, x, y) - get(p2, x, y);
  90. error += t * t;
  91. }
  92. return error / (WIDTH * HEIGHT);
  93. }
  94. static float dist(float const *p1, float const *p2, float max)
  95. {
  96. float error = 0.;
  97. int x, y;
  98. max *= (WIDTH - N) * (HEIGHT - N);
  99. for(y = N; y < HEIGHT - N; y++)
  100. {
  101. for(x = N; x < WIDTH - N; x++)
  102. {
  103. float t = get(p1, x, y) - get(p2, x, y);
  104. error += t * t;
  105. }
  106. /* Experience shows that this is almost useless, because the
  107. * functions we manipulate are so small that the difference
  108. * only happens in the last 1% of the image... */
  109. if(error > max)
  110. break;
  111. }
  112. return error / ((WIDTH - N) * (HEIGHT - N));
  113. }
  114. static float *load(char const *name)
  115. {
  116. SDL_Surface *tmp, *surface;
  117. uint32_t *pixels;
  118. float *floats;
  119. int x, y;
  120. tmp = IMG_Load(name);
  121. if(!tmp)
  122. return NULL;
  123. WIDTH = tmp->w > MAXWIDTH ? MAXWIDTH : tmp->w;
  124. HEIGHT = tmp->h > MAXHEIGHT ? MAXHEIGHT : tmp->h;
  125. floats = malloc(WIDTH * HEIGHT * sizeof(float));
  126. if(!floats)
  127. return NULL;
  128. surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, 32,
  129. 0xff0000, 0xff00, 0xff, 0x0);
  130. pixels = (uint32_t *)surface->pixels;
  131. SDL_BlitSurface(tmp, NULL, surface, NULL);
  132. SDL_FreeSurface(tmp);
  133. for(y = 0; y < HEIGHT; y++)
  134. for(x = 0; x < WIDTH; x++)
  135. {
  136. int green = (pixels[y * surface->pitch / 4 + x] >> 8) & 0xff;
  137. put(floats, x, y, (float)green / 0xff);
  138. }
  139. return floats;
  140. }
  141. static void save(float const *src, char const *name)
  142. {
  143. SDL_Surface *surface;
  144. uint32_t *pixels;
  145. int x, y;
  146. surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, 32,
  147. 0xff0000, 0xff00, 0xff, 0x0);
  148. pixels = (uint32_t *)surface->pixels;
  149. for(y = 0; y < HEIGHT; y++)
  150. for(x = 0; x < WIDTH; x++)
  151. {
  152. float p = 255 * get(src, x, y);
  153. uint32_t i = p < 0 ? 0 : p > 255 ? 255 : p;
  154. pixels[surface->pitch / 4 * y + x] = (i << 16) | (i << 8) | i;
  155. }
  156. SDL_SaveBMP(surface, name);
  157. }
  158. static float *ostromoukhov(float const *src)
  159. {
  160. static int const table[][3] =
  161. {
  162. {13, 0, 5}, {13, 0, 5}, {21, 0, 10}, {7, 0, 4},
  163. {8, 0, 5}, {47, 3, 28}, {23, 3, 13}, {15, 3, 8},
  164. {22, 6, 11}, {43, 15, 20}, {7, 3, 3}, {501, 224, 211},
  165. {249, 116, 103}, {165, 80, 67}, {123, 62, 49}, {489, 256, 191},
  166. {81, 44, 31}, {483, 272, 181}, {60, 35, 22}, {53, 32, 19},
  167. {237, 148, 83}, {471, 304, 161}, {3, 2, 1}, {481, 314, 185},
  168. {354, 226, 155}, {1389, 866, 685}, {227, 138, 125}, {267, 158, 163},
  169. {327, 188, 220}, {61, 34, 45}, {627, 338, 505}, {1227, 638, 1075},
  170. {20, 10, 19}, {1937, 1000, 1767}, {977, 520, 855}, {657, 360, 551},
  171. {71, 40, 57}, {2005, 1160, 1539}, {337, 200, 247}, {2039, 1240, 1425},
  172. {257, 160, 171}, {691, 440, 437}, {1045, 680, 627}, {301, 200, 171},
  173. {177, 120, 95}, {2141, 1480, 1083}, {1079, 760, 513}, {725, 520, 323},
  174. {137, 100, 57}, {2209, 1640, 855}, {53, 40, 19}, {2243, 1720, 741},
  175. {565, 440, 171}, {759, 600, 209}, {1147, 920, 285}, {2311, 1880, 513},
  176. {97, 80, 19}, {335, 280, 57}, {1181, 1000, 171}, {793, 680, 95},
  177. {599, 520, 57}, {2413, 2120, 171}, {405, 360, 19}, {2447, 2200, 57},
  178. {11, 10, 0}, {158, 151, 3}, {178, 179, 7}, {1030, 1091, 63},
  179. {248, 277, 21}, {318, 375, 35}, {458, 571, 63}, {878, 1159, 147},
  180. {5, 7, 1}, {172, 181, 37}, {97, 76, 22}, {72, 41, 17},
  181. {119, 47, 29}, {4, 1, 1}, {4, 1, 1}, {4, 1, 1},
  182. {4, 1, 1}, {4, 1, 1}, {4, 1, 1}, {4, 1, 1},
  183. {4, 1, 1}, {4, 1, 1}, {65, 18, 17}, {95, 29, 26},
  184. {185, 62, 53}, {30, 11, 9}, {35, 14, 11}, {85, 37, 28},
  185. {55, 26, 19}, {80, 41, 29}, {155, 86, 59}, {5, 3, 2},
  186. {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2},
  187. {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2},
  188. {5, 3, 2}, {5, 3, 2}, {5, 3, 2}, {5, 3, 2},
  189. {305, 176, 119}, {155, 86, 59}, {105, 56, 39}, {80, 41, 29},
  190. {65, 32, 23}, {55, 26, 19}, {335, 152, 113}, {85, 37, 28},
  191. {115, 48, 37}, {35, 14, 11}, {355, 136, 109}, {30, 11, 9},
  192. {365, 128, 107}, {185, 62, 53}, {25, 8, 7}, {95, 29, 26},
  193. {385, 112, 103}, {65, 18, 17}, {395, 104, 101}, {4, 1, 1}
  194. };
  195. float *dest = new();
  196. float *tmp = copy(src);
  197. int x, y;
  198. for(y = 0; y < HEIGHT; y++)
  199. {
  200. for(x = 0; x < WIDTH; x++)
  201. {
  202. int x1 = (y & 1) ? WIDTH - 1 - x + 1 : x - 1;
  203. int x2 = (y & 1) ? WIDTH - 1 - x : x;
  204. int x3 = (y & 1) ? WIDTH - 1 - x - 1 : x + 1;
  205. float p = get(tmp, x2, y);
  206. float q = p > 0.5 ? 1. : 0.;
  207. float error = (p - q);
  208. int i = p * 255.9999;
  209. put(dest, x2, y, q);
  210. if(i > 127)
  211. i = 255 - i;
  212. if(i < 0)
  213. i = 0;
  214. error /= table[i][0] + table[i][1] + table[i][2];
  215. if(x < WIDTH - 1)
  216. put(tmp, x3, y, get(tmp, x3, y) + error * table[i][0]);
  217. if(y < HEIGHT - 1)
  218. {
  219. if(x > 0)
  220. put(tmp, x1, y + 1,
  221. get(tmp, x1, y + 1) + error * table[i][1]);
  222. put(tmp, x2, y + 1, get(tmp, x2, y + 1) + error * table[i][2]);
  223. }
  224. }
  225. }
  226. free(tmp);
  227. return dest;
  228. }
  229. /* Dither using error diffusion and Floyd-Steinberg-like coefficients:
  230. X a b
  231. c d e f g
  232. h i j k l
  233. */
  234. static float *ed(float const *src, int serpentine,
  235. int a, int b, int c, int d, int e, int f,
  236. int g, int h, int i, int j, int k, int l)
  237. {
  238. float *dest = new();
  239. float *tmp = copy(src);
  240. int x, y, n;
  241. n = a + b + c + d + e + f + g + h + i + j + k + l;
  242. for(y = 0; y < HEIGHT; y++)
  243. {
  244. int swap = serpentine && (y & 1);
  245. for(x = 0; x < WIDTH; x++)
  246. {
  247. int x0 = swap ? WIDTH - 1 - x + 2 : x - 2;
  248. int x1 = swap ? WIDTH - 1 - x + 1 : x - 1;
  249. int x2 = swap ? WIDTH - 1 - x : x;
  250. int x3 = swap ? WIDTH - 1 - x - 1 : x + 1;
  251. int x4 = swap ? WIDTH - 1 - x - 2 : x + 2;
  252. float p = get(tmp, x2, y);
  253. float q = p > 0.5 ? 1. : 0.;
  254. float error = (p - q) / n;
  255. put(dest, x2, y, q);
  256. if(x < WIDTH - 1)
  257. put(tmp, x3, y, get(tmp, x3, y) + error * a);
  258. if(x < WIDTH - 2)
  259. put(tmp, x4, y, get(tmp, x4, y) + error * b);
  260. if(y < HEIGHT - 1)
  261. {
  262. if(x > 0)
  263. {
  264. put(tmp, x1, y + 1,
  265. get(tmp, x1, y + 1) + error * d);
  266. if(x > 1)
  267. put(tmp, x0, y + 1,
  268. get(tmp, x0, y + 1) + error * c);
  269. }
  270. put(tmp, x2, y + 1, get(tmp, x2, y + 1) + error * e);
  271. if(x < WIDTH - 1)
  272. {
  273. put(tmp, x3, y + 1,
  274. get(tmp, x3, y + 1) + error * f);
  275. if(x < WIDTH - 2)
  276. put(tmp, x4, y + 1,
  277. get(tmp, x4, y + 1) + error * g);
  278. }
  279. }
  280. if(y < HEIGHT - 2)
  281. {
  282. if(x > 0)
  283. {
  284. put(tmp, x1, y + 2,
  285. get(tmp, x1, y + 2) + error * h);
  286. if(x > 1)
  287. put(tmp, x0, y + 2,
  288. get(tmp, x0, y + 2) + error * i);
  289. }
  290. put(tmp, x2, y + 2, get(tmp, x2, y + 2) + error * j);
  291. if(x < WIDTH - 1)
  292. {
  293. put(tmp, x3, y + 2,
  294. get(tmp, x3, y + 2) + error * k);
  295. if(x < WIDTH - 2)
  296. put(tmp, x4, y + 2,
  297. get(tmp, x4, y + 2) + error * l);
  298. }
  299. }
  300. }
  301. }
  302. free(tmp);
  303. return dest;
  304. }
  305. /* XXX */
  306. static float *dbs(float const *src, float const *orig,
  307. float sigma, float dx, float dy)
  308. {
  309. float mat[NN][NN];
  310. float *dest, *tmp, *tmp2;
  311. float error;
  312. makegauss(mat, sigma, 0., 0.);
  313. tmp = fullgauss(src, mat);
  314. makegauss(mat, sigma, dx, dy);
  315. dest = copy(orig);
  316. tmp2 = fullgauss(dest, mat);
  317. error = dist(tmp, tmp2, 1.);
  318. for(;;)
  319. {
  320. int changes = 0;
  321. int x, y, i, j, n;
  322. for(y = 0; y < HEIGHT; y++)
  323. for(x = 0; x < WIDTH; x++)
  324. {
  325. float d, d2, e, best = 0.;
  326. int opx = -1, opy = -1;
  327. d = get(dest, x, y);
  328. /* Compute the effect of a toggle */
  329. e = 0.;
  330. for(j = -N; j < N + 1; j++)
  331. {
  332. if(y + j < 0 || y + j >= HEIGHT)
  333. continue;
  334. for(i = -N; i < N + 1; i++)
  335. {
  336. float m, p, q1, q2;
  337. if(x + i < 0 || x + i >= WIDTH)
  338. continue;
  339. m = mat[i + N][j + N];
  340. p = get(tmp, x + i, y + j);
  341. q1 = get(tmp2, x + i, y + j);
  342. q2 = q1 - m * d + m * (1. - d);
  343. e += (q1 - p) * (q1 - p) - (q2 - p) * (q2 - p);
  344. }
  345. }
  346. if(e > best)
  347. {
  348. best = e;
  349. opx = opy = 0;
  350. }
  351. /* Compute the effect of swaps */
  352. for(n = 0; n < 8; n++)
  353. {
  354. static int const step[] =
  355. { 0, 1, 0, -1, -1, 0, 1, 0, -1, -1, -1, 1, 1, -1, 1, 1 };
  356. int idx = step[n * 2], idy = step[n * 2 + 1];
  357. if(y + idy < 0 || y + idy >= HEIGHT
  358. || x + idx < 0 || x + idx >= WIDTH)
  359. continue;
  360. d2 = get(dest, x + idx, y + idy);
  361. if(d2 == d)
  362. continue;
  363. e = 0.;
  364. for(j = -N; j < N + 1; j++)
  365. {
  366. if(y + j < 0 || y + j >= HEIGHT)
  367. continue;
  368. if(j - idy + N < 0 || j - idy + N >= NN)
  369. continue;
  370. for(i = -N; i < N + 1; i++)
  371. {
  372. float ma, mb, p, q1, q2;
  373. if(x + i < 0 || x + i >= WIDTH)
  374. continue;
  375. if(i - idx + N < 0 || i - idx + N >= NN)
  376. continue;
  377. ma = mat[i + N][j + N];
  378. mb = mat[i - idx + N][j - idy + N];
  379. p = get(tmp, x + i, y + j);
  380. q1 = get(tmp2, x + i, y + j);
  381. q2 = q1 - ma * d + ma * d2 - mb * d2 + mb * d;
  382. e += (q1 - p) * (q1 - p) - (q2 - p) * (q2 - p);
  383. }
  384. }
  385. if(e > best)
  386. {
  387. best = e;
  388. opx = idx;
  389. opy = idy;
  390. }
  391. }
  392. /* Apply the change if interesting */
  393. if(best <= 0.)
  394. continue;
  395. if(opx || opy)
  396. {
  397. d2 = get(dest, x + opx, y + opy);
  398. put(dest, x + opx, y + opy, d);
  399. }
  400. else
  401. d2 = 1. - d;
  402. put(dest, x, y, d2);
  403. for(j = -N; j < N + 1; j++)
  404. for(i = -N; i < N + 1; i++)
  405. {
  406. float m = mat[i + N][j + N];
  407. if(y + j >= 0 && y + j < HEIGHT
  408. && x + i >= 0 && x + i < WIDTH)
  409. {
  410. float t = get(tmp2, x + i, y + j);
  411. put(tmp2, x + i, y + j, t + m * (d2 - d));
  412. }
  413. if((opx || opy) && y + opy + j >= 0 && y + opy + j < HEIGHT
  414. && x + opx + i >= 0 && x + opx + i < WIDTH)
  415. {
  416. float t = get(tmp2, x + opx + i, y + opy + j);
  417. put(tmp2, x + opx + i, y + opy + j, t + m * (d - d2));
  418. }
  419. }
  420. changes++;
  421. }
  422. fprintf(stderr, "did %i changes\n", changes);
  423. if(changes == 0)
  424. break;
  425. }
  426. free(tmp);
  427. free(tmp2);
  428. return dest;
  429. }
  430. static void study(float const *src, float const *dest,
  431. float sigma, float precision)
  432. {
  433. # define Z 3
  434. float mat[NN][NN];
  435. float *tmp, *tmp2;
  436. float e, e0, best = 1., fx = -1., fy = -1., step = 2., bfx = 0., bfy = 0.;
  437. int dx, dy;
  438. makegauss(mat, sigma, 0., 0.);
  439. tmp = gauss(src, mat);
  440. tmp2 = gauss(dest, mat);
  441. e0 = dist(tmp, tmp2, 1.);
  442. free(tmp2);
  443. while(step > precision)
  444. {
  445. for(dy = 0; dy <= Z; dy++)
  446. for(dx = 0; dx <= Z; dx++)
  447. {
  448. makegauss(mat, sigma, fx + step * dx / Z, fy + step * dy / Z);
  449. tmp2 = gauss(dest, mat);
  450. e = dist(tmp, tmp2, best);
  451. free(tmp2);
  452. if(e < best)
  453. {
  454. best = e;
  455. bfx = fx + step * dx / Z;
  456. bfy = fy + step * dy / Z;
  457. }
  458. }
  459. fx = bfx - step / Z;
  460. fy = bfy - step / Z;
  461. step = step * 2 / Z;
  462. }
  463. free(tmp);
  464. printf("E = %g E_min = %g dx = %g dy = %g\n",
  465. 1000 * e0, 1000 * best, fx, fy);
  466. fflush(stdout);
  467. }
  468. static float *merge(float const *im1, float const *im2, float t)
  469. {
  470. float *dest = new();
  471. int x, y;
  472. for(y = 0; y < HEIGHT; y++)
  473. for(x = 0; x < WIDTH; x++)
  474. put(dest, x, y, t * get(im1, x, y) + (1. - t) * get(im2, x, y));
  475. return dest;
  476. }
  477. static void usage(char *argv[])
  478. {
  479. fprintf(stderr, "Usage: %s <mode> [ARGS...]\n", argv[0]);
  480. fprintf(stderr, "Allowed modes:\n");
  481. fprintf(stderr, " -1 <src> raster FS displacement study on src\n");
  482. fprintf(stderr, " -2 <src1> <src2> raster FS displacement study on blends of src1 and src2\n");
  483. fprintf(stderr, " -3 <src> quick (a,b,c,d) ED kernel analysis on src\n");
  484. fprintf(stderr, " -4 <src> exhaustive (a,b,c,d) ED kernel analysis on src\n");
  485. }
  486. int main(int argc, char *argv[])
  487. {
  488. float *src;
  489. int mode, i;
  490. if(argc < 2)
  491. {
  492. fprintf(stderr, "%s: too few arguments\n", argv[0]);
  493. usage(argv);
  494. return EXIT_FAILURE;
  495. }
  496. if(argv[1][0] != '-' || !(mode = atoi(argv[1] + 1)))
  497. {
  498. fprintf(stderr, "%s: invalid mode `%s'\n", argv[0], argv[1]);
  499. usage(argv);
  500. return EXIT_FAILURE;
  501. }
  502. src = load(argv[2]);
  503. if(!src)
  504. return 2;
  505. switch(mode)
  506. {
  507. case 1:
  508. {
  509. float *dest = ed(src, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
  510. study(src, dest, 1.2, 0.001);
  511. free(dest);
  512. free(src);
  513. }
  514. break;
  515. case 2:
  516. {
  517. float *src2, *dest, *tmp;
  518. if(argc < 3)
  519. return 3;
  520. src2 = load(argv[2]);
  521. if(!src2)
  522. return 4;
  523. for(i = 0; i <= 100; i++)
  524. {
  525. tmp = merge(src, src2, (float)i / 100.);
  526. dest = ed(tmp, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
  527. study(tmp, dest, 1.2, 0.001);
  528. free(dest);
  529. free(tmp);
  530. }
  531. free(src2);
  532. free(src);
  533. }
  534. break;
  535. case 3:
  536. case 4:
  537. {
  538. float mat0[NN][NN];
  539. float *dest, *tmp, *tmp2;
  540. int a, b, c, d, e;
  541. makegauss(mat0, 1.2, 0, 0);
  542. for(a = 0; a <= 16; a++)
  543. for(b = 0; b <= 16; b++)
  544. for(c = 0; c <= 16; c++)
  545. for(d = 0; d <= 16; d++)
  546. for(e = 0; e <= 16; e++)
  547. {
  548. if(a + b + c + d + e != 16)
  549. continue;
  550. /* Slightly shuffle our coefficients to avoid waiting until
  551. * 75% progress before having an idea of what's going on. */
  552. int a2 = a, b2 = b, c2 = c, d2 = d, e2 = e;
  553. #define SHUFFLE(p,q,n) \
  554. if(p+q) { int tmp = p+q; p = (p+n) % (tmp+1); q = tmp-p; }
  555. SHUFFLE(c2, d2, 7); SHUFFLE(b2, d2, 5);
  556. SHUFFLE(a2, d2, 3); SHUFFLE(b2, c2, 2);
  557. SHUFFLE(a2, e2, 3); SHUFFLE(b2, e2, 2);
  558. SHUFFLE(a2, c2, 4); SHUFFLE(a2, b2, 6);
  559. SHUFFLE(c2, e2, 9); SHUFFLE(d2, e2, 7);
  560. SHUFFLE(a2, d2, 9); SHUFFLE(a2, b2, 7);
  561. #if 0
  562. if(b2 > c2) continue;
  563. if(d2 > c2) continue;
  564. if(d2 > a2) continue;
  565. #endif
  566. /* We only want 4-cell kernels for now */
  567. if(b2) continue;
  568. //printf("K = %d,%d,%d,%d,%d ", a2, b2, c2, d2, e2);
  569. printf("K = %d,%d,%d,%d ", a2, c2, d2, e2);
  570. dest = ed(src, false, a2, 0, b2, c2, d2, e2, 0, 0, 0, 0, 0, 0);
  571. if(mode == 3)
  572. {
  573. tmp = gauss(src, mat0);
  574. tmp2 = gauss(dest, mat0);
  575. printf("E = %.5g\n", 1000. * dist(tmp, tmp2, 1.));
  576. free(tmp);
  577. free(tmp2);
  578. }
  579. else
  580. study(src, dest, 1.2, 0.001);
  581. fflush(stdout);
  582. free(dest);
  583. }
  584. free(src);
  585. }
  586. break;
  587. #if 0
  588. tmp = ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  589. //dest = dbs(src, tmp, 0., 0.);
  590. dest = dbs(src, tmp, 0.20, 0.30);
  591. //dest = dbs(src, tmp, 0.158718, 0.283089);
  592. //dest = copy(tmp);
  593. free(tmp);
  594. study(src, dest, 1.2, 0.00001);
  595. save(dest, "output.bmp");
  596. free(dest);
  597. #endif
  598. #if 0
  599. //dest = ed(src, 5, 0, 0, 3, 5, 3, 0, 0, 0, 0, 0, 0);
  600. //dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  601. //dest = ed(src, true, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  602. //dest = ed(src, true, 7, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0);
  603. //dest = ed(src, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1);
  604. //dest = ed(src, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
  605. //dest = ed(src, 7, 0, 1, 4, 4, 0, 0, 0, 0, 0, 0, 0);
  606. //dest = ed(src, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0);
  607. //dest = ed(src, 2911, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0, 0);
  608. dest = ostromoukhov(src);
  609. //dest = ed(src, 7, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0);
  610. //printf("%s: ", argv[1]);
  611. //study(src, dest, 1.2, 0.001);
  612. save(dest, "output.bmp");
  613. free(dest);
  614. #endif
  615. #if 0
  616. # define STEP 32
  617. dest = ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  618. makegauss(mat, 1.2, 0., 0.);
  619. tmp = gauss(src, mat);
  620. for(dy = 0; dy < STEP; dy++)
  621. {
  622. for(dx = 0; dx < STEP; dx++)
  623. {
  624. float fy = 2. / STEP * (dy - STEP / 2.);
  625. float fx = 2. / STEP * (dx - STEP / 2.);
  626. makegauss(mat, 1.2, fx, fy);
  627. tmp2 = gauss(dest, mat);
  628. printf("%g %g %g\n", fy, fx, 1000. * dist(tmp, tmp2, 1.));
  629. fflush(stdout);
  630. free(tmp2);
  631. }
  632. printf("\n");
  633. }
  634. save(dest, "output.bmp");
  635. #endif
  636. #if 0
  637. tmp = gauss(src, 0., 0.);
  638. for(a = 0; a < 16; a++)
  639. for(b = 0; b < 16; b++)
  640. for(c = 0; c < 16; c++)
  641. for(d = 0; d < 16; d++)
  642. {
  643. if(a + b + c + d != 16)
  644. continue;
  645. dest = ed(src, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0);
  646. tmp2 = gauss(dest, 0., 0.);
  647. printf("%.5g: (%02d %02d %02d %02d)\n",
  648. 1000. * dist(tmp, tmp2, 1.), a, b, c, d);
  649. free(dest);
  650. free(tmp2);
  651. }
  652. save(dest, "output.bmp");
  653. #endif
  654. #if 0
  655. printf("%s: ", argv[1]);
  656. makegauss(mat0, 1.2, 0, 0);
  657. tmp = gauss(src, mat0);
  658. dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  659. tmp2 = gauss(dest, mat0);
  660. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  661. free(tmp2);
  662. makegauss(mat, 1.2, 0.16, 0.28);
  663. tmp2 = gauss(dest, mat);
  664. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  665. free(tmp2);
  666. free(dest);
  667. dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1);
  668. tmp2 = gauss(dest, mat0);
  669. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  670. free(tmp2);
  671. makegauss(mat, 1.2, 0.26, 0.76);
  672. tmp2 = gauss(dest, mat);
  673. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  674. free(tmp2);
  675. free(dest);
  676. dest = ostromoukhov(src);
  677. tmp2 = gauss(dest, mat0);
  678. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  679. free(tmp2);
  680. makegauss(mat, 1.2, 0.0, 0.19);
  681. tmp2 = gauss(dest, mat);
  682. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  683. free(tmp2);
  684. free(dest);
  685. dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0);
  686. tmp2 = gauss(dest, mat0);
  687. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  688. free(tmp2);
  689. makegauss(mat, 1.2, 0.0, 0.34);
  690. tmp2 = gauss(dest, mat);
  691. printf("%.5g ", 1000. * dist(tmp, tmp2, 1.));
  692. free(tmp2);
  693. free(dest);
  694. printf("\n");
  695. #endif
  696. #if 0
  697. printf("%s\n", argv[1]);
  698. dest = ed(src, false, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  699. study(src, dest, 1.2, 0.01);
  700. free(dest);
  701. dest = ed(src, false, 7, 5, 3, 5, 7, 5, 3, 1, 3, 5, 3, 1);
  702. study(src, dest, 1.2, 0.01);
  703. free(dest);
  704. dest = ostromoukhov(src);
  705. study(src, dest, 1.2, 0.01);
  706. free(dest);
  707. dest = ed(src, true, 2911, 0, 0, 1373, 3457, 2258, 0, 0, 0, 0, 0, 0);
  708. study(src, dest, 1.2, 0.01);
  709. free(dest);
  710. printf("\n");
  711. #endif
  712. #if 0
  713. //dest = ostromoukhov(src);
  714. //dest = ed(src, true, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  715. tmp = new();//ed(src, 7, 0, 0, 3, 5, 1, 0, 0, 0, 0, 0, 0);
  716. dest = dbs(src, tmp, 0., 0.);
  717. for(sigma = 0.8; sigma < 2; sigma *= 1.03)
  718. //for(sigma = 0.8; sigma < 2.; sigma *= 1.01)
  719. {
  720. printf("%g ", sigma);
  721. study(src, dest, sigma, 0.01);
  722. }
  723. #endif
  724. }
  725. #if 0
  726. tmp = new();
  727. a = 0;
  728. for(sigma = 0.8; sigma < 2; sigma *= 1.03)
  729. {
  730. char buf[1024];
  731. printf("%i: %g\n", a, sigma);
  732. dest = dbs(src, tmp, sigma, 0., 0.);
  733. sprintf(buf, "output-dbs-%i.bmp", a++);
  734. save(dest, buf);
  735. }
  736. #endif
  737. return 0;
  738. }