home *** CD-ROM | disk | FTP | other *** search
- #include "struct.h"
- #include "plot.h"
- #include <graphics/gfxmacros.h>
-
- Clip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
- short *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
- {
-
- if (*x1<xmin)
- {
- if (*x2<=xmin) return(FALSE);
- else
- {
- *y1=(short)(*y1+(*y2-*y1)*((FFP)(xmin-*x1)/(FFP)(*x2-*x1)));
- *x1=xmin;
- }
- }
- if (*x1>xmax)
- {
- if (*x2>=xmax) return(FALSE);
- else
- {
- *y1=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmax)/(FFP)(*x1-*x2)));
- *x1=xmax;
- }
- }
- if (*x2<xmin)
- {
- *y2=(short)(*y1+(*y2-*y1)*((FFP)(*x1-xmin)/(FFP)(*x1-*x2)));
- *x2=xmin;
- }
- if (*x2>xmax)
- {
- *y2=(short)(*y1+(*y2-*y1)*((FFP)(xmax-*x1)/(FFP)(*x2-*x1)));
- *x2=xmax;
- }
-
-
- if (*y1<ymin)
- {
- if (*y2<=ymin) return(FALSE);
- else
- {
- *x1=(short)(*x1+(*x2-*x1)*((FFP)(ymin-*y1)/(FFP)(*y2-*y1)));
- *y1=ymin;
- }
- }
- if (*y1>ymax)
- {
- if (*y2>=ymax) return(FALSE);
- else
- {
- *x1=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymax)/(FFP)(*y1-*y2)));
- *y1=ymax;
- }
- }
- if (*y2<ymin)
- {
- *x2=(short)(*x1+(*x2-*x1)*((FFP)(*y1-ymin)/(FFP)(*y1-*y2)));
- *y2=ymin;
- }
- if (*y2>ymax)
- {
- *x2=(short)(*x1+(*x2-*x1)*((FFP)(ymax-*y1)/(FFP)(*y2-*y1)));
- *y2=ymax;
- }
- return(TRUE);
-
- }
-
- ClipPoint(x,y,xmin,ymin,xmax,ymax)
- short x,y,xmin,ymin,xmax,ymax;
- {
- if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
- return(TRUE);
- }
-
-
- QuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
- short x,*y1,*y2,xmin,ymin,xmax,ymax;
- {
- if (x<xmin) return(FALSE);
- if (x>xmax) return(FALSE);
-
- if (*y1<ymin)
- {
- if (*y2<=ymin) return(FALSE);
- *y1=ymin;
- }
- if (*y1>ymax)
- {
- if (*y2>=ymax) return(FALSE);
- *y1=ymax;
- }
- if (*y2<ymin) *y2=ymin;
- if (*y2>ymax) *y2=ymax;
- return(TRUE);
-
- }
-
-
-
- FFPClip(x1,y1,x2,y2,xmin,ymin,xmax,ymax) /* General purpose clipping of diagonals */
- FFP *x1,*x2,*y1,*y2,xmin,ymin,xmax,ymax;
- {
-
- if (*x1<xmin)
- {
- if (*x2<=xmin) return(FALSE);
- else
- {
- *y1=(*y1+(*y2-*y1)*((xmin-*x1)/(*x2-*x1)));
- *x1=xmin;
- }
- }
- if (*x1>xmax)
- {
- if (*x2>=xmax) return(FALSE);
- else
- {
- *y1=(*y1+(*y2-*y1)*((*x1-xmax)/(*x1-*x2)));
- *x1=xmax;
- }
- }
- if (*x2<xmin)
- {
- *y2=(*y1+(*y2-*y1)*((*x1-xmin)/(*x1-*x2)));
- *x2=xmin;
- }
- if (*x2>xmax)
- {
- *y2=(*y1+(*y2-*y1)*((xmax-*x1)/(*x2-*x1)));
- *x2=xmax;
- }
- if (*y1<ymin)
- {
- if (*y2<=ymin) return(FALSE);
- else
- {
- *x1=(*x1+(*x2-*x1)*((ymin-*y1)/(*y2-*y1)));
- *y1=ymin;
- }
- }
- if (*y1>ymax)
- {
- if (*y2>=ymax) return(FALSE);
- else
- {
- *x1=(*x1+(*x2-*x1)*((*y1-ymax)/(*y1-*y2)));
- *y1=ymax;
- }
- }
- if (*y2<ymin)
- {
- *x2=(*x1+(*x2-*x1)*((*y1-ymin)/(*y1-*y2)));
- *y2=ymin;
- }
- if (*y2>ymax)
- {
- *x2=(*x1+(*x2-*x1)*((ymax-*y1)/(*y2-*y1)));
- *y2=ymax;
- }
- return(TRUE);
-
- }
-
- FFPClipPoint(x,y,xmin,ymin,xmax,ymax)
- FFP x,y,xmin,ymin,xmax,ymax;
- {
- if ((x<xmin)||(x>xmax)||(y<ymin)||(y>ymax)) return(FALSE);
- return(TRUE);
- }
-
-
- FFPQuickClip(x,y1,y2,xmin,ymin,xmax,ymax) /* Rapid clipping of lines known to be vertical */
- FFP x,*y1,*y2,xmin,ymin,xmax,ymax;
- {
- if (x<xmin) return(FALSE);
- if (x>xmax) return(FALSE);
-
- if (*y1<ymin)
- {
- if (*y2<=ymin) return(FALSE);
- *y1=ymin;
- }
- if (*y1>ymax)
- {
- if (*y2>=ymax) return(FALSE);
- *y1=ymax;
- }
- if (*y2<ymin) *y2=ymin;
- if (*y2>ymax) *y2=ymax;
- return(TRUE);
-
- }
-