/* * jr.c * compute and plot joint range of two affine forms * Luiz Henrique de Figueiredo -- bulk of code by Ken Clarkson. * 13 Mar 2002 21:36:37 */ #include #include #include #include #include #define NMAX (100) static int ch2d(real** P, int n); static real points[NMAX][2], *P[NMAX+1]; /* an extra position is used */ static int N=0; static void addpoint(real x, real y) { points[N][0]=x; points[N][1]=y; P[N]=points[N]; ++N; return; printf("addpoint: N=%d\n",N); } static void show(int n, real* x, real* y) { int i; real xx=0.0; real yy=0.0; for (i=0; i<=n; i++) { xx+=x[i]; yy+=y[i]; } addpoint(xx,yy); } static void visit(int m, int n, real* x, real* y) { if (m==0) show(n,x,y); else { visit(m-1,n,x,y); x[m]=-x[m]; y[m]=-y[m]; visit(m-1,n,x,y); x[m]=-x[m]; y[m]=-y[m]; } } real hull(int n, real* x, real* y) { N=0; visit(n,n,x,y); N=ch2d(P,N); return 0; } void draw(int c, int out) { int i; gpcolor(c); gpbegin('p'); for (i=0; i0) return 1;\ if (v<0) return -1; static int cmpl(const void *a, const void *b) { real v; CMPM(0, a, b); CMPM(1, b, a); return 0; } static int cmph(const void *a, const void *b) { return cmpl(b, a); } static int make_chain(real** V, int n, int (*cmp) (const void *, const void *)) { int i, j, s = 1; real *t; qsort(V, n, sizeof(real *), cmp); for (i = 2; i < n; i++) { for (j = s; j >= 1 && ccw(V, i, j, j - 1); j--); s = j + 1; t = V[s]; V[s] = V[i]; V[i] = t; } return s; } static int ch2d(real** P, int n) { int u = make_chain(P, n, cmpl);/* make lower hull */ if (!n) return 0; P[n] = P[0]; return u + make_chain(P + u, n - u + 1, cmph); /* make upper hull */ }