Построение списка целочисленных трехмерных значений в Axes3d.voxelsPython

Программы на Python
Ответить
Anonymous
 Построение списка целочисленных трехмерных значений в Axes3d.voxels

Сообщение Anonymous »

Начнём с того, откуда взялся этот список:

Код: Выделить всё

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), поэтому традиционный массив вокселов невозможен без некоторой работы.

Подробнее здесь: https://stackoverflow.com/questions/793 ... s3d-voxels
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»