home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_07_06 / v7n6046a.txt < prev    next >
Text File  |  1989-07-25  |  2KB  |  78 lines

  1.  
  2. void plotx (ws,f,n,theta,phi,x1,x2,y1,y2)
  3. double (*f)(),theta,phi,x1,x2,y1,y2;
  4. int n,ws;
  5. {
  6. double px[50],py[50],pz[50],m,interpy,incx,incy;
  7. Gpoint p[50],q[50],pp[100],qq[100];
  8. int i,j,k,kp,kq,tk,bk,prev,ind;
  9. /*
  10.  *   Compute first contour and initialize.
  11.  */
  12. incx = (x2-x1)/(double)(n-1); incy = (y2-y1)/(double)(n-1);
  13. for (i=0; i<n; i++)
  14.   {
  15.     px[i] = x1 + i*incx; py[i] = y1; pz[i] = (*f)(px[i],py[i]);
  16.   }
  17. settran (theta,phi);
  18. transform (px,py,pz,p,n);
  19. initialmask (p,n);
  20. polyline (ws,n,p);
  21. /*
  22.  *  Do the rest of the contours.
  23.  */
  24. for (i=1; i<n; i++)
  25.   {
  26.     for (j=0; j<n; j++)      /*  Compute points.   */
  27.       {
  28.         py[j] = y1 + i*incy; pz[j] = (*f)(px[j],py[j]);
  29.       }
  30.     transform (px,py,pz,p,n);
  31.     top[0].x = bottom[0].x = p[0].x;  
  32.     k = 0; tk = bk = 0;
  33.     prev = place (&tk,&bk,p,0);   /* Do point 0.  */
  34.     switch (prev) {
  35.       case -1:
  36.         pp[0] = top[0]; qq[0] = p[0];
  37.         break;
  38.       case 0:
  39.         pp[0] = top[0]; qq[0] = bottom[0];
  40.         break;
  41.       case 1:
  42.         pp[0] = p[0]; qq[0] = bottom[0];
  43.         break;
  44.     }
  45.     if (prev != 0) q[k++] = p[0];
  46.     kp = kq = 1;
  47.     for (j=1; j<n; j++)   /*  Consider all other points.   */
  48.       {
  49.         ind = place(&tk,&bk,p,j);
  50.         switch (ind) {
  51.           case 1:     /*  point above mask.  */
  52.             pp[kp++] = p[j]; qq[kq++] = bottom[bk];
  53.             if (prev == -1) polyline (ws,k,q);
  54.             if (prev != 1) k = 0;
  55.             q[k++] = p[j];
  56.             break;
  57.           case 0:     /*   Point inside mask.  */
  58.             pp[kp++] = top[tk]; qq[kq++] = bottom[bk];
  59.             if (prev != 0) polyline (ws,k,q);
  60.             break;
  61.           case -1:    /*  Point below mask.   */
  62.             pp[kp++] = top[tk]; qq[kq++] = p[j];
  63.             if (prev == 1) polyline (ws,k,q);
  64.             if (prev != -1) k = 0;
  65.             q[k++] = p[j];
  66.             break;
  67.           }
  68.         prev = ind;
  69.       }
  70.     if (k != 0) polyline(ws,k,q);
  71.     topn = copyvec (pp,top,kp-1); 
  72.     bottomn = copyvec (qq,bottom,kq-1);
  73.   }
  74. }
  75.  
  76.  
  77.  
  78.