日期:2024年10月2日
Python bezier 库超详细教程
bezier 是 Python 的一个第三方库,可以让我们方便地处理、绘制贝塞尔曲线。使用前需要用 pip 安装。
pip install bezier(使用国外的默认源,在国内使用下载速度慢)
pip install bezier -i https://pypi.tuna.tsinghua.edu.cn/simple(使用国内的清华镜像源,速度更快)
官方文档中给出的贝塞尔曲线公式中参数叫 s,但大多数说明中都用的是 t,本文中我选择直接称其“参数”。
目录
节点格式
bezier 库中节点的排列格式都是 [[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
,这么做是为了贴合 matplotlib 库画线时用的格式,而很多地方都是用 [[x1, y1, z1], [x2, y2, z2], ..., [xn, yn, zn]]
这种格式,我们可以通过解压序列轻松完成转换。
>>> # [[x, y]] 转 [[x], [y]]
>>> original = [[0.0, 0.0], [0.625, 0.5], [1.0, 0.5]]
>>> new = list(zip(*original))
>>> new
[(0.0, 0.625, 1.0), (0.0, 0.5, 0.5)]
>>> # [[x], [y]] 转 [[x, y]]
>>> original = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> new = list(zip(*original))
>>> new
[(0.0, 0.0), (0.625, 0.5), (1.0, 0.5)]
curve 模块 - 贝塞尔曲线
curve 模块包含用于处理贝塞尔曲线的功能。
类
Curve(nodes, degree, copy=True, verify=True)
代表一条贝塞尔曲线。
参数:
- nodes (Sequence Sequence numbers.Number):曲线控制点。参数为一个可以转化成多维 NumPy 数组的序列,格式为
[[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
,节点按从起点至终点排序。 - degree (int):曲线维度。
- copy (bool):此为官方文档解释,作者暂不清楚实际作用:存储曲线前是否复制节点,指定为 True 后调用者可能会在传参后自由改变节点。
- verify (bool):是否根据节点数验证阶数是否正确。
>>> import bezier
>>> # 二维贝塞尔曲线
>>> nodes1 = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve1 = bezier.Curve(nodes, 2)
>>> curve1
<Curve (degree=2, dimension=2)>
>>> # 阶数错误,因为 verify=False 所以不报错
>>> curve2 = bezier.Curve(nodes, 2, verify=False)
>>> curve2
<Curve (degree=2, dimension=2)>
>>> # 三维贝塞尔曲线
>>> nodes2 = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve3 = bezier.Curve(nodes, 2)
>>> curve3
<Curve (degree=2, dimension=2)>

方法
Curve.from_nodes(nodes, copy=True)
通过节点创建一条贝塞尔曲线,无需指定阶数。
参数:
- nodes (Sequence Sequence numbers.Number):曲线控制点。参数为一个可以转化成多维 NumPy 数组的序列,格式为
[[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
,按从起点至终点排序。 - copy (bool):此为官方文档解释,作者暂不清楚实际作用:存储曲线前是否复制节点,指定为 True 后调用者可能会在传参后自由改变节点。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve.from_nodes(nodes)
>>> curve
<Curve (degree=2, dimension=2)>
Curve.copy() -> Curve
复制一条贝塞尔曲线。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve.from_nodes(nodes)
>>> curve
<Curve (degree=2, dimension=2)>
>>> copy = curve.copy()
>>> copy
<Curve (degree=2, dimension=2)>
Curve.evaluate(s) -> numpy.ndarray
求出曲线上参数为 s 的点的坐标。
参数:
- s (float):曲线参数。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> point = curve.evaluate(0.5)
>>> point
array([[0.5625],
[0.375 ]])

Curve.evaluate_multi(s_vals) -> numpy.ndarray
求出曲线上的 s_vals 内多个参数的点的坐标,返回值格式为 [[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
。
参数:
- s_vals (numpy.ndarray):多个曲线参数。参数是一个一维 NumPy 浮点数数组。

>>> import bezier
>>> import numpy as np
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve.from_nodes(nodes)
>>> s_vals = np.linspace(0.0, 1.0, 5)
>>> points = curve.evaluate_multi(s_vals)
>>> points
array([[0. , 0.296875, 0.5625 , 0.796875, 1. ],
[0. , 0.21875 , 0.375 , 0.46875 , 0.5 ]])
Curve.evaluate_hodograph(s) -> numpy.ndarray
求出曲线上参数为s的点的切向量,即 \((x_{起点}-x_{终点},y_{起点}-y_{终点})\)。
参数:
- s (float):曲线参数。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> vector = curve.evaluate_hodograph(0.5)
>>> vector
array([[1. ],
[0.5]])

Curve.plot(num_pts, color=None, alpha=None, ax=None) -> matplotlib.artist.Artist
将曲线绘制到 matplotlib 图表上。曲线必须是二维,否则会触发 NotImplementedError。
此方法需要 matplotlib 库。
参数:
- num_pts (int):要绘制的点的数量。
- color (tuple float, float, float / str):RGB 格式的曲线颜色或 matplotlib 内置颜色名,\(0<R,G,B<1\)。
- alpha (float):曲线透明度,\(alpha\in [0,1]\)。
- ax (matplotlib.artist.Artist):把曲线绘制在哪个 axes 上。
>>> import bezier
>>> import matplotlib.pyplot as plt
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> x, y = curve.evaluate(0.5)
>>> # 直接用 plt 快速画一条曲线
>>> curve.plot(100, color='red', alpha=0.5)
<Axes: >
>>> plt.plot(x, y, marker='o')
[<matplotlib.lines.LineD object at ( 内存地址 )>]
>>> plt.show()

>>> # 单独操作 axes,把多条曲线画在同一图表上
>>> nodes1 = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve1 = bezier.Curve(nodes1, 2)
>>> nodes2 = [[0.6, 0.7, 0.6], [0.0, 0.5, 1.0]]
>>> curve2 = bezier.Curve(nodes2, 2)
>>> fig, ax = plt.subplots()
>>> curve1.plot(100, ax=ax)
<Axes: >
>>> curve2.plot(100, ax=ax)
<Axes: >
>>> ax.plot(x, y, marker='o')
[<matplotlib.lines.LineD object at ( 内存地址 )>]
>>> plt.show()

Curve.subdivide() -> tuple Curve
将曲线从正中间分为两部分。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> left, right = curve.subdivide()
>>> left, right
<Curve (degree=2, dimension=2)> <Curve (degree=2, dimension=2)>

Curve.intersect(other, strategy=IntersectionStrategy.GEOMETRIC, verify=True) -> numpy.ndarray
求出两条曲线的交点在两条曲线上的参数值,如果没有交点则返回值为空。当 verify=True 且两条线不都是二维曲线时,会触发 NotImplementedError。
参数:
- other (Curve):与之相交的贝赛尔曲线。
- stategy (bool):计算交点的算法,参数为 IntersectionStrategy.GEOMETRIC 或 IntersectionStrategy.Algebra。
- verify (bool):是否用额外的警告验证语句。当 verify=True 且两条线不都是二维曲线时,会触发 NotImplementedError。
>>> import bezier
>>> import numpy as np
>>> nodes1 = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve1 = bezier.Curve(nodes1, 2)
>>> nodes2 = [[0.6, 0.7, 0.6], [0.0, 0.5, 1.0]]
>>> curve2 = bezier.Curve(nodes2, 2)
>>> s_vals = curve1.intersect(curve2)
>>> s_vals
array([[0.58799506],
[0.41512597]])
>>> s_vals = np.array(s_vals[0])
>>> intersections = list(zip(*curve1.evaluate_multi(s_vals)))
>>> intersections
[(np.float64(0.6485592796603902), np.float64(0.41512596570181837))]

Curve.self_intersections(strategy=IntersectionStrategy.GEOMETRIC, verify=True) -> numpy.ndarray
求出一条曲线的自我相交点在曲线上的参数值,如果没有自我相交点则返回值为空。
参数:
- stategy (bool):计算交点的算法,参数必须为 IntersectionStrategy.GEOMETRIC,否则会触发 NotImplementedError。
- verify (bool):是否用额外的警告验证语句。当 verify=True 且曲线不是二维时,会触发 NotImplementedError。
>>> import bezier
>>> import numpy as np
>>> nodes = [[-300.0, 227.5, -730.0, 0.0, 730.0, -227.5, 300.0], [150.0, 953.75, -2848.0, 4404.75, -2848.0, 953.75, 150.0]]
>>> curve = bezier.Curve(nodes, 6)
>>> s_vals = curve.self_intersections()
>>> s_vals
array([[0.16666667, 0.66666667],
[0.33333333, 0.83333333]])
>>> s_vals = np.array(s_vals[0])
>>> intersections = list(zip(*curve.evaluate_multi(s_vals)))
>>> intersections
[(np.float64(-149.99999999999997), np.float64(74.99999999999989)), (np.float64(150.0), np.float64(74.99999999999991))]

Curve.elevate() -> Curve
在保持曲线不变形的情况下将曲线升高一阶。
>>> import bezier
>>> nodes = [[0.0, 1.5, 3.0], [0.0, 1.5, 0.0]]
>>> curve = bezier.Curve(nodes, 2)
>>> curve
<Curve (degree=2, dimension=2)>
>>> elevated = curve.elevate()
>>> elevated
<Curve (degree=3, dimension=2)>

Curve.reduce_() -> Curve
将曲线降低一阶,不是所有曲线都能在降阶后保持不变形。
>>> import bezier
>>> # 降阶后不变形
>>> nodes = [[-3.0, 0.0, 1.0, 0.0], [3.0, 2.0, 3.0, 6.0]]
>>> curve = bezier.Curve(nodes, 3)
>>> curve
<Curve (degree=3, dimension=2)>
>>> reduced = curve.reduce_()
>>> reduced
<Curve (degree=2, dimension=2)>
>>> # 降阶后变形
>>> nodes = [[0.0, 1.5, 3.0], [0.0, 1.5, 0.0]]
>>> curve = bezier.Curve(nodes, 2)
>>> curve
<Curve (degree=2, dimension=2)>
>>> reduced = curve.reduce_()
>>> reduced
<Curve (degree=1, dimension=2)>


Curve.specialize(start, end) -> Curve
截取曲线上参数在 start 与 end 间的部分。
参数:
- start (float):参数范围最小值。
- end (float):曲线参数范围最大值。
>>> import bezier
>>> nodes = [[-3.0, 0.0, 1.0, 0.0], [3.0, 2.0, 3.0, 6.0]]
>>> curve = bezier.Curve(nodes, 3)
>>> curve
<Curve (degree=3, dimension=2)>
>>> slice = curve.specialize(0.2, 0.7)
>>> slice
<Curve (degree=3, dimension=2)>

Curve.locate(point) -> Optional float
求出曲线上某一点的参数,如果点不在曲线上则返回值为空。
参数:
- point (numpy.ndarray):点的坐标,格式为
[[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
。
>>> import bezier
>>> import numpy as np
>>> nodes = [[-3.0, 0.0, 1.0, 0.0], [3.0, 2.0, 3.0, 6.0]]
>>> curve = bezier.Curve(nodes, 3)
>>> point = np.array([[-0.84], [2.64]])
>>> s = curve.locate(point)
>>> s # 计算结果会有浮点数误差
0.29999999999992016

Curve.to_symbolic() -> sympy.Matrix
求出曲线的参数方程,返回矩阵 \(\begin{bmatrix} x\\y\end{bmatrix}\)。
此方法需要 SymPy 库。
>>> import bezier
>>> import sympy
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> matrix = curve.to_symbolic()
>>> matrix
Matrix([
[-s*(s - 5)/4],
[-s*(s - 2)/2]])

Curve.implicitize() -> sympy.Expr
求出表示曲线的函数。曲线必须是二维,否则会触发 NotImplementedError。
此方法需要 SymPy 库。
>>> import bezier
>>> nodes = [[-3.0, 0.0, 1.0, 0.0], [3.0, 2.0, 3.0, 6.0]]
>>> curve = bezier.Curve(nodes, 3)
>>> f = curve.implicitize()
>>> f
36*(x**2 + 2*x*y - 3*x + y**2 - 9*y + 18)

属性
Curve.length -> float
曲线的长度。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> length = curve.length
>>> length
1.1362104785667901
Curve.degree -> int
曲线的阶数。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> degree = curve.degree
>>> degree
2
Curve.dimension -> int
曲线的维度。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> dimension = curve.dimension
>>> dimension
2
Curve.nodes -> numpy.ndarray
曲线的节点。
>>> import bezier
>>> nodes = [[0.0, 0.625, 1.0], [0.0, 0.5, 0.5]]
>>> curve = bezier.Curve(nodes, 2)
>>> nodes = curve.nodes
>>> nodes
array([[0. , 0.625, 1. ],
[0. , 0.5 , 0.5 ]])
curved_polygon 模块 - 贝塞尔曲线边多边形
curve_polygon 模块可以帮我们处理边是贝塞尔曲线的多边形。
类
CurvedPolygon(*edges, **kwargs)
代表一条边是贝塞尔曲线的多边形。
参数:
- edges (tuple Curve):多边形的边。
- kwargs:此关键词接受两个参数:
- metadata (Sequence):此为官方文档解释,作者暂不清楚实际作用:与此曲边多边形有关联的三元组序列,这是为了供已创建弯曲多边形作为两个贝塞尔三角形之间的交点的调用者使用。
- verify (bool):是否验证边的两个末端是否为公共点。
>>> import bezier
>>> edges = [
... [[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]],
... [[2.0, 2.0], [0.0, 1.0]],
... [[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]],
... [[0.0, 0.0], [1.0, 0.0]]
... ]
>>> edge1, edge2, edge3, edge4 = list(map(lambda edge: bezier.Curve.from_nodes(edge), edges))
>>> polygon = bezier.CurvedPolygon(edge1, edge2, edge3, edge4)
>>> polygon
<CurvedPolygon (num_sides=4)>

方法
CurvedPolygon.plot(pts_per_edge, color=None, ax=None, alpha=0.625) -> matplotlib.artist.Artist
将多边形绘制到 matplotlib 图表上。多边形必须是二维,否则会触发 NotImplementedError。
此方法需要 matplotlib 库。
参数:
- pts_per_edge (int):多边形每条边要绘制的点的数量。
- color (tuple float, float, float / str):RGB 格式的多边形边框颜色或 matplotlib 内置颜色名,\(R,G,B\in [0,1]\)。
- ax (matplotlib.artist.Artist):把多边形绘制在哪个 axes 上。
- alpha (float):多边形内部填充透明度,\(alpha\in [0,1]\)。
>>> import bezier
>>> import matplotlib.pyplot as plt
>>> edges1 = [
... [[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]],
... [[2.0, 2.0], [0.0, 1.0]],
... [[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]],
... [[0.0, 0.0], [1.0, 0.0]]
... ]
>>> edges2 = [
... [[0.0, 1.0], [0.0, 0.0]],
... [[1.0, 1.25, 1.0], [0.0, 0.5, 1.0]],
... [[1.0, 2.0], [1.0, 1.0]],
... [[2.0, 1.0, 0.0], [1.0, 0.75, 0.0]]
... ]
>>> edge1, edge2, edge3, edge4 = list(map(lambda edge: bezier.Curve.from_nodes(edge), edges1))
>>> edge5, edge6, edge7, edge8 = list(map(lambda edge: bezier.Curve.from_nodes(edge), edges2))
>>> polygon1 = bezier.CurvedPolygon(edge1, edge2, edge3, edge4)
>>> polygon2 = bezier.CurvedPolygon(edge5, edge6, edge7, edge8)
>>> fig, ax = plt.subplots()
>>> polygon1.plot(50, ax=ax, color=(0, 0, 0), alpha=0.8)
<Axes: >
>>> polygon2.plot(50, ax=ax)
<Axes: >
>>> plt.show()

属性
CurvedPolygon.num_sides -> int
多边形的边数。
>>> import bezier
>>> edges = [
... [[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]],
... [[2.0, 2.0], [0.0, 1.0]],
... [[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]],
... [[0.0, 0.0], [1.0, 0.0]]
... ]
>>> edge1, edge2, edge3, edge4 = list(map(lambda edge: bezier.Curve.from_nodes(edge), edges))
>>> polygon = bezier.CurvedPolygon(edge1, edge2, edge3, edge4)
>>> num_sides = polygon.num_sides
>>> num_sides
4
CurvedPolygon.area -> float
多边形的面积。
>>> import bezier
>>> edges = [
... [[0.0, 1.0, 2.0], [0.0, -1.0, 0.0]],
... [[2.0, 2.0], [0.0, 1.0]],
... [[2.0, 1.0, 0.0], [1.0, 2.0, 1.0]],
... [[0.0, 0.0], [1.0, 0.0]]
... ]
>>> edge1, edge2, edge3, edge4 = list(map(lambda edge: bezier.Curve.from_nodes(edge), edges))
>>> polygon = bezier.CurvedPolygon(edge1, edge2, edge3, edge4)
>>> area = polygon.area
>>> area
3.333333333333333
triangle 模块 - 贝塞尔曲线边三角形
triangle 模块可以帮我们处理贝塞尔曲线边的三角形。
类
Triangle(nodes, degree, copy=True, verify=True)
代表一条贝塞尔曲线边三角形。设阶数为 \(d\),则节点为 \(N_1,N_2,N_3,\cdots ,N_{3d}\),其中 \(N_1,N_{d+1},N_{2d+1}\) 为三角形的角。
参数:
- nodes (Sequence Sequence numbers.Number):三角形曲线边控制点。参数为一个可以转化成多维 NumPy 数组的序列,格式为
[[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
,节点按从起点至终点排序。 - degree (int):三角形每条边的维度。
- copy (bool):此为官方文档解释,作者暂不清楚实际作用:存储三角形前是否复制节点,指定为 True 后调用者可能会在传参后自由改变节点。
- verify (bool):是否根据节点数验证阶数是否正确。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> triangle
<Triangle (degree=2, dimension=2)>

方法
以下几个方法作者还没研究懂,请自行查阅 官方文档:
- Triangle.evaluate_barycentric(lambda, lambda, lambda, verify=True) -> numpy.ndarray
- Triangle.evaluate_barycentric_multi(param_vals, verify=True) -> numpy.ndarray
- Triangle.evaluate_cartesian(s, t, verify=True) -> numpy.ndarray
- Triangle.evaluate_cartesian_multi(param_vals, verify=True) -> numpy.ndarray
- Triangle.locate(point, verify=True) -> Optional tuple float,float
- Triangle.to_symbolic() -> sympy.Matrix
- Triangle.implicitize() -> sympy.Expr
Triangle.from_nodes(nodes, copy=True)
通过节点创建一条贝塞尔曲线边三角形,无需指定阶数。
参数:
- nodes (Sequence Sequence numbers.Number):三角形控制点。参数为一个可以转化成多维 NumPy 数组的序列,格式为
[[x1, x2, ..., xn], [y1, y2, ..., yn], [z1, z2, ..., zn]]
,按从起点至终点排序。 - copy (bool):此为官方文档解释,作者暂不清楚实际作用:存储三角形前是否复制节点,指定为 True 后调用者可能会在传参后自由改变节点。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle.from_nodes(nodes)
>>> triangle
<Triangle (degree=2, dimension=2)>
Triangle.plot(pts_per_edge, color=None, ax=None, with_nodes=False, alpha=0.625) -> matplotlib.artist.Artist
将三角形绘制到 matplotlib 图表上。三角形必须是二维,否则会触发 NotImplementedError。
此方法需要 matplotlib 库。
参数:
- pts_per_edge (int):三角形每条边要绘制的点的数量。
- color (tuple float, float, float / str):RGB 格式的多边形边框颜色或 matplotlib 内置颜色名,\(0<R,G,B<1\)。
- ax (matplotlib.artist.Artist):把三角形绘制在哪个 axes 上。
- with_nodes (bool):是否绘制控制点。
- alpha (float):三角形透明度,\(alpha\in [0,1]\)。
>>> import bezier
>>> import matplotlib.pyplot as plt
>>> nodes1 = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle1 = bezier.Triangle(nodes1, 2)
>>> nodes2 = [[0.0, 1.0, 2.0, -1.5, -0.5, -3.0], [0.0, 0.75, 1.0, 1.0, 1.5, 2.0]]
>>> triangle2 = bezier.Triangle(nodes2, 2)
>>> fig, ax = plt.subplots()
>>> triangle1.plot(50, ax=ax, alpha=0.8)
<Axes: >
>>> triangle2.plot(50, ax=ax, with_nodes=True)
<Axes: >
>>> plt.show()

Triangle.subdivide() -> tuple Triangle,Triangle,Triangle,Triangle
将三角形分为四个小三角形。设三角形的三个节点是 \(N_1,N_2,N_3\),共三条曲线 \(N_1N_2,N_2N_3,N_1N_3\),三条曲线上参数为 0.5 的点分别为 \(M_1,M_2,M_3\),四个小三角形就是 \(\triangle N_1M_1M_3,\triangle N_2M_1M_2,\triangle N_3M_2M_3,\triangle M_1M_2M_3\)。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> triangles = triangle.subdivide()
>>> triangles
(<Triangle (degree=2, dimension=2)>, <Triangle (degree=2, dimension=2)>, <Triangle (degree=2, dimension=2)>, <Triangle (degree=2, dimension=2)>)

Triangle.intersect(other, strategy=IntersectionStrategy.GEOMETRIC, verify=True) -> list Union CurvedPolygon,Triangle
求出两个三角形的相交区域。
参数:
- other (Curve):与之相交的三角形。
- stategy (bool):计算相交区域的算法,参数为 IntersectionStrategy.GEOMETRIC 或 IntersectionStrategy.Algebra。
- verify (bool):是否用额外的警告验证语句。当 verify=True 且两个三角形不都是二维三角形时,会触发 NotImplementedError。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> nodes = [[0.0, 1.0, 2.0, -1.5., -0.5., -3.0.], [0.0, 0.75, 1.0, 1.0, 1.5, 2.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> intersection = triangle.intersect(triangle)
>>> intersection
[<CurvedPolygon (num_sides=3)>]

Triangle.elevate() -> Triangle
在保持三角形不变形的情况下将曲线的每条边升高一阶。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> triangle
<Triangle (degree=2, dimension=2)>
>>> elevated = triangle.elevate()
>>> elevated
<Triangle (degree=3, dimension=2)>

属性
Triangle.area -> float
三角形的面积。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> area = triangle.area
>>> area
0.3854166666666667
Triangle.edges -> tuple Curve,Curve,Curve
三角形的三边。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> edges = triangle.edges
>>> edges
(<Curve (degree=2, dimension=2)>, <Curve (degree=2, dimension=2)>, <Curve (degree=2, dimension=2)>)
Triangle.is_valid -> bool
作者还没研究懂,请自行查阅 官方文档。
Curve.degree -> int
三角形每边的阶数。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> degree = triangle.degree
>>> degree
2
Curve.dimension -> int
三角形的维度。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> dimension = triangle.dimension
>>> dimension
2
Curve.nodes -> numpy.ndarray
三角形的节点。
>>> import bezier
>>> nodes = [[0.0, 0.5, 1.0, 0.125, 0.375, 0.25], [0.0, 0.0, 0.25, 0.5, 0.375, 1.0]]
>>> triangle = bezier.Triangle(nodes, 2)
>>> nodes = triangle.nodes
>>> nodes
array([[0. , 0.5 , 1. , 0.125, 0.375, 0.25 ],
[0. , 0. , 0.25 , 0.5 , 0.375, 1. ]])