我有以下问题。我有3D点坐标,我想在一个数组中对它们进行连接或者“绘制一条线”,就像你可以在2D中使用skimage(http://scikit-image.org/docs/0.13.x/api/skimage.draw.html#skimage.draw.line)。 最佳情况是,如果我可以直接在数组中绘制一个半径为圆柱的圆柱体,并给出不同半径的不同值,例如环绕线的环(皱纹可能是一个问题)。有办法做到这一点,但他们不是我想的正确的事情:
"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]])
答案 0 :(得分:0)
由于您标记了问题'vtk',我假设您可以在代码中使用它。在这种情况下,我认为vtkTubeFilter完全符合您的要求 - 您创建了一个vtkPolyData
包含所有线段(您有端点),并且对于每个线段,过滤器生成一个柱面。您还可以根据需要为每个段指定不同的半径:在过滤器上调用SetVaryRadiusToVaryRadiusByScalar()
将其打开,并为数组提供半径作为标量数据。
您可以在此处找到完成所有这些(以及更多)的代码示例:https://www.vtk.org/Wiki/VTK/Examples/Cxx/VisualizationAlgorithms/TubesWithVaryingRadiusAndColors