matplotlib 绘制三维超级球形状

c2e8gylq  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(140)

我试图在python matplotlib中绘制一个3D超级球,其中超级球被定义为一个通用的数学形状,可以使用to describe rounded cubes使用形状参数p,其中p = 1的形状等于球体的形状。
This paper声称超级球是通过使用修改后的球坐标定义的:

x = r*cos(u)**1/p * sin(v)**1/p
y = r*cos(u)**1/p * sin(v)**1/p
z = r*cos(v)**1/p

u = phiv = theta
我设法让代码运行起来,至少对于p = 1,它生成了一个球体--正如它应该做的那样:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

r, p = 1, 1

# Make data
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
u, v = np.meshgrid(u, v)

x = r * np.cos(u)**(1/p) * np.sin(v)**(1/p)
y = r * np.sin(u)**(1/p) * np.sin(v)**(1/p)
z = r * np.cos(v)**(1/p)

# Plot the surface
ax.plot_surface(x, y, z)

plt.show()

这是上面p = 1代码的3D图。

然而,当我为p输入任何其他值时,e。g.2,它只给我一个部分的形状,而它实际上应该给予我一个完整的超级球。
这是上面p = 2代码的3D图。

我相信修复更多的是数学性质的,但如何才能修复呢?

gywdnpxw

gywdnpxw1#

在绘制规则球体时,我们以不同的方式转换正坐标和负坐标:

  • 阳性:x**0.5
  • 底片:-1 * abs(x)**0.5

对于superball变体,使用np.signnp.abs应用相同的逻辑:

power = lambda base, exp: np.sign(base) * np.abs(base)**exp

x = r * power(np.cos(u), 1/p) * power(np.sin(v), 1/p)
y = r * power(np.sin(u), 1/p) * power(np.sin(v), 1/p)
z = r * power(np.cos(v), 1/p)

p = 4的完整示例:

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(subplot_kw={'projection': '3d'})

r, p = 1, 4

# Make the data
u = np.linspace(0, 2 * np.pi)
v = np.linspace(0, np.pi)
u, v = np.meshgrid(u, v)

# Transform the coordinates
#   Positives: base**exp
#   Negatives: -abs(base)**exp
power = lambda base, exp: np.sign(base) * np.abs(base)**exp
x = r * power(np.cos(u), 1/p) * power(np.sin(v), 1/p)
y = r * power(np.sin(u), 1/p) * power(np.sin(v), 1/p)
z = r * power(np.cos(v), 1/p)

# Plot the surface
ax.plot_surface(x, y, z)
plt.show()

相关问题