我有一个项目,我想计算贝塞尔曲线,以近似三维形状的后视镜。基本上,我的想法是从一些控制点开始,这些控制点会给出第一条Bézier曲线B0的N个点,然后将这条曲线减少一个系数C(0<;C<;1),这样我就有了一条更小的曲线B1,它的重心与B0相同。然后,我将把两条曲线从2d移到3d,将两条曲线放置在预定的高度(B1为h,B0为0)。我已经对其进行了编码,如下所示:
所以现在我想画一条曲线,把第一条曲线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](这样我可以确定这些值确实存在),分别得到:
这符合我的预期,所以很不幸我仍然不知道错误来自哪里。在