类型错误: 'float'对象不可被下标索引 (Python)

2024-06-16 08:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我想计算贝塞尔曲线,以近似三维形状的后视镜。基本上,我的想法是从一些控制点开始,这些控制点会给出第一条Bézier曲线B0的N个点,然后将这条曲线减少一个系数C(0<;C<;1),这样我就有了一条更小的曲线B1,它的重心与B0相同。然后,我将把两条曲线从2d移到3d,将两条曲线放置在预定的高度(B1为h,B0为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)

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

但当我试图执行这个大函数时(这里只展示了它的一部分,直接指向要点),它说:

^{pr2}$

所以我在网上查了一下,我发现很明显,当一个float被误认为是一个列表时,就会发生这种情况,例如,当x[0]和x一起输入float时,因为Python无法到达float的“第一个元素”。但是我检查了我的代码很多次,我不知道我在哪里做了这样的事情,所以我真的不知道错误是从哪里来的。在

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

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

这符合我的预期,所以很不幸我仍然不知道错误来自哪里。在


Tags: 代码in列表for错误rangefloatb0