diff --git a/Lib/fontTools/misc/bezierTools.py b/Lib/fontTools/misc/bezierTools.py index 21ab0a5d0..a1a707b09 100644 --- a/Lib/fontTools/misc/bezierTools.py +++ b/Lib/fontTools/misc/bezierTools.py @@ -1370,6 +1370,11 @@ def _curve_curve_intersections_t( return unique_values +def _is_linelike(segment): + maybeline = _alignment_transformation(segment).transformPoints(segment) + return all(math.isclose(p[1], 0.0) for p in maybeline) + + def curveCurveIntersections(curve1, curve2): """Finds intersections between a curve and a curve. @@ -1391,6 +1396,17 @@ def curveCurveIntersections(curve1, curve2): >>> intersections[0].pt (81.7831487395506, 109.88904552375288) """ + if _is_linelike(curve1): + line1 = curve1[0], curve1[-1] + if _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return lineLineIntersections(*line1, *line2) + else: + return curveLineIntersections(curve2, line1) + elif _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return curveLineIntersections(curve1, line2) + intersection_ts = _curve_curve_intersections_t(curve1, curve2) return [ Intersection(pt=segmentPointAtT(curve1, ts[0]), t1=ts[0], t2=ts[1]) diff --git a/Tests/misc/bezierTools_test.py b/Tests/misc/bezierTools_test.py index 8a3e2ecda..ce8a9e17e 100644 --- a/Tests/misc/bezierTools_test.py +++ b/Tests/misc/bezierTools_test.py @@ -4,6 +4,7 @@ from fontTools.misc.bezierTools import ( calcQuadraticArcLength, calcCubicBounds, curveLineIntersections, + curveCurveIntersections, segmentPointAtT, splitLine, splitQuadratic, @@ -189,3 +190,10 @@ def test_calcQuadraticArcLength(): assert calcQuadraticArcLength( (210, 333), (289, 333), (326.5, 290.5) ) == pytest.approx(127.9225) + + +def test_intersections_linelike(): + seg1 = [(0.0, 0.0), (0.0, 0.25), (0.0, 0.75), (0.0, 1.0)] + seg2 = [(0.0, 0.5), (0.25, 0.5), (0.75, 0.5), (1.0, 0.5)] + pt = curveCurveIntersections(seg1, seg2)[0][0] + assert pt == (0.0, 0.5)