我有以下问题。我有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]])