Я пытаюсь использовать skimage.measure.marching_cubes_lewiner
для разрешения некоторой изоповерхности f(x,y,z)=0
. В моем случае f
является строго нелинейным и лучше всего отображается, когда координаты задаются с логарифмическим интервалом. Поскольку марширующие кубы нуждаются в регулярной сетке, чтобы построить воксели, я работаю над сеткой координат X,Y,Z
, которая соответствует log10
моих исходных координат, так что моя изоповерхность эквивалентно задается f(10**X,10**Y,10**Z)=0
. Все было бы хорошо, если бы не тот факт, что, скажем, я работаю с X,Y,Z
в [-1.5,2]^3
(эквивалентно x,y,z
в [0.03,100.]^3
), координаты вершины решения, заданного skimage.measure.marching_cubes_lewiner
, не в этом кубе.
После ответа на другой связанный вопрос о SO, я подумал, что это может быть связано с тем, что, вероятно, алгоритм работает, думая об унитарном объеме, поэтому мне нужно установить правильное значение 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]
и Vz>ZRange[-1]
. Я понятия не имею, почему это происходит и как я могу правильно масштабировать координаты моего изоповерхностного решения, к реальным единицам моей проблемы.