Python:获取两个三维点之间的所有坐标或绘制一条三维线。

3
我有以下问题。我有3D点坐标,想将它们连接成一个数组或者像2D中使用skimage(http://scikit-image.org/docs/0.13.x/api/skimage.draw.html#skimage.draw.line)一样"画一条线"。最理想的情况是,我可以直接在数组中绘制半径为r的圆柱,并给不同的半径不同的值,就像线周围的环一样。(这里可能会有皱纹问题)已经有了一些方法来解决这个问题,但我认为它们不是正确的方法,比如这里:"Draw" a 3d line into an array

使用@Paul Panzer的两种方法(Python中获取两个(X,Y)坐标之间所有点的最快方法),您可以获得两个2D点之间的所有坐标,但在3D中会是什么样子,特别是第二种更快的方法呢?

import numpy as np
from timeit import timeit

def connect(ends):
    d0, d1 = np.abs(np.diff(ends, axis=0))[0]
    if d0 > d1: 
        return np.c_[np.linspace(ends[0, 0], ends[1, 0], d0+1, dtype=np.int32),
                     np.linspace(ends[0, 1]+0.5, ends[1, 1]+0.5, d0+1, dtype=np.int32)]
    else:
        return np.c_[np.linspace(ends[0, 0]+0.5, ends[1, 0]+0.5, d1+1, dtype=np.int32),
                     np.linspace(ends[0, 1], ends[1, 1], d1+1, dtype=np.int32)]


def connect2(ends):
    d0, d1 = np.diff(ends, axis=0)[0]
    if np.abs(d0) > np.abs(d1): 
        return np.c_[np.arange(ends[0, 0], ends[1,0] + np.sign(d0), np.sign(d0), dtype=np.int32),
                     np.arange(ends[0, 1] * np.abs(d0) + np.abs(d0)//2,
                               ends[0, 1] * np.abs(d0) + np.abs(d0)//2 + (np.abs(d0)+1) * d1, d1, dtype=np.int32) // np.abs(d0)]
    else:
        return np.c_[np.arange(ends[0, 0] * np.abs(d1) + np.abs(d1)//2,
                               ends[0, 0] * np.abs(d1) + np.abs(d1)//2 + (np.abs(d1)+1) * d0, d0, dtype=np.int32) // np.abs(d1),
                     np.arange(ends[0, 1], ends[1,1] + np.sign(d1), np.sign(d1), dtype=np.int32)]


ends = np.array([[ 1520, -1140],
                 [ 1412,  -973]])
1个回答

0

既然您将问题标记为“vtk”,我认为您可以在您的代码中使用它。在这种情况下,我认为vtkTubeFilter恰好做了你要寻找的 - 您创建一个vtkPolyData与所有的线段(您有端点),并且对于每个线段,过滤器生成一个圆柱体。您还可以指定每个线段的不同半径,就像您想要的那样:在过滤器上调用SetVaryRadiusToVaryRadiusByScalar()来启用它,并提供半径数组作为标量数据。

您可以在此处找到执行所有这些操作(以及更多操作)的代码示例:https://www.vtk.org/Wiki/VTK/Examples/Cxx/VisualizationAlgorithms/TubesWithVaryingRadiusAndColors


我以前使用过 TubeFilter,但我认为这里的问题是 TubeFilter 只是圆柱体的轮廓。要获得管道内部的所有坐标,我必须使用 vtk.vtkSelectEnclosedPoints(),而这非常耗时。 - Liwellyen
我明白了,我误解了问题。我想你正在处理离散的体积数据,并且想要填充沿着线路的所有体素...在这种情况下,我无法提供帮助 :( - tomj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接