#include #include #include #include #include #define NLINE 10 #define ERR 1e-6 main(int argc, char *argv[]) { Point2 l0[NLINE][2], l1[NLINE][2]; int i,j, k, i0, i1, ntrial = 1000; Sobj2 *o0, *o1; Sdist2 d; double r, rmin, space = 1000.0, rad = 10; Frame2 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 'r': rad = atof(argv[2]); ++argv; --argc; break; } break; } ++argv; --argc; } for (k = 0; k < ntrial; k++) { bgnsobj2(); frame2(&f0, point2(space*frand(), space*frand()), frand()*2*MYPI); for (i = 0; i < NLINE; i++) { l0[i][0] = point2(frand()*100.0, frand()*100); if (frand() < 0.5) l0[i][1] = l0[i][0]; else l0[i][1] = point2(frand()*100.0, frand()*100); sline2(l0[i], 0.0, rad, 0); l0[i][0] = fmap2(&f0, l0[i][0]); l0[i][1] = fmap2(&f0, l0[i][1]); } o0 = endsobj2(); bgnsobj2(); frame2(&f1, point2(space*frand(), space*frand()), frand()*2*MYPI); for (i = 0; i < NLINE; i++) { l1[i][0] = point2(frand()*100.0, frand()*100); if (frand() < 0.5) l1[i][1] = l1[i][0]; else l1[i][1] = point2(frand()*100.0, frand()*100); sline2(l1[i], 0.0, rad, 0); l1[i][0] = fmap2(&f1, l1[i][0]); l1[i][1] = fmap2(&f1, l1[i][1]); } o1 = endsobj2(); d = sdist2(o0, &f0, o1, &f1, 0.0); rmin = HUGE_VAL; for (i = 0; i < NLINE; i++) { for (j = 0; j < 10; j++) { r = dll2(l0[i], l1[j]); if (r < rmin) { i0 = i; i1 = j; rmin = r; } } } if (fabs(d.d - rmin) > ERR*d.d) printf("%d: %f %f %d %d\n", k, d.d, rmin, i0, i1); sobjfree2(o0); sobjfree2(o1); } }