温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - I have 8 vertices of a box on a 3D terrain, and i need to seperate the box to a few smaller ones
python python-3.x

python - 我在3D地形上有一个框的8个顶点,我需要将框分离为几个较小的顶点

发布于 2020-03-27 11:46:31

对于这个问题,我得到了一个需要收缩的盒子的8个顶点,并且给定的大小是一个整数,我需要收缩每个侧面。例如,如果我需要缩小的盒子的大小是8 * 8 * 8,缩小的大小是2,我需要返回填充4 * 4 * 4盒子中所有大盒子的所有顶点的列表3D坐标系。

我考虑过要在框的大小范围内运行一个for循环,但是比我想的是,如果我想最终将框分离成更多的较小的框,而我想填充大框,我将不得不编写一些我无法编​​写的代码。如何在不编写大量代码的情况下获得此顶点列表?

查看更多

查看更多

提问者
Jhonathan Mizrahi
被浏览
14
B. M. 2019-07-03 23:13

使用numpy的解决方案,可以轻松地进行整组操作。

首先,我选择用一个原点和三个向量表示一个立方体:单位立方体用orig=np.array([0,0,0])表示vects=np.array([[1,0,0],[0,1,0],[0,0,1]])

现在是一个numpy函数来生成八个顶点:

import numpy as np

def cube(origin,edges):
    for e in edges:
        origin = np.vstack((origin,origin+e))
    return origin


cube(orig,vects)

array([[0, 0, 0],
       [1, 0, 0],
       [0, 1, 0],
       [1, 1, 0],
       [0, 0, 1],
       [1, 0, 1],
       [0, 1, 1],
       [1, 1, 1]])

然后另一个人跨3D跨迷你立方体:

def split(origin,edges,k):
    minicube=cube(origin,edges/k)
    for e in edges/k:
        minicube =np.vstack([minicube + i*e for i in range(k) ])
    return minicube.reshape(k**3,8,3) 


split (orig,vects,2)

array([[[ 0. ,  0. ,  0. ],
        [ 0.5,  0. ,  0. ],
        [ 0. ,  0.5,  0. ],
        [ 0.5,  0.5,  0. ],
        [ 0. ,  0. ,  0.5],
        [ 0.5,  0. ,  0.5],
        [ 0. ,  0.5,  0.5],
        [ 0.5,  0.5,  0.5]],
   ...

       [[ 0.5,  0.5,  0.5],
        [ 1. ,  0.5,  0.5],
        [ 0.5,  1. ,  0.5],
        [ 1. ,  1. ,  0.5],
        [ 0.5,  0.5,  1. ],
        [ 1. ,  0.5,  1. ],
        [ 0.5,  1. ,  1. ],
        [ 1. ,  1. ,  1. ]]])