【问题标题】:Python: Get all coordinates between two 3D points or draw a 3D LinePython:获取两个 3D 点之间的所有坐标或绘制 3D 线
【发布时间】:2018-02-10 17:03:09
【问题描述】:

我有以下问题。我有 3D 点坐标,我想将它们连接成一个数组或“画一条线”,就像你可以使用 skimage(http://scikit-image.org/docs/0.13.x/api/skimage.draw.html#skimage.draw.line) 在 2D 中那样。 最佳情况是,如果我可以直接在数组中绘制一个具有半径的圆柱体,并为不同的半径提供不同的值,例如围绕线的环。(皱纹可能是这里的问题)。有一些方法可以做到这一点,但它们不是我认为的正确方法:

"Draw" a 3d line into an array

使用@Paul Panzer (Fastest way to get all the points between two (X,Y) coordinates in python) 的两种方法,您可以获得两个 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]])

【问题讨论】:

    标签: python numpy scipy vtk scikit-image


    【解决方案1】:

    由于您标记了问题“vtk”,我假设您可以在代码中使用它。在这种情况下,我认为 vtkTubeFilter 完全符合您的要求 - 您使用所有线段(您有端点)创建一个 vtkPolyData ,并且对于每个线段,过滤器都会生成一个圆柱体。您还可以根据需要为每个段指定不同的半径:在过滤器上调用 SetVaryRadiusToVaryRadiusByScalar() 以将其打开并为数组提供半径作为标量数据。

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

    【讨论】:

    • 我之前用过TubeFilter,但我觉得这里的问题是TubeFilter只是圆柱体的轮廓。要获取 Tube 内部的所有坐标,我必须使用 vtk.vtkSelectEnclosedPoints(),这非常耗时。
    • 我明白了,我误解了我认为的问题,您正在处理离散的体积数据,并且您想沿线填充所有体素...在这种情况下,我无能为力:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多