#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;
}