Package: bezier
Helper for Bézier Curves, Triangles, and Higher Order ObjectsThis library provides:Support for BézierCurvesSupport for BézierTrianglesDive in and take a look!Why Bézier?A Bézier curve (and triangle, etc.) is a parametric curve
that uses theBernstein basis:to define a curve as a linear combination:This comes from the fact that the weights sum to one:This can be generalized to higher order by considering three, four, etc.
non-negative weights that sum to one (in the above we have the two
non-negative weightssand1 - s).Due to their simple form, Bézier curves:can easily model geometric objects as parametric curves, triangles, etc.can be computed in an efficient and numerically stable way viade Casteljau’s algorithmcan utilize convex optimization techniques for many algorithms (such as
curve-curve intersection), since curves (and triangles, etc.)
are convex combinations of the basisMany applications – as well as the history of their development –
are described in
“The Bernstein polynomial basis: A centennialretrospective”,
for example;aids physical analysis using finite element methods (FEM) on
isogeometric models by using geometric shape functions calledNURBSto represent dataused in robust control of dynamic systems; utilizes convexity to
create a hull of curvesInstallingThebezierPython package can be installed withpip:$python-mpipinstall--upgradebezier$python3.11-mpipinstall--upgradebezier$# To install optional dependencies, e.g. SymPy$python-mpipinstall--upgradebezier[full]To install a pure Python version (i.e. with no binary extension):$BEZIER_NO_EXTENSION=true\>python-mpipinstall--upgradebezier--no-binary=bezierbezieris open-source, so you can alternatively grab the source
code fromGitHuband install from source.Getting StartedFor example, to create a curve:>>>importbezier>>>importnumpyasnp>>>nodes1=np.asfortranarray([...[0.0,0.5,1.0],...[0.0,1.0,0.0],...])>>>curve1=bezier.Curve(nodes1,degree=2)The intersection (points) between two curves can
also be determined:>>>nodes2=np.asfortranarray([...[0.0,0.25,0.5,0.75,1.0],...[0.0,2.0,-2.0,2.0,0.0],...])>>>curve2=bezier.Curve.from_nodes(nodes2)>>>intersections=curve1.intersect(curve2)>>>intersectionsarray([[0.31101776,0.68898224,0.,1.],[0.31101776,0.68898224,0.,1.]])>>>s_vals=np.asfortranarray(intersections[0,:])>>>points=curve1.evaluate_multi(s_vals)>>>pointsarray([[0.31101776,0.68898224,0.,1.],[0.42857143,0.42857143,0.,0.]])and then we can plot these curves (along with their
intersections):>>>importseaborn>>>seaborn.set()>>>>>>ax=curve1.plot(num_pts=256)>>>_=curve2.plot(num_pts=256,ax=ax)>>>lines=ax.plot(...points[0,:],points[1,:],...marker="o",linestyle="None",color="black")>>>_=ax.axis("scaled")>>>_=ax.set_xlim(-0.125,1.125)>>>_=ax.set_ylim(-0.0625,0.625)For API-level documentation, check out the Bézier Pythonpackagedocumentation.DevelopmentTo work on adding a feature or to run the functional tests, see theDEVELOPMENT docfor more information on how to get
started.CitationFor publications that usebezier, there is aJOSS paperthat can be
cited. The following BibTeX entry can be used:@article{Hermes2017,doi = {10.21105/joss.00267},url = {https://doi.org/10.21105%2Fjoss.00267},year = {2017},month = {Aug},publisher = {The Open Journal},volume = {2},number = {16},pages = {267},author = {Danny Hermes},title = {Helper for B{\'{e}}zier Curves, Triangles, and Higher Order Objects},journal = {The Journal of Open Source Software}}Aparticularversion of this library can be cited via a Zenodo DOI; see
a fulllist by version.Licensebezieris made available under the Apache 2.0 License. For more
details, seethe LICENSE.