Построение изоповерхностей и неявных уравнений с помощью Python - Sci-kit Image marching_cubes возвращает только положительные значения - PullRequest
0 голосов
/ 16 октября 2018

Я использую Python 3.7, работаю в удаленной записной книжке.

Я пытаюсь визуализировать системы неявных линейных уравнений 3x3, используя Sci-kit Image и Plotly, как часть вводного проекта линейной алгебры.

Я хотел бы представить каждую из плоскостей в системе 3х3 как изоповерхность.Я не нашел другого способа сделать это.

Для этого я использую Sci-kit Image для его алгоритма marching_cubes_lewiner с Plotly для построения графика данных, которые marching_cubes извлекает.

Проблема, с которой я сталкиваюсь, заключается в том, что кажется, что marching_cubes возвращает только вершины в положительном октанте системы координат.То есть я успешно строю плоскости, но только те их части, которые имеют положительные координаты x, y, z.Я хочу построить всю плоскость в определенном диапазоне, в данном случае (-5, 5) в каждом направлении оси.

Посмотрев на другие примеры изоповерхностей, визуализированных с использованием skimage.measure.marching_cubes, я не видел ни одногос отрицательными значениями, но я также не видел много примеров.

Вот пример моего кода и ссылка на сгенерированный график :

import numpy as np
from skimage import measure
import plotly.offline as py
import plotly.figure_factory as ff
py.init_notebook_mode()

# Visualizing linear algebra: system of equations Ax = b

## Coefficient Matrix
A = np.asarray([[3, -5, 1],
                [-4, 3, 2],
                [0, -2, 3]])
## b-vector
b = np.asarray([3, -2, 4])

## x-vector (variable)
X,Y,Z = np.mgrid[-5:5:5j, -5:5:5j, -5:5:5j]


## generate data for each plane/surface and add it to the plot
data=[]
for i in range(len(A)):
    surface_equation = A[i,0]*X + A[i,1]*Y + A[i,2]*Z
    vertices, simplices, norms, vals = measure.marching_cubes_lewiner(surface_equation, b[i])
    x,y,z = zip(*vertices)

    colormap=['rgb(255,105,180)','rgb(255,255,51)','rgb(0,191,255)']
    fig = ff.create_trisurf(x=x,
                        y=y, 
                        z=z, 
                        plot_edges=False,
                        colormap=colormap,
                        simplices=simplices,
                        title="Isosurface")
    fig['data'][0].update(opacity=0.75)
    for j in range(len(fig.data)): data.append(fig.data[j])

## Plot it
fig = {"data": data, "layout": layout}            
py.iplot(fig)

** Обратите внимание, что график, который я разместил, также содержит векторные стрелки, показывающие векторы нормали к каждой плоскости.Их можно игнорировать и они были созданы в другом месте.

...