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

_path.get_extents does not correctly handle bezier curves #16830

Closed
@brunobeltran

Description

@brunobeltran

Bug report

Bug summary

Currently,.Path extents are calculated by_path.h as simply theBbox of the control points.

For bezier curves, the convex hull of the control points can be easily shown to contain the path. So these extents are a correct upper bound. However, especially for cubic curves, this upper bound will often not be even approximately equal. (See example below).

Some thoughts:

  1. Doing this correctly is required in order to correctly implement "width", "bbox-width", and "bbox-area" forMarkerStyle.normalization as initially proposed inSizes of different markers are not perceptually uniform #15703 and discussed inRemove more API deprecated in 3.1 #16772.
  2. Presumably this hasn't been a problem in the past because in practice, matplotlib primarily deals with lines, where the control points are exactly the extents.
  3. It might make sense to leave the currentPath.get_extents code, and implement aPath.get_exact_extents to be used uponMarkerStyle.__init__ to pre-calculate/cache theBbox of that marker.

This solution prevents incurring a (presumably significant) performance penalty for something that clearly has not been a big issue in the past, allows us to still quickly compute the Bbox of a collection of markers by adding the appropriate padding to the Bbox of the marker centers, and doesn't change existing API.

Someone who's more familiar with theAgg internals is free to translate my Python code if we decide it's worth it to implement a "fast" version of the "correct" solution for use on allPath's.

I will submit a PR to implementPath.get_exact_extents Python-side (not much work), but I wanted to open this up for discussion.

Code for reproduction

importmatplotlib.pyplotaspltfrommatplotlib.pathimportPathfrommatplotlib.transformsimportBboxfrommatplotlibimportpatcheshard_curve=Path([[0,0],                   [4,0], [-3,1], [1,1]],                  [Path.MOVETO,Path.CURVE4,Path.CURVE4,Path.CURVE4])reported_extents=hard_curve.get_extents()actual_extents=Bbox([[-0.3,0], [1.3,1]])fig,ax=plt.subplots()patch=patches.PathPatch(hard_curve,facecolor='orange',lw=2)ax.add_patch(patch)ax.set_xlim(-1,2)ax.set_ylim(-0.1,1.1)ax.set_title(f"Path extents are{reported_extents};\nShould be ~{actual_extents}.")

Actual outcome

issue-image

# If applicable, paste the console output here##

Expected outcome

See title of plot.

Matplotlib version

  • Operating system: Debian 9 Jessie
  • Matplotlib version: master
  • Matplotlib backend (print(matplotlib.get_backend())): qt5agg
  • Python version: 3.7.3
  • Jupyter version (if applicable): N/A
  • Other libraries: N/A

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions


      [8]ページ先頭

      ©2009-2025 Movatter.jp