import%20marimo%0A%0A__generated_with%20%3D%20%220.23.8%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20mpl_toolkits.mplot3d%20import%20Axes3D%0A%0A%20%20%20%20return%20np%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20np)%3A%0A%20%20%20%20%23%20Reactive%20controls%0A%20%20%20%20t%20%3D%20mo.ui.slider(0%2C%202%20*%20np.pi%2C%20step%3D0.05%2C%20label%3D%22Phase%22%2C%20value%3D0.5)%0A%20%20%20%20complexity%20%3D%20mo.ui.slider(1%2C%208%2C%20step%3D1%2C%20label%3D%22Complexity%22%2C%20value%3D3)%0A%20%20%20%20speed%20%3D%20mo.ui.slider(0.1%2C%203.0%2C%20step%3D0.1%2C%20label%3D%22Speed%22%2C%20value%3D1.0)%0A%20%20%20%20zoom%20%3D%20mo.ui.slider(0.5%2C%203.0%2C%20step%3D0.1%2C%20label%3D%22Zoom%22%2C%20value%3D1.5)%0A%0A%20%20%20%20mo.hstack(%5Bt%2C%20complexity%2C%20speed%2C%20zoom%5D)%0A%20%20%20%20return%20complexity%2C%20speed%2C%20t%2C%20zoom%0A%0A%0A%40app.cell%0Adef%20_(complexity%2C%20np%2C%20speed%2C%20t%2C%20zoom)%3A%0A%20%20%20%20%23%20Generate%203D%20parametric%20form%0A%20%20%20%20n%20%3D%20100%0A%20%20%20%20u%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20n)%0A%20%20%20%20v%20%3D%20np.linspace(0%2C%20np.pi%2C%20n)%0A%20%20%20%20U%2C%20V%20%3D%20np.meshgrid(u%2C%20v)%0A%0A%20%20%20%20p%20%3D%20complexity.value%0A%20%20%20%20q%20%3D%20complexity.value%20%2B%201%0A%20%20%20%20r_base%20%3D%202%20%2B%20np.cos(q%20*%20V%20%2B%20t.value%20*%20speed.value)%0A%0A%20%20%20%20X%20%3D%20r_base%20*%20np.cos(p%20*%20U%20%2B%20t.value%20*%20speed.value)%20*%20zoom.value%0A%20%20%20%20Y%20%3D%20r_base%20*%20np.sin(p%20*%20U%20%2B%20t.value%20*%20speed.value)%20*%20zoom.value%0A%20%20%20%20Z%20%3D%20np.sin(q%20*%20V%20%2B%20p%20*%20t.value%20*%20speed.value)%20*%20zoom.value%0A%20%20%20%20return%20X%2C%20Y%2C%20Z%2C%20p%2C%20q%0A%0A%0A%40app.cell%0Adef%20_(X%2C%20Y%2C%20Z%2C%20plt%2C%20t)%3A%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(12%2C%209))%0A%20%20%20%20ax%20%3D%20fig.add_subplot(111%2C%20projection%3D'3d')%0A%0A%20%20%20%20%23%20Flatten%20for%20scatter%0A%20%20%20%20x_flat%20%3D%20X.flatten()%0A%20%20%20%20y_flat%20%3D%20Y.flatten()%0A%20%20%20%20z_flat%20%3D%20Z.flatten()%0A%0A%20%20%20%20%23%20Color%20by%20depth%0A%20%20%20%20colors%20%3D%20plt.cm.viridis((z_flat%20-%20z_flat.min())%20%2F%20(z_flat.max()%20-%20z_flat.min()))%0A%0A%20%20%20%20ax.scatter(x_flat%2C%20y_flat%2C%20z_flat%2C%20c%3Dcolors%2C%20s%3D2%2C%20alpha%3D0.5%2C%20edgecolors%3D'none')%0A%0A%20%20%20%20ax.set_facecolor('%230a0a0a')%0A%20%20%20%20fig.patch.set_facecolor('%230a0a0a')%0A%20%20%20%20ax.set_axis_off()%0A%20%20%20%20ax.view_init(elev%3D20%2C%20azim%3Dt.value%20*%2030)%0A%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20p%2C%20q%2C%20t%2C%20zoom)%3A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%93%8A%20Form%20Parameters%0A%0A%20%20%20%20-%20**Complexity%20(p%2C%20q)%3A**%20(%7Bp%7D%2C%20%7Bq%7D)%0A%20%20%20%20-%20**Phase%3A**%20%7Bt.value%3A.2f%7D%20rad%0A%20%20%20%20-%20**Zoom%3A**%20%7Bzoom.value%3A.1f%7Dx%0A%0A%20%20%20%20*Drag%20the%20slider%20above%20to%20morph%20the%20form.*%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
fa7b2556214903ad64166e3fea6263d0