Масштабирование координат вершин алгоритма марширующих кубов в лыжном магии - PullRequest
2 голосов
/ 05 марта 2019

Я пытаюсь использовать 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]. Я понятия не имею, почему это происходит и как я могу правильно масштабировать координаты моего изоповерхностного решения, к реальным единицам моей проблемы.

...