Changeset 2274 for research/2008-displacement/main.c
- Timestamp:
- Apr 16, 2008, 12:09:26 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
research/2008-displacement/main.c
r2273 r2274 503 503 float mat[NN][NN]; 504 504 float *tmp, *tmp2; 505 float e0, best , fx = -1., fy = -1., step = 2.;505 float e0, best = 0., fx = -1., fy = -1., step = 2.; 506 506 int dx, dy; 507 507 … … 541 541 free(tmp); 542 542 543 printf("%g -> %g for %g %g\n", 1000 * e0, 1000 * best, fx, fy); 543 printf("E = %g E_min = %g dx = %g dy = %g\n", 544 1000 * e0, 1000 * best, fx, fy); 544 545 fflush(stdout); 545 546 } … … 557 558 } 558 559 560 static void usage(char *argv[]) 561 { 562 fprintf(stderr, "Usage: %s <mode> [ARGS...]\n", argv[0]); 563 fprintf(stderr, "Allowed modes:\n"); 564 fprintf(stderr, " -1 <src1> <src2> raster FS displacement study on blends of src1 and src2\n"); 565 fprintf(stderr, " -2 <src> quick (a,b,c,d) ED kernel analysis on src\n"); 566 fprintf(stderr, " -3 <src> exhaustive (a,b,c,d) ED kernel analysis on src\n"); 567 } 568 559 569 int main(int argc, char *argv[]) 560 570 { 561 571 float mat0[NN][NN]; 562 572 float mat[NN][NN]; 563 float *src , *src2, *dest, *tmp, *tmp2;573 float *src; 564 574 float sigma; 565 int dx, dy, a, b, c, d, i;575 int mode, dx, dy, i; 566 576 567 577 if(argc < 2) 568 return 1; 569 570 src = load(argv[1]); 578 { 579 fprintf(stderr, "%s: too few arguments\n", argv[0]); 580 usage(argv); 581 return EXIT_FAILURE; 582 } 583 584 if(argv[1][0] != '-' || !(mode = atoi(argv[1] + 1))) 585 { 586 fprintf(stderr, "%s: invalid mode `%s'\n", argv[0], argv[1]); 587 usage(argv); 588 return EXIT_FAILURE; 589 } 590 591 src = load(argv[2]); 571 592 if(!src) 572 593 return 2; 573 594 595 switch(mode) 596 { 597 case 1: 598 { 599 float *src2, *dest, *tmp; 600 601 if(argc < 3) 602 return 3; 603 src2 = load(argv[2]); 604 if(!src2) 605 return 4; 606 607 for(i = 0; i <= 100; i++) 608 { 609 tmp = merge(src, src2, (float)i / 100.); 610 dest = ed(tmp, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0); 611 study(tmp, dest, 1.2, 0.001); 612 free(dest); 613 free(tmp); 614 } 615 free(src2); 616 free(src); 617 } 618 break; 619 620 case 2: 621 case 3: 622 { 623 float *dest, *tmp, *tmp2; 624 int a, b, c, d, e; 625 626 makegauss(mat0, 1.2, 0, 0); 627 for(a = 0; a <= 16; a++) 628 for(b = 0; b <= 16; b++) 629 for(c = 0; c <= 16; c++) 630 for(d = 0; d <= 16; d++) 631 for(e = 0; e <= 16; e++) 632 { 633 if(a + b + c + d + e != 16) 634 continue; 635 636 /* Slightly shuffle our coefficients to avoid waiting until 637 * 75% progress before having an idea of what's going on. */ 638 int a2 = a, b2 = b, c2 = c, d2 = d, e2 = e; 639 #define SHUFFLE(p,q,n) \ 640 if(p+q) { int tmp = p+q; p = (p+n) % (tmp+1); q = tmp-p; } 641 SHUFFLE(c2, d2, 7); SHUFFLE(b2, d2, 5); 642 SHUFFLE(a2, d2, 3); SHUFFLE(b2, c2, 2); 643 SHUFFLE(a2, e2, 3); SHUFFLE(b2, e2, 2); 644 SHUFFLE(a2, c2, 4); SHUFFLE(a2, b2, 6); 645 SHUFFLE(c2, e2, 9); SHUFFLE(d2, e2, 7); 646 SHUFFLE(a2, d2, 9); SHUFFLE(a2, b2, 7); 647 574 648 #if 0 575 if(argc < 3) 576 return 3; 577 src2 = load(argv[2]); 578 if(!src2) 579 return 4; 580 581 for(i = 0; i <= 100; i++) 582 { 583 tmp = merge(src, src2, (float)i / 100.); 584 dest = ed(tmp, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0); 585 study(tmp, dest, 1.2, 0.001); 586 free(dest); 587 free(tmp); 588 } 589 free(src2); 590 free(src); 649 if(b2 > c2) continue; 650 if(d2 > c2) continue; 651 if(d2 > a2) continue; 591 652 #endif 653 /* We only want 4-cell kernels for now */ 654 if(b2) continue; 655 //printf("K = %d,%d,%d,%d,%d ", a2, b2, c2, d2, e2); 656 printf("K = %d,%d,%d,%d ", a2, c2, d2, e2); 657 658 dest = ed(src, false, a2, 0, b2, c2, d2, e2, 0, 0, 0, 0, 0, 0); 659 if(mode == 2) 660 { 661 tmp = gauss(src, mat0); 662 tmp2 = gauss(dest, mat0); 663 printf("E = %.5g\n", 1000. * dist(tmp, tmp2)); 664 free(tmp); 665 free(tmp2); 666 } 667 else 668 study(src, dest, 1.2, 0.01); 669 fflush(stdout); 670 free(dest); 671 } 672 673 free(src); 674 } 675 break; 592 676 593 677 #if 0 … … 646 730 647 731 #if 0 648 makegauss(mat0, 1.2, 0, 0);649 for(a = 0; a <= 16; a++)650 for(b = 0; b <= 16; b++)651 for(c = 0; c <= 16; c++)652 for(d = 0; d <= 16; d++)653 {654 float *tmp;655 if(a + b + c + d != 16)656 continue;657 #if 0658 if(b > c) continue;659 if(d > c) continue;660 if(d > a) continue;661 #endif662 printf("%02d %02d %02d %02d: ", a, b, c, d);663 dest = ed(src, true, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0);664 //dest = ed(src, false, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0);665 //study(src, dest, 1.2, 0.01);666 tmp = gauss(src, mat0);667 tmp2 = gauss(dest, mat0);668 printf("%.5g\n", 1000. * dist(tmp, tmp2));669 fflush(stdout);670 free(tmp);671 free(tmp2);672 free(dest);673 }674 #endif675 676 #if 0677 732 tmp = gauss(src, 0., 0.); 678 733 for(a = 0; a < 16; a++) … … 777 832 #endif 778 833 834 } 835 836 #if 0 779 837 tmp = new(); 780 838 a = 0; … … 787 845 save(dest, buf); 788 846 } 847 #endif 789 848 790 849 return 0;
Note: See TracChangeset
for help on using the changeset viewer.