René's URL Explorer Experiment


Title: `_path.get_extents` does not correctly handle bezier curves · Issue #16830 · matplotlib/matplotlib · GitHub

Open Graph Title: `_path.get_extents` does not correctly handle bezier curves · Issue #16830 · matplotlib/matplotlib

X Title: `_path.get_extents` does not correctly handle bezier curves · Issue #16830 · matplotlib/matplotlib

Description: Bug report Bug summary Currently, .Path extents are calculated by _path.h as simply the Bbox 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 ...

Open Graph Description: Bug report Bug summary Currently, .Path extents are calculated by _path.h as simply the Bbox of the control points. For bezier curves, the convex hull of the control points can be easily shown to c...

X Description: Bug report Bug summary Currently, .Path extents are calculated by _path.h as simply the Bbox of the control points. For bezier curves, the convex hull of the control points can be easily shown to c...

Opengraph URL: https://github.com/matplotlib/matplotlib/issues/16830

X: @github

direct link

Domain: github.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`_path.get_extents` does not correctly handle bezier curves","articleBody":"\u003c!--To help us understand and resolve your issue, please fill out the form to the best of your ability.--\u003e\r\n\u003c!--You can feel free to delete the sections that do not apply.--\u003e\r\n\r\n### Bug report\r\n\r\n**Bug summary**\r\n\r\n\u003c!--A short 1-2 sentences that succinctly describes the bug--\u003e\r\n\r\nCurrently, `.Path` extents are calculated by `_path.h` as simply the `Bbox` of the control points.\r\n\r\nFor 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).\r\n\r\nSome thoughts:\r\n\r\n1) Doing this correctly is required in order to correctly implement \"width\", \"bbox-width\", and \"bbox-area\" for `MarkerStyle.normalization` as initially proposed in #15703 and discussed in #16772. \r\n2) 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. \r\n3) It might make sense to leave the current `Path.get_extents` code, and implement a `Path.get_exact_extents` to be used upon `MarkerStyle.__init__` to pre-calculate/cache the `Bbox` of that marker.\r\n\r\nThis 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.\r\n\r\nSomeone who's more familiar with the `Agg` 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 all `Path`'s. \r\n\r\nI will submit a PR to implement `Path.get_exact_extents` Python-side (not much work), but I wanted to open this up for discussion. \r\n\r\n**Code for reproduction**\r\n\r\n\u003c!--A minimum code snippet required to reproduce the bug.\r\nPlease make sure to minimize the number of dependencies required, and provide\r\nany necessary plotted data.\r\nAvoid using threads, as Matplotlib is (explicitly) not thread-safe.--\u003e\r\n\r\n```python\r\nimport matplotlib.pyplot as plt\r\nfrom matplotlib.path import Path\r\nfrom matplotlib.transforms import Bbox\r\nfrom matplotlib import patches\r\n\r\nhard_curve = Path([[0, 0],\r\n                   [4, 0], [-3, 1], [1, 1]],\r\n                  [Path.MOVETO,\r\n                   Path.CURVE4, Path.CURVE4, Path.CURVE4])\r\nreported_extents = hard_curve.get_extents()\r\nactual_extents = Bbox([[-0.3, 0], [1.3, 1]])\r\nfig, ax = plt.subplots()\r\npatch = patches.PathPatch(hard_curve, facecolor='orange', lw=2)\r\nax.add_patch(patch)\r\nax.set_xlim(-1, 2)\r\nax.set_ylim(-0.1, 1.1)\r\nax.set_title(f\"Path extents are {reported_extents};\\nShould be ~{actual_extents}.\")\r\n```\r\n\r\n**Actual outcome**\r\n\r\n\u003c!--The output produced by the above code, which may be a screenshot, console output, etc.--\u003e\r\n![issue-image](https://user-images.githubusercontent.com/1475390/77058298-7b1f1e00-6992-11ea-8999-749fc7573b27.png)\r\n\r\n```\r\n# If applicable, paste the console output here\r\n#\r\n#\r\n```\r\n\r\n**Expected outcome**\r\n\r\n\u003c!--A description of the expected outcome from the code snippet--\u003e\r\n\u003c!--If this used to work in an earlier version of Matplotlib, please note the version it used to work on--\u003e\r\nSee title of plot.\r\n\r\n**Matplotlib version**\r\n\u003c!--Please specify your platform and versions of the relevant libraries you are using:--\u003e\r\n  * Operating system: Debian 9 Jessie\r\n  * Matplotlib version: master\r\n  * Matplotlib backend (`print(matplotlib.get_backend())`): qt5agg\r\n  * Python version: 3.7.3\r\n  * Jupyter version (if applicable): N/A\r\n  * Other libraries: N/A\r\n\r\n\r\n\u003c!--Please tell us how you installed matplotlib and python e.g., from source, pip, conda--\u003e\r\n\u003c!--If you installed from conda, please specify which channel you used if not the default--\u003e\r\n\r\n","author":{"url":"https://github.com/brunobeltran","@type":"Person","name":"brunobeltran"},"datePublished":"2020-03-19T10:39:19.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/16830/matplotlib/issues/16830"}

route-pattern/_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format)
route-controllervoltron_issues_fragments
route-actionissue_layout
fetch-noncev2:fcd73fe0-9b40-cda2-89d4-ded0f11a04a1
current-catalog-service-hash81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114
request-idBB5C:C8AE2:9DE6538:DDDDB3A:6A50CC5D
html-safe-noncef87343f8c6be9a71eb13eb48403d9b49b65e586b32ea092a4cde0491729b065e
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQjVDOkM4QUUyOjlERTY1Mzg6REREREIzQTo2QTUwQ0M1RCIsInZpc2l0b3JfaWQiOiIzMTg5MDE2NDc4OTQzODU3NzU3IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac5c82d4e462b4bd34d96d5c1903820c4f261b6dffea726d3b49276342548da9d3
hovercard-subject-tagissue:584316485
github-keyboard-shortcutsrepository,issues,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/issues_fragments/issue_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/16830/issue_layout
twitter:imagehttps://opengraph.githubassets.com/a52e93fcb5c9299e45dc495759fda2ffa573db29672dff3e11ccd83b13b3dc89/matplotlib/matplotlib/issues/16830
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/a52e93fcb5c9299e45dc495759fda2ffa573db29672dff3e11ccd83b13b3dc89/matplotlib/matplotlib/issues/16830
og:image:altBug report Bug summary Currently, .Path extents are calculated by _path.h as simply the Bbox of the control points. For bezier curves, the convex hull of the control points can be easily shown to c...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
og:author:usernamebrunobeltran
hostnamegithub.com
expected-hostnamegithub.com
None72b13e0e8d0319acdd27a145cfe73f4f06c791713d0ac4690e41fb68ad28cac0
turbo-cache-controlno-preview
go-importgithub.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git
octolytics-dimension-user_id215947
octolytics-dimension-user_loginmatplotlib
octolytics-dimension-repository_id1385122
octolytics-dimension-repository_nwomatplotlib/matplotlib
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1385122
octolytics-dimension-repository_network_root_nwomatplotlib/matplotlib
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release08e79d53fc070870d5b168356afebb1e286a2ffe
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/matplotlib/matplotlib/issues/16830#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fissues%2F16830
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmatplotlib%2Fmatplotlib%2Fissues%2F16830
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fissues_fragments%2Fissue_layout&source=header-repo&source_repo=matplotlib%2Fmatplotlib
Reloadhttps://github.com/matplotlib/matplotlib/issues/16830
Reloadhttps://github.com/matplotlib/matplotlib/issues/16830
Reloadhttps://github.com/matplotlib/matplotlib/issues/16830
Please reload this pagehttps://github.com/matplotlib/matplotlib/issues/16830
matplotlib https://github.com/matplotlib
matplotlibhttps://github.com/matplotlib/matplotlib
Please reload this pagehttps://github.com/matplotlib/matplotlib/issues/16830
Notifications https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Fork 8.4k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Star 23k https://github.com/login?return_to=%2Fmatplotlib%2Fmatplotlib
Code https://github.com/matplotlib/matplotlib
Issues 1.1k https://github.com/matplotlib/matplotlib/issues
Pull requests 411 https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality 0 https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
Code https://github.com/matplotlib/matplotlib
Issues https://github.com/matplotlib/matplotlib/issues
Pull requests https://github.com/matplotlib/matplotlib/pulls
Actions https://github.com/matplotlib/matplotlib/actions
Projects https://github.com/matplotlib/matplotlib/projects
Wiki https://github.com/matplotlib/matplotlib/wiki
Security and quality https://github.com/matplotlib/matplotlib/security
Insights https://github.com/matplotlib/matplotlib/pulse
#16832https://github.com/matplotlib/matplotlib/pull/16832
_path.get_extents does not correctly handle bezier curveshttps://github.com/matplotlib/matplotlib/issues/16830#top
#16832https://github.com/matplotlib/matplotlib/pull/16832
topic: path handlinghttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22topic%3A%20path%20handling%22
v3.3.0https://github.com/matplotlib/matplotlib/milestone/48
https://github.com/brunobeltran
brunobeltranhttps://github.com/brunobeltran
on Mar 19, 2020https://github.com/matplotlib/matplotlib/issues/16830#issue-584316485
Sizes of different markers are not perceptually uniform #15703https://github.com/matplotlib/matplotlib/issues/15703
Remove more API deprecated in 3.1 #16772https://github.com/matplotlib/matplotlib/pull/16772
https://user-images.githubusercontent.com/1475390/77058298-7b1f1e00-6992-11ea-8999-749fc7573b27.png
topic: path handlinghttps://github.com/matplotlib/matplotlib/issues?q=state%3Aopen%20label%3A%22topic%3A%20path%20handling%22
v3.3.0https://github.com/matplotlib/matplotlib/milestone/48
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.