#include "clip.h" void ClipLine(Point *a, Point *b) { register float dx, dy, dz, tE, tL; dx = b->x - a->x; dy = b->y - a->y; if (Zero(dx) && Zero(dy) && PointInside(a)) return; tE = 0; tL = 1; dz = b->z - a->z; if (ClipT(-dx - dz, a->x + a->z, &tE, &tL) && ClipT(dx - dz, -a->x + a->z, &tE, &tL) && ClipT(dy - dz, -a->y + a->z, &tE, &tL) && ClipT(-dy - dz, a->y + a->z, &tE, &tL) && ClipT(-dz, a->z - ZMIN, &tE, &tL) && ClipT(dz, -a->z - ZMAX, &tE, &tL)) { if (tL < 1) { b->x = a->x + tL * dx; b->y = a->y + tL * dy; b->z = a->z + tL * dz; } if (tE > 0) { a->x += tE * dx; a->y += tE * dy; a->z += tE * dz; } } } int PointInside(Point *a) { return (a->x >= XMIN && a->x <= XMAX && a->y >= YMIN && a->y <= YMAX); } int ClipT(float num, float denom, float *tE, float *tL) { register float t; if (Zero(denom)) return (num <= 0); t=num/denom; if (denom > 0) { if (t > *tL) return 0; if (t > *tE) *tE = t; } else { if (t < *tE) return 0; if (t < *tL) *tL = t; } return 1; }