import tkinter as tk
from tkinter import ttk
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,
NavigationToolbar2Tk)
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.figure import Figure as fg
import numpy as np
upar = (0, np.pi*2, 101)
vpar = (0, np.pi, 41)
# Map the parameters to an mgrid [[float, float]]
map = np.mgrid[upar[0]:upar[1]:upar[2] * 1j,
vpar [0]:vpar [1]:vpar [2] * 1j]
.reshape(2, -1).T
#define a [u,v]->[x,y,z] parametric function
def ball(ij):
x0 = np.cos(ij[0]) * np.sin(ij[1])
y0 = np.sin(ij[0]) * np.sin(ij[1])
z0 = np.cos(ij[1])
return [x0, y0, z0]
# Use function to create 3d map [[float, float, float]]
core = [ball(i) for i in map]
# Scale map for conversion to voxels
size = (15, 15, 9)
mantle = [np.multiply(i, size) for i in core]
# Create unique voxel point list [[int, int, int]]
crust = np.unique([[round(i) for i in j] for j in mantle])
# Split off top layer for light voxels and the rest dark
# body cannot exist without layers to support it
roof = 8
cap = [lambda p : p[2] == roof - 1, crust]
body = if level>1 [lambda p : p[2] < roof - 1, crust] else None
# Set up the canvas and its figure
colors = ['#20e07f', '#000040']
fig = fg(figsize=(7, 7), dpi=100)
ax = fig.add_subplot(111, projection="3d")
ax.set_aspect('equal')
screen = FigureCanvasTkAgg(fig, master=self)
screen.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# At last, the issue at hand
ax.voxels(cap, facecolors=colors[0], edgecolors=colors[1])
if (body!=None) ax.voxels(body, facecolors=colors[1],
edgecolors=colors[0])
screen.draw()
ValueError: заполненный аргумент должен быть трехмерным
Очевидно, что метод вокселей не может обрабатывать [[int, int , int]] в качестве параметра данных. Существует ли альтернативный метод, способ преобразовать список, чтобы он работал, или даже унаследованный Axes3D, который действительно может отображать эти данные?
Фактические точки данных варьируются от ( от -15,-15,0) до (15,15,9), поэтому традиционный массив вокселов невозможен без некоторой работы.
Начнём с того, откуда взялся этот список: [code]import tkinter as tk from tkinter import ttk from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk) from mpl_toolkits.mplot3d import Axes3D from matplotlib.figure import Figure as fg import numpy as np
upar = (0, np.pi*2, 101) vpar = (0, np.pi, 41)
# Map the parameters to an mgrid [[float, float]] map = np.mgrid[upar[0]:upar[1]:upar[2] * 1j, vpar [0]:vpar [1]:vpar [2] * 1j] .reshape(2, -1).T
# Use function to create 3d map [[float, float, float]] core = [ball(i) for i in map]
# Scale map for conversion to voxels size = (15, 15, 9) mantle = [np.multiply(i, size) for i in core]
# Create unique voxel point list [[int, int, int]] crust = np.unique([[round(i) for i in j] for j in mantle])
# Split off top layer for light voxels and the rest dark # body cannot exist without layers to support it roof = 8 cap = [lambda p : p[2] == roof - 1, crust] body = if level>1 [lambda p : p[2] < roof - 1, crust] else None
# Set up the canvas and its figure colors = ['#20e07f', '#000040'] fig = fg(figsize=(7, 7), dpi=100) ax = fig.add_subplot(111, projection="3d") ax.set_aspect('equal') screen = FigureCanvasTkAgg(fig, master=self) screen.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# At last, the issue at hand ax.voxels(cap, facecolors=colors[0], edgecolors=colors[1]) if (body!=None) ax.voxels(body, facecolors=colors[1], edgecolors=colors[0]) screen.draw() [/code] ValueError: заполненный аргумент должен быть трехмерным Очевидно, что метод вокселей не может обрабатывать [[int, int , int]] в качестве параметра данных. Существует ли альтернативный метод, способ преобразовать список, чтобы он работал, или даже унаследованный Axes3D, который действительно может отображать эти данные? Фактические точки данных варьируются от ( от -15,-15,0) до (15,15,9), поэтому традиционный массив вокселов невозможен без некоторой работы.