【发布时间】: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