TypeError:'float'对象不可订阅(Python)

时间:2017-11-11 15:52:45

标签: python matplotlib bezier

我有一个项目,我想计算Bézier曲线,以近似后视镜的3d形状。基本上,我的想法是从一些控制点开始,这些控制点将给出第一个Bézier曲线B0的N个点,然后用系数C(0

2d Bézier curves in 3d

所以现在我想绘制将第一条曲线B0的每个点连接到缩小曲线B1的曲线,并使整个看起来或多或少像后视镜。为此,我认为由于B0和B1上每个对应点之间的距离始终相同,我可以使用连接这些点的每个点的双射f。现在,这个双射的曲线可以通过叠加m(m | | N *)中间曲线来近似(这些曲线不会出现在最终的曲线中),随着f的减小系数减小。

(旁注:我知道使用Poly3dCollection会给我一个更好的结果,但我已经尝试了它并且它不起作用,显然是因为我无法理解的副作用)

但是代码的这一部分有一个错误:

B= [B0]
B += [bezier_reduit(pts, N, d*(m - phi)/m) for phi in F if (phi != 0) if (phi != d)]
B += B1
for j in range(N+1):        
    ax.plot([B[i][j][0] for i in range(m+1)], [B[i][j][1] for j in range(m+1)], F)

我将点表示为2个浮点数[x,y]的列表,因此像B0和B1这样的Bézier曲线是浮点数列表的列表,B是Bézier曲线的列表,因此它是浮点数列表的列表。 F是浮点数列表,给出每个点的z坐标。代码的这一部分应该绘制两条连续曲线之间的每一条线,这样它最终看起来或多或少像连接B0和B1的函数f。

但是当我尝试执行大函数时(这里只显示部分内容直接指向这一点),它说:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "F:\TIPE\Programmes\Programme final\bezier.py", line 157, in retro_line
ax.plot([B[i][j][0] for i in range(m+1)], [B[i][j][1] for i in range(m+1)], F)
File "F:\TIPE\Programmes\Programme final\bezier.py", line 157, in <listcomp>
ax.plot([B[i][j][0] for i in range(m+1)], [B[i][j][1] for i in range(m+1)], F)
TypeError: 'float' object is not subscriptable

所以我在网上看了一下,我发现显然,当浮动被误认为是一个列表时会发生这种情况,所以例如当输入类似xa float的x [0]之类的东西时因为Python无法到达“浮动元素。但是我多次检查了我的代码,我无法看到我做了这样的事情,所以我真的不知道错误的来源。

编辑:我检查了B,B [0],B [0] [0]和B [0] [0] [0]的类型(所以我可以确定这个值实际存在)使用print(类型) (x))并分别得到:

<class 'list'>
<class 'list'>
<class 'list'>
<class 'float'>

这符合我的期望,所以不幸的是我仍然不知道错误的来源。

0 个答案:

没有答案