为三维阵列中位于椭球体内部的点指定值

2024-05-31 23:20:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要为三维数组中椭球体内的点赋值。 椭球方程应该是这样的:

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

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

^{pr2}$

但这只在x和y上创建了一个圆,它给出了:This/plots。在

它不是一个球体。(我需要一个椭球体。在

有什么想法吗?在


Tags: 视觉数组sincos方程球体赋值椭球
3条回答

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

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

所以这些转变是:

^{pr2}$

(rx,ry,rz)是椭球体的半径(在您的例子中是rx=ry),而{}是球体的任何非零半径(例如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

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

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

可以用^{}构造这些坐标,然后绘图。在

^{pr2}$

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

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,主轴为ab,和{}。在

当然,您必须以类似于创建x和{}数组的方式创建z数组。在

相关问题 更多 >