python输入多个坐标点_在python中获取两个(X,Y)坐标之间所有点的最快方法

Bresenham可能很聪明,但我很肯定蛮力矢量化更快。我写了两个变体-第一个更容易阅读,第二个更快(80美vs 50 us)。在

更新修复了一个bug(谢谢@Varlor),并添加了nd变体。在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.round(np.linspace(ends[0, 1], ends[1, 1], d0+1))

.astype(np.int32)]

else:

return np.c_[np.round(np.linspace(ends[0, 0], ends[1, 0], d1+1))

.astype(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)]

def connect_nd(ends):

d = np.diff(ends, axis=0)[0]

j = np.argmax(np.abs(d))

D = d[j]

aD = np.abs(D)

return ends[0] + (np.outer(np.arange(aD + 1), d) + (aD>>1)) // aD

ends = np.array([[ 1520, -1140],

[ 1412, -73]])

ends_4d = np.array([[ 100, -302, 101, -49],

[ -100, -45, 112, 100]])

print(connect(ends))

print(connect_nd(ends_4d))

assert np.all(connect(ends)==connect2(ends))

assert np.all(connect(ends)==connect_nd(ends))

assert np.all(connect(ends)==connect(ends[:, ::-1])[:, ::-1])

assert np.all(connect(ends)==connect(ends[::-1])[::-1])

print(timeit('f(ends)', globals={'f': connect, 'ends': ends}, number=10000)*100, 'us')

print(timeit('f(ends)', globals={'f': connect2, 'ends': ends}, number=10000)*100, 'us')

print(timeit('f(ends)', globals={'f': connect_nd, 'ends': ends}, number=10000)*100, 'us')

样本输出:

^{pr2}$

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值