我想使用mayavi绘制具有3D纬度的球体。但是我不希望纬度在等距的角度范围内,而是在这样的范围内:https://en.wikipedia.org/wiki/Spherical_segment
这将导致具有相同表面积的球形段。 到目前为止...让我们以theta为极角,phi为方位角。然后我有以下代码:
import numpy as np
from mayavi import mlab
## Create a sphere
r = 1.0
pi = np.pi
cos = np.cos
sin = np.sin
arccos=np.arccos
phi, theta = np.mgrid[-0.5*pi:0.5*pi:101j, 0:1*pi:101j]
x = r*sin(phi)*cos(theta)
y = r*sin(phi)*sin(theta)
z = r*cos(phi)
## Basic settings mlab
mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(500, 500))
mlab.clf()
mlab.mesh(x , y , z, color=(0.9,0.,0.), opacity=0.3)
phi1=np.linspace(0, 2 * np.pi, 100)
theta1=arccos(np.linspace(0,1,11))
for i in range(len(theta1)):
x_pol = np.cos(phi1) * np.cos(theta1[i])
y_pol = np.sin(phi1) * np.cos(theta1[i])
z_pol = np.ones_like(phi1) * np.sin(theta1[i])
mlab.plot3d(x_pol, y_pol, z_pol, color=(0,0,0), opacity=0.2, tube_radius=None)
mlab.show()
如您所见,段的排列顺序不正确。所以我在theta1中更改了顺序:
theta1=arccos(np.linspace(1,0,11))
结果显示在下面的图像1中。如您所见,段的排列没有改变。
那为什么呢?当我从0 ... 1排列角度间距时,得出的结果应与从1 ... 0开始的间距不同。但是实际上不是吗?!?
有任何线索吗,我做错了什么?
谢谢
答案 0 :(得分:0)
范围具有相同的值。段是相同的,但是顺序相反。
查看theta
的值:
In [1]: np.flip(np.linspace(0,1,11), 0), np.linspace(1,0,11)
Out[1]:
(array([ 1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0. ]),
array([ 1. , 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0. ]))
答案 1 :(得分:0)
感谢您的回复。我不确定我是否明白你的意思。在第一种情况下,theta看起来像这样:
import os
os.system(r"cd /home/code/ && ls && git status")
在第二种情况下,它看起来像:
In [1]: np.arccos(np.linspace(1,0,11))
Out [1]:
array([0. , 0.45102681, 0.64350111, 0.79539883, 0.92729522,
1.04719755, 1.15927948, 1.26610367, 1.36943841, 1.47062891,
1.57079633])
对我来说,这似乎是正确的。
答案 2 :(得分:0)
好吧
有时候我要花很长时间^^
我发现,我做错了。我只是改变了
np.arccos(np.linspace(0,1,11))
到
np.pi/2 - np.arccos(np.linspace(0,1,11))
产生正确的输出。
好吧,有时候你(我)看不见森林... ^^
问候...