为椭圆内部的3D数组中的点指定值

时间:2018-01-02 21:22:22

标签: python arrays numpy geometry

我需要为椭球内部的3D数组中的点赋值。 椭球方程应该是这样的:

r=b.sin(u)
x=r.cos(v)
y=r.sin(v)
z=a.cos(u).

但我认为这只是视觉上的。我已经尝试过在立方体阵列上使用蒙版的东西:

a, b = (size-1)/2, (size-1)/2
n = size
r = (size-1)/2

y,x = np.ogrid[-a:n-a, -b:n-b]
mask = x*x + y*y <= r*r        # circle mask

array = np.zeros((n, n, n))
array[mask] = 10

但是这只会在x和y中创建一个圆圈,它会给我:This / plots

这不是一个球体。 (我需要一个椭圆体)。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

mask = x*x + y*y <= r*r给你一个圆圈,因为它是圆圈的等式。

基于同样的理由,

mask = x*x + y*y + z*z <= r*r应该为您提供一个球体,

mask = x*x/(a*a) + y*y/(b*b) + z*z/(c*c) <= r*r应该为您提供ellipsoid,其主轴为半长abc

当然,您必须以类似于创建zx数组的方式创建y数组。

答案 1 :(得分:0)

对我来说,最简单的方法是使用球体的坐标方程并从那里开始工作。

x = a * cos(u) * cos(v)
y = b * cos(u) * sin(v)
z = c * sin(u)

您可以使用np.meshgrid构建这些坐标,然后绘制。

a, b, c = 4, 8, 6
space = np.linspace(0, 2 * np.pi, 50)
u, v = np.meshgrid(space)
x = a * np.cos(u) * np.cos(v)
y = b * np.cos(u) * np.sin(v)
z = c * np.sin(u)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
fig.show()

enter image description here

enter image description here

<强>更新 要获得球体的内部坐标,您将使用类似于示例的蒙版,但使用椭圆体implicit equation。 x ^ 2 / a ^ 2 + y ^ 2 / b ^ 2 + z ^ 2 / c ^ 2 = 1

a, b, c = 4, 8, 6
xs, ys, zs = np.mgrid[-a + 1:a + 1:15j, -b + 1:b + 1:15j, -c + 1:c + 1:15j]
mask = xs**2/(a**2) + ys**2/(b**2) + zs**2/(c**2) <= 1
xs[~mask] = 0
ys[~mask] = 0
zs[~mask] = 0
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs, ys, zs)
fig.show()

enter image description here

enter image description here

答案 2 :(得分:0)

你的第一个方程暗示了以(0,0,0)为中心的轴对齐椭球,这是我所知道的最简单的方法是使用缩放到/来自球体。所以让我们:

[x ,y ,z ] - ellipsoid (rx,ry,rz)
[x',y',z'] - sphere (r)

所以变换是:

// sphere -> ellipsoid
x = x' * rx/r
y = y' * ry/r
z = z' * rz/r

// sphere <- ellipsoid
x' = x * r/rx
y' = y * r/ry
z' = z * r/rz

(rx,ry,rz)是椭圆体的半径(在您的情况下为rx=ry),r是球体的任何非零半径(例如r=1.0

因此对椭球内部的测试归结为:

// scale constants
sx = 1/rx
sy = 1/ry
sz = 1/rz
// condition for inside ellipsoid
x*x*sx*sx + y*y*sy*sy + z*z*sz*sz <= 1.0