home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 344b.lha / plplot_v2.6 / src / pllclp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-27  |  1.9 KB  |  94 lines

  1. /* Draws a (x1,y1) to (x2,y2) within the clip limits */
  2.  
  3. #include "plplot.h"
  4.  
  5. #define betw(ix,ia,ib) ((ix<=ia && ix>=ib) || (ix>=ia && ix<=ib))
  6. #define inside(ix,iy) (betw(ix,clpxmi,clpxma) && betw(iy,clpymi,clpyma))
  7.  
  8. void pllclp(x1,y1,x2,y2)
  9. PLINT x1,y1,x2,y2;
  10. {
  11.    PLINT clpxmi,clpxma,clpymi,clpyma;
  12.    PLINT t,dx,dy,flipx,flipy;
  13.    PLFLT slope;
  14.  
  15.    scurr(x2,y2);
  16.    gclp(&clpxmi,&clpxma,&clpymi,&clpyma);
  17.  
  18.    if(inside(x1,y1) && inside(x2,y2)) {
  19.       genlin(x1,y1,x2,y2);
  20.       return;
  21.    }
  22.  
  23.    if((x1 <= clpxmi && x2 <= clpxmi)||(x1 >= clpxma && x2 >= clpxma))
  24.       return;
  25.    if((y1 <= clpymi && y2 <= clpymi)||(y1 >= clpyma && y2 >= clpyma))
  26.       return;
  27.  
  28.    flipx = 0; flipy = 0;
  29.  
  30.    if(x2 < x1) {
  31.       x1 = 2*clpxmi - x1;
  32.       x2 = 2*clpxmi - x2;
  33.       clpxma = 2*clpxmi - clpxma;
  34.       t = clpxma; clpxma = clpxmi; clpxmi = t;
  35.       flipx = 1;
  36.    }
  37.  
  38.    if(y2 < y1) {
  39.       y1 = 2*clpymi - y1;
  40.       y2 = 2*clpymi - y2;
  41.       clpyma = 2*clpymi - clpyma;
  42.       t = clpyma; clpyma = clpymi; clpymi = t;
  43.       flipy = 1;
  44.    }
  45.  
  46.    dx = x2 - x1; dy = y2 - y1;
  47.  
  48.    if(dx != 0)
  49.       slope = (PLFLT)dy/(PLFLT)dx;
  50.  
  51.    if(x1 < clpxmi) {
  52.       if(dx != 0 && dy != 0)
  53.          y1 = y1 + round(slope*(clpxmi-x1));
  54.       x1 = clpxmi;
  55.    }
  56.  
  57.    if(y1 < clpymi) {
  58.       if(dx != 0 && dy != 0)
  59.          x1 = x1 + round((clpymi-y1)/slope);
  60.       y1 = clpymi;
  61.    }
  62.  
  63.    if(x1 >= clpxma || y1 >= clpyma)
  64.       return;
  65.  
  66.    if(y2 > clpyma) {
  67.       if(dx != 0 && dy != 0)
  68.          x2 = x2 - round((y2 - clpyma)/slope);
  69.       y2 = clpyma;
  70.    }
  71.  
  72.    if(x2 > clpxma) {
  73.       if(dx != 0 && dy != 0)
  74.          y2 = y2 - round((x2 - clpxma)*slope);
  75.       x2 = clpxma;
  76.    }
  77.  
  78.    if(flipx) {
  79.       x1 = 2*clpxma - x1;
  80.       x2 = 2*clpxma - x2;
  81.       clpxmi = 2*clpxma - clpxmi;
  82.       t = clpxma; clpxma = clpxmi; clpxmi = t;
  83.    }
  84.  
  85.    if(flipy) {
  86.       y1 = 2*clpyma - y1;
  87.       y2 = 2*clpyma - y2;
  88.       clpymi = 2*clpyma - clpymi;
  89.       t = clpyma; clpyma = clpymi; clpymi = t;
  90.    }
  91.  
  92.    genlin(x1,y1,x2,y2);
  93. }
  94.