bool intersect(const Quadratic& q1, const Quadratic& q2, Intersections& i) { if (implicit_matches(q1, q2)) { // FIXME: compute T values // compute the intersections of the ends to find the coincident span bool useVertical = fabs(q1[0].x - q1[2].x) < fabs(q1[0].y - q1[2].y); double t; if ((t = axialIntersect(q1, q2[0], useVertical)) >= 0) { i.addCoincident(t, 0); } if ((t = axialIntersect(q1, q2[2], useVertical)) >= 0) { i.addCoincident(t, 1); } useVertical = fabs(q2[0].x - q2[2].x) < fabs(q2[0].y - q2[2].y); if ((t = axialIntersect(q2, q1[0], useVertical)) >= 0) { i.addCoincident(0, t); } if ((t = axialIntersect(q2, q1[2], useVertical)) >= 0) { i.addCoincident(1, t); } assert(i.fCoincidentUsed <= 2); return i.fCoincidentUsed > 0; } QuadraticIntersections q(q1, q2, i); bool result = q.intersect(); // FIXME: partial coincidence detection is currently poor. For now, try // to fix up the data after the fact. In the future, revisit the error // term to try to avoid this kind of result in the first place. if (i.fUsed && i.fCoincidentUsed) { hackToFixPartialCoincidence(q1, q2, i); } return result; }