home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / disks / disk373.lzh / Multiplot / source / mplot_src / src.zoo / clip.c < prev    next >
C/C++ Source or Header  |  1990-08-02  |  4KB  |  196 lines

  1. #include "struct.h"
  2. #include "plot.h"
  3. #include <graphics/gfxmacros.h>
  4.  
  5. Clip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
  6. short *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
  7. {
  8.  
  9.   if (*x1<xmin)
  10.     {
  11.       if (*x2<=xmin) return(FALSE);
  12.       else
  13.         {
  14.            *y1=(short)(*y1+(*y2-*y1)*((FFP)(xmin-*x1)/(FFP)(*x2-*x1)));
  15.            *x1=xmin;
  16.         }
  17.     }
  18.   if (*x1>xmax)
  19.     {
  20.       if (*x2>=xmax) return(FALSE);
  21.       else
  22.         {
  23.            *y1=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmax)/(FFP)(*x1-*x2)));
  24.            *x1=xmax;
  25.         }
  26.     }
  27.   if (*x2<xmin)
  28.     {
  29.        *y2=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmin)/(FFP)(*x1-*x2)));
  30.        *x2=xmin;
  31.     }
  32.   if (*x2>xmax)
  33.     {
  34.        *y2=(short)(*y1+(*y2-*y1)*((FFP)(xmax-*x1)/(FFP)(*x2-*x1)));
  35.        *x2=xmax;
  36.     }
  37.  
  38.  
  39.   if (*y1<ymin)
  40.     {
  41.       if (*y2<=ymin) return(FALSE);
  42.       else
  43.         {
  44.            *x1=(short)(*x1+(*x2-*x1)*((FFP)(ymin-*y1)/(FFP)(*y2-*y1)));
  45.            *y1=ymin;
  46.          }
  47.     }
  48.   if (*y1>ymax)
  49.     {
  50.       if (*y2>=ymax) return(FALSE);
  51.       else
  52.         {
  53.            *x1=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymax)/(FFP)(*y1-*y2)));
  54.            *y1=ymax;
  55.         }
  56.     }
  57.   if (*y2<ymin)
  58.     {
  59.        *x2=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymin)/(FFP)(*y1-*y2)));
  60.        *y2=ymin;
  61.     }
  62.   if (*y2>ymax)
  63.     {
  64.        *x2=(short)(*x1+(*x2-*x1)*((FFP)(ymax-*y1)/(FFP)(*y2-*y1)));
  65.        *y2=ymax;
  66.     }
  67.   return(TRUE);
  68.  
  69. }
  70.  
  71. ClipPoint(x,y,xmin,ymin,xmax,ymax)
  72. short x,y,xmin,ymin,xmax,ymax;
  73. {
  74. if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
  75. return(TRUE);
  76. }
  77.  
  78.  
  79. QuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
  80. short x,*y1,*y2,xmin,ymin,xmax,ymax;
  81. {
  82.   if (x<xmin) return(FALSE);
  83.   if (x>xmax) return(FALSE);
  84.  
  85.   if (*y1<ymin)
  86.     {
  87.       if (*y2<=ymin) return(FALSE);
  88.       *y1=ymin;
  89.     }
  90.   if (*y1>ymax)
  91.     {
  92.       if (*y2>=ymax) return(FALSE);
  93.       *y1=ymax;
  94.     }
  95.   if (*y2<ymin) *y2=ymin;
  96.   if (*y2>ymax) *y2=ymax;
  97.   return(TRUE);
  98.  
  99. }
  100.  
  101.  
  102.  
  103. FFPClip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
  104. FFP *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
  105. {
  106.  
  107.   if (*x1<xmin)
  108.     {
  109.       if (*x2<=xmin) return(FALSE);
  110.       else
  111.         {
  112.            *y1=(*y1+(*y2-*y1)*((xmin-*x1)/(*x2-*x1)));
  113.            *x1=xmin;
  114.         }
  115.     }
  116.   if (*x1>xmax)
  117.     {
  118.       if (*x2>=xmax) return(FALSE);
  119.       else
  120.         {
  121.            *y1=(*y1+(*y2-*y1)*((*x1-xmax)/(*x1-*x2)));
  122.            *x1=xmax;
  123.         }
  124.     }
  125.   if (*x2<xmin)
  126.     {
  127.        *y2=(*y1+(*y2-*y1)*((*x1-xmin)/(*x1-*x2)));
  128.        *x2=xmin;
  129.     }
  130.   if (*x2>xmax)
  131.     {
  132.        *y2=(*y1+(*y2-*y1)*((xmax-*x1)/(*x2-*x1)));
  133.        *x2=xmax;
  134.     }
  135.   if (*y1<ymin)
  136.     {
  137.       if (*y2<=ymin) return(FALSE);
  138.       else
  139.         {
  140.            *x1=(*x1+(*x2-*x1)*((ymin-*y1)/(*y2-*y1)));
  141.            *y1=ymin;
  142.          }
  143.     }
  144.   if (*y1>ymax)
  145.     {
  146.       if (*y2>=ymax) return(FALSE);
  147.       else
  148.         {
  149.            *x1=(*x1+(*x2-*x1)*((*y1-ymax)/(*y1-*y2)));
  150.            *y1=ymax;
  151.         }
  152.     }
  153.   if (*y2<ymin)
  154.     {
  155.        *x2=(*x1+(*x2-*x1)*((*y1-ymin)/(*y1-*y2)));
  156.        *y2=ymin;
  157.     }
  158.   if (*y2>ymax)
  159.     {
  160.        *x2=(*x1+(*x2-*x1)*((ymax-*y1)/(*y2-*y1)));
  161.        *y2=ymax;
  162.     }
  163.   return(TRUE);
  164.  
  165. }
  166.  
  167. FFPClipPoint(x,y,xmin,ymin,xmax,ymax)
  168. FFP x,y,xmin,ymin,xmax,ymax;
  169. {
  170. if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
  171. return(TRUE);
  172. }
  173.  
  174.  
  175. FFPQuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
  176. FFP x,*y1,*y2,xmin,ymin,xmax,ymax;
  177. {
  178.   if (x<xmin) return(FALSE);
  179.   if (x>xmax) return(FALSE);
  180.  
  181.   if (*y1<ymin)
  182.     {
  183.       if (*y2<=ymin) return(FALSE);
  184.       *y1=ymin;
  185.     }
  186.   if (*y1>ymax)
  187.     {
  188.       if (*y2>=ymax) return(FALSE);
  189.       *y1=ymax;
  190.     }
  191.   if (*y2<ymin) *y2=ymin;
  192.   if (*y2>ymax) *y2=ymax;
  193.   return(TRUE);
  194.  
  195. }
  196.