#include #include #include #include #include #define DEG 10 #define NUM 10 #define HUGE 1.0e100 int polyrand3(int n, Point3 *p, double size); main(int argc, char *argv[]) { Point3 p0[NUM][DEG], p1[NUM][DEG]; int n0[NUM], n1[NUM]; int i,j, k, i0, i1, ntrial = 1000; Sobj3 *o0, *o1; Sdist3 d; double r, rmin, space = 1000.0, rmax = 10; Frame3 f0, f1; char *p; while (argc > 1 && argv[1][0] == '-') { for (p = &argv[1][1]; *p != 0; ++p) { switch(*p) { case 'n': ntrial = atoi(argv[2]); ++argv; --argc; break; case 's': space = atof(argv[2]); ++argv; --argc; break; case 'e': rmax = atof(argv[2]); ++argv; --argc; break; case 'N': snopoly3 = 1; continue; } break; } ++argv; --argc; } for (k = 0; k < ntrial; k++) { bgnsobj3(); for (i = 0; i < NUM; i++) { n0[i] = rand()%DEG+1; n0[i] = polyrand3(n0[i], p0[i], 100); frand3(&f0); f0.p = pmul3(space, f0.p); for (j = 0; j < n0[i]; j++) p0[i][j] = fmap3(&f0, p0[i][j]); spoly3(p0[i], n0[i], 0.0, rmax, (void*)(i+1)); } o0 = endsobj3(); bgnsobj3(); for (i = 0; i < NUM; i++) { n1[i] = rand()%DEG+1; n1[i] = polyrand3(n1[i], p1[i], 100); frand3(&f1); f1.p = pmul3(space, f1.p); for (j = 0; j < n1[i]; j++) p1[i][j] = fmap3(&f1, p1[i][j]); spoly3(p1[i], n1[i], 0.0, rmax, (void*)(i+1)); } o1 = endsobj3(); d = sdist3(o0, iframe3, o1, iframe3, 0.0); /* printf("%f n = %d npp = %d\n", d.d, d.n, d.npp); /* */ rmin = HUGE; for (i = 0; i < NUM; i++) { for (j = 0; j < NUM; j++) { r = dist3(p0[i], n0[i], p1[j], n1[j]); if (r < rmin) { i0 = i; i1 = j; rmin = r; } } } if (!snopoly3 && fabs(rmin - d.d) > (1e-6)*rmin || snopoly3 && rmin - d.d > 2*rmax) { fprintf(stderr, "test %d: %f %f %d %d\n", k, d.d, rmin, i0, i1); for (i = 0; i < NUM; i++) { for (j = 0; j < NUM; j++) { r = dist3(p0[i], n0[i], p1[j], n1[j]); if (fabs(d.d - r) < (1e-6)*d.d || fabs(rmin - r) < (1e-6)*rmin) fprintf(stderr, "\t%d %d n0 = %d n1 = %d %f\n", i, j, n0[i], n1[j], r); } } } sobjfree3(o0); sobjfree3(o1); } } int polyrand3(int n, Point3 *p, double size) { double a, a2, r; int i; p[0] = point3(0,0,0); a = -MYPI; for (i = 1; i < n; i++) { a2 = a + frand()*3*MYPI/n; if (a2 > 2*MYPI) break; r = frand()*size/n; p[i] = padd3(p[i-1], point3(r*cos(a2), r*sin(a2), 0)); if (atan2(-p[i].y, -p[i].x) < a2) { break; } a = a2; } n = i; return n; }