编程新手用Python绘制贝塞尔曲线遇numpy形状不匹配报错如何解决
报错原因拆解
- 触发
ValueError的核心是numpy 广播规则 不满足:- 你定义的A/B/C是普通Python元组,对应维度为
(2,),分别存储[x坐标, y坐标]两个值 - 你生成的参数t维度为
(10,),是10个从0到1的步长取值 - 直接相乘时,两个一维数组长度分别为2和10,既不相等也没有维度长度为1的匹配项,numpy无法自动对齐计算,因此抛出广播错误。
- 你定义的A/B/C是普通Python元组,对应维度为
调整思路
不需要改动你原本的贝塞尔分步插值逻辑,只需要调整维度满足广播规则即可:将t转为列向量格式(形状(10,1)),和形状为(2,)的控制点计算时,numpy会自动扩展成10行2列的矩阵,每一行对应一个t值下的坐标结果。
修正后可直接运行的代码
import numpy as np A=(10,20) B=(30,40) C=(5,60) t=np.arange(0.0, 1.0, 0.1) # 新增维度转换,将t转为列向量,适配坐标计算 t = t[:, np.newaxis] # 以下计算逻辑和你原本编写的完全一致 P0 = A * t + (1 - t) * B P1 = B * t + (1 - t) * C Pfinal = P0 * t + (1 - t) * P1 print(Pfinal)
补充:曲线可视化实现
如果需要直观看到贝塞尔曲线,安装matplotlib库后追加以下代码即可:
import matplotlib.pyplot as plt # 绘制贝塞尔曲线连线 plt.plot(Pfinal[:, 0], Pfinal[:, 1]) # 标出三个原始控制点 plt.scatter([A[0], B[0], C[0]], [A[1], B[1], C[1]], color='red') plt.show()
内容的提问来源于stack exchange,提问作者Aggelos Vassilakos
相关产品推荐
相关产品推荐

