使用mayavi绘制3D场景时出现意外行为

时间:2019-08-06 16:33:15

标签: python mayavi

我想使用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()

结果显示在下面的图像0中。 image0

如您所见,段的排列顺序不正确。所以我在theta1中更改了顺序:

theta1=arccos(np.linspace(1,0,11))

结果显示在下面的图像1中。如您所见,段的排列没有改变。

image1

那为什么呢?当我从0 ... 1排列角度间距时,得出的结果应与从1 ... 0开始的间距不同。但是实际上不是吗?!?

有任何线索吗,我做错了什么?

谢谢

image0 image1

3 个答案:

答案 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))

产生正确的输出。

correct Image

好吧,有时候你(我)看不见森林... ^^

问候...