From c76873cac817d6ccc4c5d9c968c54668b4869a41 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 22 Aug 2012 03:45:35 +0900 Subject: [PATCH] fix drawing error of fancyarrow of simple style when two points are too close. This addresses #566. Initial patch submitted by Rolf Barinka. --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/patches.py | 90 +- .../fancyarrow_test_image.pdf | Bin 0 -> 4057 bytes .../fancyarrow_test_image.png | Bin 0 -> 10176 bytes .../fancyarrow_test_image.svg | 1577 +++++++++++++++++ lib/matplotlib/tests/test_arrow_patches.py | 28 + 6 files changed, 1667 insertions(+), 29 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.png create mode 100644 lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.svg create mode 100644 lib/matplotlib/tests/test_arrow_patches.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index be0ddc6ac3b5..09467429e052 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -1083,6 +1083,7 @@ def tk_window_focus(): 'matplotlib.tests.test_tightlayout', 'matplotlib.tests.test_triangulation', 'matplotlib.tests.test_transforms', + 'matplotlib.tests.test_arrow_patches', ] diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 23e364f884cd..1f9314148c19 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2841,6 +2841,18 @@ def connect(self, posA, posB): {"AvailableConnectorstyles": _pprint_styles(_style_list)} +def _point_along_a_line(x0, y0, x1, y1, d): + """ + find a point along a line connecting (x0, y0) -- (x1, y1) whose + distance from (x0, y0) is d. + """ + dx, dy = x0 - x1, y0 - y1 + ff = d/(dx*dx+dy*dy)**.5 + x2, y2 = x0 - ff*dx, y0 - ff*dy + + return x2, y2 + + class ArrowStyle(_Style): """ :class:`ArrowStyle` is a container class which defines several @@ -3460,35 +3472,57 @@ def transmute(self, path, mutation_size, linewidth): head_length = self.head_length * mutation_size in_f = inside_circle(x2, y2, head_length) arrow_path = [(x0, y0), (x1, y1), (x2, y2)] - arrow_out, arrow_in = \ - split_bezier_intersecting_with_closedpath(arrow_path, - in_f, - tolerence=0.01) + + from bezier import NonIntersectingPathException + + try: + arrow_out, arrow_in = \ + split_bezier_intersecting_with_closedpath(arrow_path, + in_f, + tolerence=0.01) + except NonIntersectingPathException: + # if this happens, make a straight line of the head_length long. + x0, y0 = _point_along_a_line(x2, y2, x1, y1, head_length) + x1n, y1n = 0.5*(x0+x2), 0.5*(y0+y2) + arrow_in = [(x0, y0), (x1n, y1n), (x2, y2)] + arrow_out = None # head head_width = self.head_width * mutation_size - head_l, head_r = make_wedged_bezier2(arrow_in, head_width / 2., - wm=.5) + head_left, head_right = \ + make_wedged_bezier2(arrow_in, head_width/2., + wm=.5) + # tail - tail_width = self.tail_width * mutation_size - tail_left, tail_right = get_parallels(arrow_out, tail_width / 2.) + if arrow_out is not None: + tail_width = self.tail_width * mutation_size + tail_left, tail_right = get_parallels(arrow_out, tail_width/2.) + + #head_right, head_left = head_r, head_l + patch_path = [(Path.MOVETO, tail_right[0]), + (Path.CURVE3, tail_right[1]), + (Path.CURVE3, tail_right[2]), + (Path.LINETO, head_right[0]), + (Path.CURVE3, head_right[1]), + (Path.CURVE3, head_right[2]), + (Path.CURVE3, head_left[1]), + (Path.CURVE3, head_left[0]), + (Path.LINETO, tail_left[2]), + (Path.CURVE3, tail_left[1]), + (Path.CURVE3, tail_left[0]), + (Path.LINETO, tail_right[0]), + (Path.CLOSEPOLY, tail_right[0]), + ] + else: + patch_path = [(Path.MOVETO, head_right[0]), + (Path.CURVE3, head_right[1]), + (Path.CURVE3, head_right[2]), + (Path.CURVE3, head_left[1]), + (Path.CURVE3, head_left[0]), + (Path.CLOSEPOLY, head_left[0]), + ] - head_right, head_left = head_r, head_l - patch_path = [(Path.MOVETO, tail_right[0]), - (Path.CURVE3, tail_right[1]), - (Path.CURVE3, tail_right[2]), - (Path.LINETO, head_right[0]), - (Path.CURVE3, head_right[1]), - (Path.CURVE3, head_right[2]), - (Path.CURVE3, head_left[1]), - (Path.CURVE3, head_left[0]), - (Path.LINETO, tail_left[2]), - (Path.CURVE3, tail_left[1]), - (Path.CURVE3, tail_left[0]), - (Path.LINETO, tail_right[0]), - (Path.CLOSEPOLY, tail_right[0]), - ] path = Path([p for c, p in patch_path], [c for c, p in patch_path]) return path, True @@ -3536,12 +3570,10 @@ def transmute(self, path, mutation_size, linewidth): in_f, tolerence=0.01) except NonIntersectingPathException: - # if this happens, make a straight line of the head_length - # long. - dx, dy = x2 - x1, y2 - y1 - ff = head_length / (dx * dx + dy * dy) ** .5 - x0, y0 = x2 - ff * dx, y2 - ff * dy - arrow_path = [(x0, y0), (x1, y1), (x2, y2)] + # if this happens, make a straight line of the head_length long. + x0, y0 = _point_along_a_line(x2, y2, x1, y1, head_length) + x1n, y1n = 0.5*(x0+x2), 0.5*(y0+y2) + arrow_path = [(x0, y0), (x1n, y1n), (x2, y2)] path_head = arrow_path else: path_head = path_in diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.pdf b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..195b54845e01d232c459e19b0338b74b51246d2a GIT binary patch literal 4057 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.png b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.png new file mode 100644 index 0000000000000000000000000000000000000000..02eb43ae179d5dd5d7722e83d840e681577b46ba GIT binary patch literal 10176 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.svg b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.svg new file mode 100644 index 000000000000..cddabf144d0c --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_arrow_patches/fancyarrow_test_image.svg @@ -0,0 +1,1577 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_arrow_patches.py b/lib/matplotlib/tests/test_arrow_patches.py new file mode 100644 index 000000000000..721a53e45157 --- /dev/null +++ b/lib/matplotlib/tests/test_arrow_patches.py @@ -0,0 +1,28 @@ +import matplotlib.pyplot as plt +from matplotlib.testing.decorators import image_comparison + +def draw_arrow(ax, t, r): + ax.annotate('', xy=(0.5, 0.5+r), xytext=(0.5, 0.5), size=30, + arrowprops=dict(arrowstyle=t, + fc="b", ec='k')) + +@image_comparison(baseline_images=['fancyarrow_test_image']) +def test_fancyarrow(): + r = [0.4, 0.3, 0.2, 0.1] + t = ["fancy", "simple"] + + fig, axes = plt.subplots(len(t), len(r), squeeze=False, + subplot_kw=dict(aspect=True), + figsize=(8, 4.5)) + + for i_r, r1 in enumerate(r): + for i_t, t1 in enumerate(t): + ax = axes[i_t, i_r] + draw_arrow(ax, t1, r1) + ax.tick_params(labelleft=False, labelbottom=False) + + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) +