考虑几个变量

先把问题简化

  • 正圆化
  • 纸带自旋角度变化均匀化
  • 我们仅仅考虑其中一条边的这条线的位置变化

    说明: 因为你在知道其中一条边的变化后, 根据宽度变化的关系, 只要调整宽度的这个变量就可以推算出其他所有的情况。

只考虑二维的俯视能看到的东西, 因为我们只考虑其中一条边的变化, 所以我们这里可以考虑D或者E 的其中一点,
image.png

由上图我们可以知道, 整个纸带绕中心转了一圈

所以围绕中心旋转的角度是 Mobius - 图2
我们把这个值设为Mobius - 图3

通过实验过程我们知道

纸袋只是旋转了半圈儿 也就是 Mobius - 图4
我们把这个值设为Mobius - 图5

也就是说, 纸袋整体在围绕中心转一圈的时候, 只带自身纸旋转了半圈。

根据我们之前的假设纸带自旋是均匀旋转

所以我们可以推出:
Mobius - 图6

下面我们考虑上纸带的宽度w 和 纸带距离中心的半径r

因为这两个变量是根据你纸带的选取来确定的 我们记为常量w, r, 因为我们只考虑一条边, 所以我们这里只是讨论右边的红点, 我们假设在没有旋转的时候,中心和离近边的距离是d。

image.png

我们可以推导出:

Mobius - 图8

这是一种在二维坐标系内极坐标的表示方法

换成正交坐标系后, 应该表示为
Mobius - 图9

然后我们考虑z坐标,

实际上, z坐标对应的数据, 只于纸带的宽度和自旋的角度有关系

Mobius - 图10

到目前为止,我们已经求出来, 仅仅是一条边的三维坐标的函数关系式

我们在已知一条边的计算方法后, 剩下的, 可以交给程序来推演, 因为原理是不变的,只是改变了一些数据。

理解代码的关键就是: 代码实际上就是挑几个点计算, 下面的代码从纸带上均匀挑出来了 240个点, 计算出来这240个点后做一下平滑处理就好了。

  1. # 导入包照抄就可以
  2. import numpy as np
  3. from matplotlib.tri import Triangulation
  4. import matplotlib.pyplot as plt
  5. from mpl_toolkits import mplot3d
  6. # 中心角 分成三十个计算三十遍
  7. alpha = np.linspace(0, 2 * np.pi, 30)
  8. # 自旋角 中心角的 1/2
  9. beta = 0.5 * theta
  10. # 宽度分成八份
  11. w = np.linspace(-0.25, 0.25, 8)
  12. # 这一步结合w和alpha计算了 240个点
  13. w, theta = np.meshgrid(w, alpha)
  14. # 极坐标 ---> 正交坐标变化, ravel的意思是高维数组扁平化, 程序内部操作不影响整体原理理解
  15. r = 1 + w * np.cos(phi)
  16. x = np.ravel(r * np.cos(alpha))
  17. y = np.ravel(r * np.sin(alpha))
  18. z = np.ravel(w * np.sin(phi))
  19. ## 下面就是画图的细节
  20. tri = Triangulation(np.ravel(w), np.ravel(alpha))
  21. ax = plt.axes(projection='3d')
  22. ax.plot_trisurf(x, y, z, triangles=tri.triangles,
  23. cmap='viridis', linewidths=0.2);
  24. ax.set_xlim(-1, 1); ax.set_ylim(-1, 1); ax.set_zlim(-1, 1);

效果图

image.png