Я наткнулся на следующий пример в numpy-stl docs, который создает объект-сетку для куба и печатает его объем -

import numpy as np
from stl import mesh

# Define the 8 vertices of the cube
vertices = np.array(
    [
        [-1, -1, -1],
        [+1, -1, -1],
        [+1, +1, -1],
        [-1, +1, -1],
        [-1, -1, +1],
        [+1, -1, +1],
        [+1, +1, +1],
        [-1, +1, +1],
    ]
)
# Define the 12 triangles composing the cube
faces = np.array(
    [
        [0, 3, 1],
        [1, 3, 2],
        [0, 4, 7],
        [0, 7, 3],
        [4, 5, 6],
        [4, 6, 7],
        [5, 1, 2],
        [5, 2, 6],
        [2, 3, 6],
        [3, 7, 6],
        [0, 1, 5],
        [0, 5, 4],
    ]
)

# Create the mesh
cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
for i, f in enumerate(faces):
    for j in range(3):
        cube.vectors[i][j] = vertices[f[j], :]


volume, cog, inertia = cube.get_mass_properties()
print(f"Volume: {volume}") # 8.0

Однако мне бы очень хотелось повернуть этот процесс вспять. Учитывая существующее измерение объема, как я могу затем сгенерировать вершины куба?

-1
Teejay Bruno 4 Май 2021 в 00:16

1 ответ

Лучший ответ

Это основная линейная алгебра; здесь практически нет программирования. У вас уже есть куб с ребром 2. Возьмите кубический корень вашего заданного объема и масштабируйте эталонный куб:

vertices *= volume**(1/3) / 2
0
Prune 3 Май 2021 в 21:23