/* Do two rects intersect ? * For each edge in r1, does the edge intersect with any edge in r2 ? * FIXME: Should add first check for non-intersection of * bounding boxes of rects (?) */ int intersect(LRect r1, LRect r2) { int result = 0; if (edgesIntersect(r1.x1, r1.x2, r1.y1, r1.y2, r2) || edgesIntersect(r1.x2, r1.x3, r1.y2, r1.y3, r2) || edgesIntersect(r1.x3, r1.x4, r1.y3, r1.y4, r2) || edgesIntersect(r1.x4, r1.x1, r1.y4, r1.y1, r2)) result = 1; return result; }
int polyOverlap(Point p, Poly * pp, Point q, Poly * qp) { Point op, cp; Point oq, cq; /* translate bounding boxes */ addpt(&op, p, pp->origin); addpt(&cp, p, pp->corner); addpt(&oq, q, qp->origin); addpt(&cq, q, qp->corner); /* If bounding boxes don't overlap, done */ if (!pintersect(op, cp, oq, cq)) return 0; if (ISBOX(pp) && ISBOX(qp)) return 1; if (ISCIRCLE(pp) && ISCIRCLE(qp)) { double d = (pp->corner.x - pp->origin.x + qp->corner.x - qp->origin.x); double dx = p.x - q.x; double dy = p.y - q.y; if ((dx * dx + dy * dy) > (d * d) / 4.0) return 0; else return 1; } if (tp1 == NULL) { tp1 = N_GNEW(maxcnt, Point); tp2 = N_GNEW(maxcnt, Point); } transCopy(pp->verts, pp->nverts, p, tp1); transCopy(qp->verts, qp->nverts, q, tp2); return (edgesIntersect(tp1, tp2, pp->nverts, qp->nverts) || (inBox(*tp1, oq, cq) && inPoly(tp2, qp->nverts, *tp1)) || (inBox(*tp2, op, cp) && inPoly(tp1, pp->nverts, *tp2))); }