2024-05-31 23:20:26 发布
网友
我需要为三维数组中椭球体内的点赋值。 椭球方程应该是这样的:
r=b.sin(u) x=r.cos(v) y=r.sin(v) z=a.cos(u).
但我认为这只是视觉上的。我已经尝试过在立方体阵列上使用遮罩:
但这只在x和y上创建了一个圆,它给出了:/。在
它不是一个球体。(我需要一个椭球体。在
有什么想法吗?在
您的第一个方程暗示了以(0,0,0)为中心的轴对齐椭球体,因为这是我所知道的使用球体缩放的最简单方法。所以让我们:
(0,0,0)
[x ,y ,z ] - ellipsoid (rx,ry,rz) [x',y',z'] - sphere (r)
所以这些转变是:
(rx,ry,rz)是椭球体的半径(在您的例子中是rx=ry),而{}是球体的任何非零半径(例如r=1.0)
(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)
可以用^{}构造这些坐标,然后绘图。在
更新 要获得球体的内部坐标,可以使用与示例类似的遮罩,但要使用椭球体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()
mask = x*x + y*y <= r*r给你一个圆,因为这是圆的等式。在
mask = x*x + y*y <= r*r
基于同样的理由
mask = x*x + y*y + z*z <= 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,主轴为a,b,和{}。在
mask = x*x/(a*a) + y*y/(b*b) + z*z/(c*c) <= r*r
a
b
当然,您必须以类似于创建x和{}数组的方式创建z数组。在
x
z
您的第一个方程暗示了以
(0,0,0)
为中心的轴对齐椭球体,因为这是我所知道的使用球体缩放的最简单方法。所以让我们:所以这些转变是:
^{pr2}$(rx,ry,rz)
是椭球体的半径(在您的例子中是rx=ry
),而{r=1.0
)因此,内部椭球体的测试可以归结为:
对我来说,最简单的方法就是使用球体的坐标方程,然后从那里开始工作。在
可以用^{} 构造这些坐标,然后绘图。在
^{pr2}$更新 要获得球体的内部坐标,可以使用与示例类似的遮罩,但要使用椭球体implicit equation。x^2/a^2+y^2/b^2+z^2/c^2=1
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,主轴为a
,b
,和{当然,您必须以类似于创建}数组的方式创建
x
和{z
数组。在相关问题 更多 >
编程相关推荐