Я использую 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)
** Обратите внимание, что график, который я разместил, также содержит векторные стрелки, показывающие векторы нормали к каждой плоскости.Их можно игнорировать и они были созданы в другом месте.