This is pllclp.c in view mode; [Download] [Up]
/* 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))
void pllclp(x1,y1,x2,y2)
int x1,y1,x2,y2;
{
int clpxmi,clpxma,clpymi,clpyma;
int t,dx,dy,flipx,flipy;
double slope;
scurr(x2,y2);
gclp(&clpxmi,&clpxma,&clpymi,&clpyma);
if(INSIDE(x1,y1) && INSIDE(x2,y2)) {
genlin(x1,y1,x2,y2);
return;
}
if((x1 <= clpxmi && x2 <= clpxmi)||(x1 >= clpxma && x2 >= clpxma))
return;
if((y1 <= clpymi && y2 <= clpymi)||(y1 >= clpyma && y2 >= clpyma))
return;
flipx = 0; flipy = 0;
if(x2 < x1) {
x1 = 2*clpxmi - x1;
x2 = 2*clpxmi - x2;
clpxma = 2*clpxmi - clpxma;
t = clpxma; clpxma = clpxmi; clpxmi = t;
flipx = 1;
}
if(y2 < y1) {
y1 = 2*clpymi - y1;
y2 = 2*clpymi - y2;
clpyma = 2*clpymi - clpyma;
t = clpyma; clpyma = clpymi; clpymi = t;
flipy = 1;
}
dx = x2 - x1; dy = y2 - y1;
slope = 0.0;
if(dx != 0)
slope = (double)dy/(double)dx;
if(x1 < clpxmi) {
if(dx != 0 && dy != 0)
y1 = y1 + round(slope*(clpxmi-x1));
x1 = clpxmi;
}
if(y1 < clpymi) {
if(dx != 0 && dy != 0)
x1 = x1 + round((clpymi-y1)/slope);
y1 = clpymi;
}
if(x1 >= clpxma || y1 >= clpyma)
return;
if(y2 > clpyma) {
if(dx != 0 && dy != 0)
x2 = x2 - round((y2 - clpyma)/slope);
y2 = clpyma;
}
if(x2 > clpxma) {
if(dx != 0 && dy != 0)
y2 = y2 - round((x2 - clpxma)*slope);
x2 = clpxma;
}
if(flipx) {
x1 = 2*clpxma - x1;
x2 = 2*clpxma - x2;
clpxmi = 2*clpxma - clpxmi;
t = clpxma; clpxma = clpxmi; clpxmi = t;
}
if(flipy) {
y1 = 2*clpyma - y1;
y2 = 2*clpyma - y2;
clpymi = 2*clpyma - clpymi;
t = clpyma; clpyma = clpymi; clpymi = t;
}
genlin(x1,y1,x2,y2);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.