diff --git a/lib/matplotlib/bezier.py b/lib/matplotlib/bezier.py index f310f287e2c0..069e20d05916 100644 --- a/lib/matplotlib/bezier.py +++ b/lib/matplotlib/bezier.py @@ -171,9 +171,17 @@ def find_bezier_t_intersecting_with_closedpath( if start_inside ^ middle_inside: t1 = middle_t + if end == middle: + # Edge case where infinite loop is possible + # Caused by large numbers relative to tolerance + return t0, t1 end = middle else: t0 = middle_t + if start == middle: + # Edge case where infinite loop is possible + # Caused by large numbers relative to tolerance + return t0, t1 start = middle start_inside = middle_inside diff --git a/lib/matplotlib/tests/test_bezier.py b/lib/matplotlib/tests/test_bezier.py new file mode 100644 index 000000000000..65e2c616e738 --- /dev/null +++ b/lib/matplotlib/tests/test_bezier.py @@ -0,0 +1,17 @@ +""" +Tests specific to the bezier module. +""" + +from matplotlib.bezier import inside_circle, split_bezier_intersecting_with_closedpath + + +def test_split_bezier_with_large_values(): + # These numbers come from gh-27753 + arrow_path = [(96950809781500.0, 804.7503795623779), + (96950809781500.0, 859.6242585800646), + (96950809781500.0, 914.4981375977513)] + in_f = inside_circle(96950809781500.0, 804.7503795623779, 0.06) + split_bezier_intersecting_with_closedpath(arrow_path, in_f) + # All we are testing is that this completes + # The failure case is an infinite loop resulting from floating point precision + # pytest will timeout if that occurs