#include "defs.h" /* * Test if position lies between two others. * * p1, p2 = positions of the ends of a line segment * z = test position * return = 0 if not between, 1 if between and the segment is horizontal, * 2 if between and vertical */ INT between(p1, z, p2) REG DLW p1, z, p2; { if((p1->y == z->y) && (p1->y == p2->y) && (((p1->x <= z->x) && (z->x <= p2->x)) || ((p2->x <= z->x) && (z->x <= p1->x)))) return(1); if((p1->x == z->x) && (p1->x == p2->x) && (((p1->y <= z->y) && (z->y <= p2->y)) || ((p2->y <= z->y) && (z->y <= p1->y)))) return(2); return(0); } /* * return point in centre of shape */ DL midpt(p, q) REG DL p, q; { LOC DL1 pt; pt->x = (p->x + q->x) / 2; pt->y = (p->y + q->y) / 2; return(pt); } /* * Does point lie within a given box (or on edge)? * * p1, p2 = define corners of box * p = position to be tested * return = 1 -- yes; 0 -- no */ within(p1, p, p2) DL p1, p, p2; { return((xydist(p1, p) + xydist(p, p2)) == xydist(p1, p2)); } /* * Compute the distance between two points. * * a, b = positions * return = distance (delta x plus delta y) */ xydist(a, b) REG DL a, b; { return(abs(a->x - b->x) + abs(a->y - b->y)); } /* * test if two points are the same. * return(1) if so * return(0) if not */ xysame(p1,p2) REG DL p1, p2; { if (p1->x == p2->x && p1->y == p2->y) return(1); return(0); }