我正在尝试使用skimage.measure.marching_cubes_lewiner
解析某些等值面f(x,y,z)=0
。在我的情况下,f
是强非线性的,当坐标以对数间距给出时,最好映射。因为行进立方体需要规则的网格来构建体素,所以我正在使用坐标X,Y,Z
的网格,该网格对应于原始坐标的log10
,因此等值面由{ {1}}。如果不是因为我正在使用f(10**X,10**Y,10**Z)=0
中的X,Y,Z
(相当于[-1.5,2]^3
中的x,y,z
),一切都很好, [0.03,100.]^3
给出的解决方案不在此多维数据集中。
在SO上回答另一个related question之后,我认为这可能是由于以下事实:该算法可能考虑了单位体积,因此我需要设置正确的skimage.measure.marching_cubes_lewiner
我在spacing
的调用中输入参数。以这种方式,假设我将函数skimage.measure.marching_cubes_lewiner
映射到每个坐标f
个点的网格上,这样我就将每个坐标N
的指数增加,因此我称:
numpy.diff([-1.5,2])/N
但是,出乎意料的是,求解点的坐标通常在import numpy as np
from skimage import measure as msr
def f(x,y,z):
val = ... # some lengthy code to define my implicit function
return val
# Define ranges of my coordinates
xRange = [0.03,100.]
yRange = [0.03,100.]
zRange = [0.03,100.]
XRange = np.log10(xRange)
YRange = np.log10(yRange)
ZRange = np.log10(zRange)
# Create regular grid
N = 50 # number of points per coordinate
X,Y,Z = np.mesh[XRange[0]:XRange[1]:N*1j,
YRange[0]:YRange[1]:N*1j,
ZRange[0]:ZRange[1]:N*1j]
F = f(10**X,10**Y,10**Z)
sol,_,_,_ = skimage.measure.marching_cubes_lewiner(F,0.0,spacing(np.diff(XRange)/N,np.diff(YRange)/N,np.diff(ZRange)/N))
中带有[0,Vx]*[0,Vy]*[0,Vz]
,Vx>XRange[-1]
和Vy>YRange[-1]
。我不知道为什么会发生这种情况,也不知道如何正确地将等值面解决方案的坐标调整为问题的实际单位。