贝塞尔曲线代码分析
1. 代码功能:
该代码用于计算和绘制贝塞尔曲线。
2. 代码解释:
2.1 函数
Bezier
:
- 该函数用于计算贝塞尔曲线在参数值
t
处的点坐标。- 输入参数:
t
: 参数值,范围为 [0, 1]points
: 控制点列表,控制点的个数决定了贝塞尔曲线的阶数- 输出:
- 贝塞尔曲线在参数值
t
处的点坐标2.2 函数
runBezier
:
- 该函数用于绘制贝塞尔曲线。
- 输入参数:
x
: x 方向控制点列表y
: y 方向控制点列表n
: 曲线段数,用于控制曲线的精度- 输出:
xs
: 贝塞尔曲线 x 坐标列表ys
: 贝塞尔曲线 y 坐标列表2.3 代码细节:
- 函数
Bezier
使用了递推公式计算贝塞尔基函数的值。- 函数
runBezier
使用np.linspace
函数生成参数值列表,然后使用Bezier
函数计算每个参数值处的点坐标,最后将这些点坐标连接起来形成贝塞尔曲线。3. 注意事项:
- 贝塞尔曲线的阶数由控制点的个数决定。控制点越多,曲线的阶数越高,曲线越平滑。
- 贝塞尔曲线的形状由控制点的位置决定。控制点的 x 坐标决定曲线的 x 方向形状,控制点的 y 坐标决定曲线的 y 方向形状。
4. 总结:
该代码提供了一种简单的方法来计算和绘制贝塞尔曲线。您可以修改代码来创建不同的贝塞尔曲线。
5. 测试效果(红色为控制节点,蓝线为内赛尔曲线):
附:完整源代码
import matplotlib.pyplot as plt
import numpy as np
# 贝塞尔曲线
def Bezier(t, points):
n = len(points) - 1 # n可以取到
res = 0
c = 1 # 基函数结果
for i in range(n+1): # n可以取到
if i > 0:
c = c * (n - i + 1) / i # 更新贝塞尔基函数的结果系数
_1_t = (1-t)**i # (1-t)^i
_t = t**(n-i) # t^(n-i)
res += c * _1_t * _t * points[i]
return res
def show(x, y, xs, ys, ax, plot_c='g',plot_c_2='b', scater_c='r'):
ax.plot(x, y, c=plot_c)
ax.scatter(x,y,color='r',marker='o', linewidths=4)
ax.scatter(x,y,color='w',marker='o', linewidths=1)
ax.plot(xs, ys, c=plot_c_2)
for i in range(len(x)):
ax.annotate(f'{x[i]}, {y[i]}', (x[i]+0.2, y[i]-0.2))
def runBezier(x, y, n=100):
xs = []
ys = []
for u in np.linspace(0, 1, num=n):
xs.append(Bezier(u, points=x))
ys.append(Bezier(u, points=y))
return xs, ys
if __name__ == '__main__':
x = [0, 3, 4, 10, 5, 6]
y = [0, 6, 10, 0, 5, 3]
nodeVector = [0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1]
fig, axs = plt.subplots(2, 2)
xs, ys = runBezier(x, y)
show(x, y, xs, ys, axs[0, 0])
axs[0, 0].set_title('Bezier')
plt.tight_layout()
plt.show()