考虑几个变量
先把问题简化
- 正圆化
- 纸带自旋角度变化均匀化
- 我们仅仅考虑其中一条边的这条线的位置变化
说明: 因为你在知道其中一条边的变化后, 根据宽度变化的关系, 只要调整宽度的这个变量就可以推算出其他所有的情况。
只考虑二维的俯视能看到的东西, 因为我们只考虑其中一条边的变化, 所以我们这里可以考虑D或者E 的其中一点,
由上图我们可以知道, 整个纸带绕中心转了一圈
所以围绕中心旋转的角度是
我们把这个值设为
通过实验过程我们知道
纸袋只是旋转了半圈儿 也就是
我们把这个值设为
也就是说, 纸袋整体在围绕中心转一圈的时候, 只带自身纸旋转了半圈。
根据我们之前的假设纸带自旋是均匀旋转
所以我们可以推出:
下面我们考虑上纸带的宽度w 和 纸带距离中心的半径r
因为这两个变量是根据你纸带的选取来确定的 我们记为常量w, r, 因为我们只考虑一条边, 所以我们这里只是讨论右边的红点, 我们假设在没有旋转的时候,中心和离近边的距离是d。

我们可以推导出:
这是一种在二维坐标系内极坐标的表示方法
换成正交坐标系后, 应该表示为
然后我们考虑z坐标,
实际上, z坐标对应的数据, 只于纸带的宽度和自旋的角度有关系
到目前为止,我们已经求出来, 仅仅是一条边的三维坐标的函数关系式
我们在已知一条边的计算方法后, 剩下的, 可以交给程序来推演, 因为原理是不变的,只是改变了一些数据。
理解代码的关键就是: 代码实际上就是挑几个点计算, 下面的代码从纸带上均匀挑出来了 240个点, 计算出来这240个点后做一下平滑处理就好了。
# 导入包照抄就可以import numpy as npfrom matplotlib.tri import Triangulationimport matplotlib.pyplot as pltfrom mpl_toolkits import mplot3d# 中心角 分成三十个计算三十遍alpha = np.linspace(0, 2 * np.pi, 30)# 自旋角 中心角的 1/2beta = 0.5 * theta# 宽度分成八份w = np.linspace(-0.25, 0.25, 8)# 这一步结合w和alpha计算了 240个点w, theta = np.meshgrid(w, alpha)# 极坐标 ---> 正交坐标变化, ravel的意思是高维数组扁平化, 程序内部操作不影响整体原理理解r = 1 + w * np.cos(phi)x = np.ravel(r * np.cos(alpha))y = np.ravel(r * np.sin(alpha))z = np.ravel(w * np.sin(phi))## 下面就是画图的细节tri = Triangulation(np.ravel(w), np.ravel(alpha))ax = plt.axes(projection='3d')ax.plot_trisurf(x, y, z, triangles=tri.triangles,cmap='viridis', linewidths=0.2);ax.set_xlim(-1, 1); ax.set_ylim(-1, 1); ax.set_zlim(-1, 1);
效果图

