Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbdba952

Browse files
timhoffmmeeseeksmachine
authored andcommitted
Backport PRmatplotlib#29919: Handle MOVETO's, CLOSEPOLY's and empty paths in Path.interpolated
1 parenta595375 commitbdba952

File tree

2 files changed

+106
-4
lines changed

2 files changed

+106
-4
lines changed

‎lib/matplotlib/path.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -668,14 +668,35 @@ def intersects_bbox(self, bbox, filled=True):
668668

669669
definterpolated(self,steps):
670670
"""
671-
Return a new pathresampled to length N x *steps*.
671+
Return a new pathwith each segment divided into *steps* parts.
672672
673-
Codes other than `LINETO` are not handled correctly.
673+
Codes other than `LINETO`, `MOVETO`, and `CLOSEPOLY` are not handled correctly.
674+
675+
Parameters
676+
----------
677+
steps : int
678+
The number of segments in the new path for each in the original.
679+
680+
Returns
681+
-------
682+
Path
683+
The interpolated path.
674684
"""
675-
ifsteps==1:
685+
ifsteps==1orlen(self)==0:
676686
returnself
677687

678-
vertices=simple_linear_interpolation(self.vertices,steps)
688+
ifself.codesisnotNoneandself.MOVETOinself.codes[1:]:
689+
returnself.make_compound_path(
690+
*(p.interpolated(steps)forpinself._iter_connected_components()))
691+
692+
ifself.codesisnotNoneandself.CLOSEPOLYinself.codesandnotnp.all(
693+
self.vertices[self.codes==self.CLOSEPOLY]==self.vertices[0]):
694+
vertices=self.vertices.copy()
695+
vertices[self.codes==self.CLOSEPOLY]=vertices[0]
696+
else:
697+
vertices=self.vertices
698+
699+
vertices=simple_linear_interpolation(vertices,steps)
679700
codes=self.codes
680701
ifcodesisnotNone:
681702
new_codes=np.full((len(codes)-1)*steps+1,Path.LINETO,

‎lib/matplotlib/tests/test_path.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,3 +541,84 @@ def test_cleanup_closepoly():
541541
cleaned=p.cleaned(remove_nans=True)
542542
assertlen(cleaned)==1
543543
assertcleaned.codes[0]==Path.STOP
544+
545+
546+
deftest_interpolated_moveto():
547+
# Initial path has two subpaths with two LINETOs each
548+
vertices=np.array([[0,0],
549+
[0,1],
550+
[1,2],
551+
[4,4],
552+
[4,5],
553+
[5,5]])
554+
codes= [Path.MOVETO,Path.LINETO,Path.LINETO]*2
555+
556+
path=Path(vertices,codes)
557+
result=path.interpolated(3)
558+
559+
# Result should have two subpaths with six LINETOs each
560+
expected_subpath_codes= [Path.MOVETO]+ [Path.LINETO]*6
561+
np.testing.assert_array_equal(result.codes,expected_subpath_codes*2)
562+
563+
564+
deftest_interpolated_closepoly():
565+
codes= [Path.MOVETO]+ [Path.LINETO]*2+ [Path.CLOSEPOLY]
566+
vertices= [(4,3), (5,4), (5,3), (0,0)]
567+
568+
path=Path(vertices,codes)
569+
result=path.interpolated(2)
570+
571+
expected_vertices=np.array([[4,3],
572+
[4.5,3.5],
573+
[5,4],
574+
[5,3.5],
575+
[5,3],
576+
[4.5,3],
577+
[4,3]])
578+
expected_codes= [Path.MOVETO]+ [Path.LINETO]*5+ [Path.CLOSEPOLY]
579+
580+
np.testing.assert_allclose(result.vertices,expected_vertices)
581+
np.testing.assert_array_equal(result.codes,expected_codes)
582+
583+
# Usually closepoly is the last vertex but does not have to be.
584+
codes+= [Path.LINETO]
585+
vertices+= [(2,1)]
586+
587+
path=Path(vertices,codes)
588+
result=path.interpolated(2)
589+
590+
extra_expected_vertices=np.array([[3,2],
591+
[2,1]])
592+
expected_vertices=np.concatenate([expected_vertices,extra_expected_vertices])
593+
594+
expected_codes+= [Path.LINETO]*2
595+
596+
np.testing.assert_allclose(result.vertices,expected_vertices)
597+
np.testing.assert_array_equal(result.codes,expected_codes)
598+
599+
600+
deftest_interpolated_moveto_closepoly():
601+
# Initial path has two closed subpaths
602+
codes= ([Path.MOVETO]+ [Path.LINETO]*2+ [Path.CLOSEPOLY])*2
603+
vertices= [(4,3), (5,4), (5,3), (0,0), (8,6), (10,8), (10,6), (0,0)]
604+
605+
path=Path(vertices,codes)
606+
result=path.interpolated(2)
607+
608+
expected_vertices1=np.array([[4,3],
609+
[4.5,3.5],
610+
[5,4],
611+
[5,3.5],
612+
[5,3],
613+
[4.5,3],
614+
[4,3]])
615+
expected_vertices=np.concatenate([expected_vertices1,expected_vertices1*2])
616+
expected_codes= ([Path.MOVETO]+ [Path.LINETO]*5+ [Path.CLOSEPOLY])*2
617+
618+
np.testing.assert_allclose(result.vertices,expected_vertices)
619+
np.testing.assert_array_equal(result.codes,expected_codes)
620+
621+
622+
deftest_interpolated_empty_path():
623+
path=Path(np.zeros((0,2)))
624+
assertpath.interpolated(42)ispath

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp