Helper for Bézier Curves, Triangles, and Higher Order Objects

## Project description

Helper for Bézier Curves, Triangles, and Higher Order Objects

This library provides:

Dive in and take a look!

## Why Bézier?

A Bézier curve (and surface, etc.) is a parametric curve that uses the Bernstein 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 weights s and 1 - s).

Due to their simple form, Bézier curves:

• can easily model geometric objects as parametric curves, surfaces, etc.

• can be computed in an efficient and numerically stable way via de Casteljau’s algorithm

• can utilize convex optimization techniques for many algorithms (such as curve-curve intersection), since curves (and surfaces, etc.) are convex combinations of the basis

Many applications – as well as the history of their development – are described in “The Bernstein polynomial basis: A centennial retrospective”, for example;

• aids physical analysis using finite element methods (FEM) on isogeometric models by using geometric shape functions called NURBS to represent data

• used in robust control of dynamic systems; utilizes convexity to create a hull of curves

## Installing

bezier can be installed with pip:

$python -m pip install --upgrade bezier$ python2.7 -m pip install --upgrade bezier
\$ python3.6 -m pip install --upgrade bezier

bezier is open-source, so you can alternatively grab the source code from GitHub and install from source.

## Getting Started

For example, to create a curve:

>>> nodes1 = np.asfortranarray([
...     [0.0, 0.0],
...     [0.5, 1.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.0],
...     [0.25,  2.0],
...     [0.5 , -2.0],
...     [0.75,  2.0],
...     [1.0 ,  0.0],
... ])
>>> curve2 = bezier.Curve.from_nodes(nodes2)
>>> intersections = curve1.intersect(curve2)
>>> intersections
array([[0.31101776, 0.31101776],
[0.68898224, 0.68898224],
[0.        , 0.        ],
[1.        , 1.        ]])
>>> s_vals = intersections[:, 0]
>>> points = curve1.evaluate_multi(s_vals)
>>> points
array([[0.31101776, 0.42857143],
[0.68898224, 0.42857143],
[0.        , 0.        ],
[1.        , 0.        ]])

and then we can plot these curves (along with their intersections):

>>> import matplotlib.pyplot as plt
>>> import seaborn
>>> 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)
>>> plt.show()

For API-level documentation, check out the Bézier Package documentation.

## Development

To work on adding a feature or to run the functional tests, see the DEVELOPMENT doc for more information on how to get started.

## Project details

### Source Distribution

bezier-0.6.1.tar.gz (778.9 kB view hashes)

Uploaded Source

### Built Distributions

bezier-0.6.1-cp36-none-win_amd64.whl (923.6 kB view hashes)

Uploaded CPython 3.6 Windows x86-64

bezier-0.6.1-cp36-none-win32.whl (882.6 kB view hashes)

Uploaded CPython 3.6 Windows x86

bezier-0.6.1-cp36-cp36m-manylinux1_x86_64.whl (2.8 MB view hashes)

Uploaded CPython 3.6m

bezier-0.6.1-cp36-cp36m-manylinux1_i686.whl (2.5 MB view hashes)

Uploaded CPython 3.6m

bezier-0.6.1-cp36-cp36m-macosx_10_6_intel.whl (3.7 MB view hashes)

Uploaded CPython 3.6m macOS 10.6+ intel

bezier-0.6.1-cp35-none-win_amd64.whl (918.0 kB view hashes)

Uploaded CPython 3.5 Windows x86-64

bezier-0.6.1-cp35-none-win32.whl (879.1 kB view hashes)

Uploaded CPython 3.5 Windows x86

bezier-0.6.1-cp35-cp35m-manylinux1_x86_64.whl (2.8 MB view hashes)

Uploaded CPython 3.5m

bezier-0.6.1-cp35-cp35m-manylinux1_i686.whl (2.5 MB view hashes)

Uploaded CPython 3.5m

bezier-0.6.1-cp35-cp35m-macosx_10_6_intel.whl (3.7 MB view hashes)

Uploaded CPython 3.5m macOS 10.6+ intel

bezier-0.6.1-cp27-none-win_amd64.whl (937.1 kB view hashes)

Uploaded CPython 2.7 Windows x86-64

bezier-0.6.1-cp27-none-win32.whl (901.4 kB view hashes)

Uploaded CPython 2.7 Windows x86

bezier-0.6.1-cp27-cp27mu-manylinux1_x86_64.whl (2.7 MB view hashes)

Uploaded CPython 2.7mu

bezier-0.6.1-cp27-cp27mu-manylinux1_i686.whl (2.4 MB view hashes)

Uploaded CPython 2.7mu

bezier-0.6.1-cp27-cp27m-manylinux1_x86_64.whl (2.7 MB view hashes)

Uploaded CPython 2.7m

bezier-0.6.1-cp27-cp27m-manylinux1_i686.whl (2.4 MB view hashes)

Uploaded CPython 2.7m

bezier-0.6.1-cp27-cp27m-macosx_10_6_intel.whl (3.8 MB view hashes)

Uploaded CPython 2.7m macOS 10.6+ intel