Skip to content

Commit

Permalink
linelike intersections (#3353)
Browse files Browse the repository at this point in the history
* Replace linelike intersections with line-curve/line-line tests, fixes #3352

* Tests for #3352
  • Loading branch information
simoncozens committed Nov 27, 2023
1 parent 5ce7128 commit b5ddc99
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
16 changes: 16 additions & 0 deletions Lib/fontTools/misc/bezierTools.py
Expand Up @@ -1370,6 +1370,11 @@ def midpoint(r):
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.
Expand All @@ -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])
Expand Down
8 changes: 8 additions & 0 deletions Tests/misc/bezierTools_test.py
Expand Up @@ -4,6 +4,7 @@
calcQuadraticArcLength,
calcCubicBounds,
curveLineIntersections,
curveCurveIntersections,
segmentPointAtT,
splitLine,
splitQuadratic,
Expand Down Expand Up @@ -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)

0 comments on commit b5ddc99

Please sign in to comment.