home *** CD-ROM | disk | FTP | other *** search
- /* Draws a (x1,y1) to (x2,y2) within the clip limits */
-
- #include "plplot.h"
-
- #define betw(ix,ia,ib) ((ix<=ia && ix>=ib) || (ix>=ia && ix<=ib))
- #define inside(ix,iy) (betw(ix,clpxmi,clpxma) && betw(iy,clpymi,clpyma))
- #define ixcut(iy) round((float)((x2-x1)*(iy-y1)+x1*(y2-y1))/(float)(y2-y1))
- #define iycut(ix) round((float)((y2-y1)*(ix-x1)+y1*(x2-x1))/(float)(x2-x1))
-
- void pllclp(x1,y1,x2,y2)
- int x1,y1,x2,y2;
- {
- int xt[2],yt[2];
- int it, k;
- int clpxmi,clpxma,clpymi,clpyma;
-
- gclp(&clpxmi,&clpxma,&clpymi,&clpyma);
- k=0;
- if (inside(x1,y1)) {
- xt[k]=x1;
- yt[k]=y1;
- k=k+1;
- }
- if (inside(x2,y2)) {
- xt[k]=x2;
- yt[k]=y2;
- k=k+1;
- }
- if (k == 2) goto draw;
- if (y1 != y2) {
- it=ixcut(clpymi);
- if (inside(it,clpymi) && betw(clpymi,y1,y2)) {
- xt[k]=it;
- yt[k]=clpymi;
- k=k+1;
- }
- if (k == 2) goto draw;
- it=ixcut(clpyma);
- if (inside(it,clpyma) && betw(clpyma,y1,y2)) {
- xt[k]=it;
- yt[k]=clpyma;
- k=k+1;
- }
- if (k == 2) goto draw;
- }
- if (x1 != x2) {
- it=iycut(clpxmi);
- if (inside(clpxmi,it) && betw(clpxmi,x1,x2)) {
- xt[k]=clpxmi;
- yt[k]=it;
- k=k+1;
- }
- if (k == 2) goto draw;
- it=iycut(clpxma);
- if (inside(clpxma,it) && betw(clpxma,x1,x2)) {
- xt[k]=clpxma;
- yt[k]=it;
- k=k+1;
- }
- if (k == 2) goto draw;
- }
- draw:
- if (k == 2) genlin(xt[0],yt[0],xt[1],yt[1]);
- scurr(x2,y2);
- }
-