两点之间的等距点是什么?

11

我正在尝试了解两点之间的等距点。例如:

p1 = (1,1)
p2 = (5,5)

我期望的答案是:

def getEquidistantPoints(p1, p2, HowManyParts):
    #some code
    return (array with points)
在这个例子中,使用 p1p2
A = getEquidistantPoints(p1,p2,4)
A = [(1,1),(2,2),(3,3),(4,4),(5,5)]

总是会是一条直线。HowManyParts在这种情况下是被划分的整个距离,就像numpy.linspace()但是是二维的。


如果这是Python代码,你应该使用Python语法,而不是像Function//这样的注释。 - PM 2Ring
你目前尝试了什么?另外,我认为你的示例有些混淆——第三个参数是指两个起始点之间找到的点数,还是由每对点形成的段数? - Surreal Dreams
3个回答

22

由于连接两点的线性性,您可以简单地针对每个维度分别使用 numpy.linspace

import numpy

def getEquidistantPoints(p1, p2, parts):
    return zip(numpy.linspace(p1[0], p2[0], parts+1),
               numpy.linspace(p1[1], p2[1], parts+1))
例如:
>>> list(getEquidistantPoints((1,1), (5,5), 4))
>>> [(1.0, 1.0), (2.0, 2.0), (3.0, 3.0), (4.0, 4.0), (5.0, 5.0)]

正是我需要的,可以快速轻松地生成高维(7+)线条。 - Harsh
4
请将return行替换为以下内容: zip(*[numpy.linspace(p1[i], p2[i], parts+1) for i in range(len(p1))]) - Harsh
@Harsh 不错的概括! - randomir

5

使用纯Python实现的线性插值方法:

首先创建一个线性插值函数:

def lerp(v0, v1, i):
    return v0 + i * (v1 - v0)

然后只需使用此方法在xy坐标之间进行插值

def getEquidistantPoints(p1, p2, n):
    return [(lerp(p1[0],p2[0],1./n*i), lerp(p1[1],p2[1],1./n*i)) for i in range(n+1)]

并使用您的值进行测试:

>>> getEquidistantPoints((1,1), (5,5), 4)
[(1.0, 1.0), (2.0, 2.0), (3.0, 3.0), (4.0, 4.0), (5.0, 5.0)]

在Python 2中,如果我没记错的话,对于所有n>1,1/n将计算为零。 - Grisha
@Grisha 很好的观点,我没有考虑到,现在我已经更新了解决方案,使其适用于这两个版本。 - Joe Iddon
在Python 2代码中获得“真正的除法”除法的一种简单方法是在脚本顶部添加 from __future__ import division,即使在Python 3中不需要也不会有任何影响。 - martineau

0

最简单的方法是使用可迭代对象(元组、列表等)来指定 numpy.linspacestartend 参数:

p1 = (1,1)
p2 = (5,5)
HowManyParts = 4
A = np.linspace(p1, p2, HowManyParts+1)
print(A)

输出:

array([[1., 1.],
       [2., 2.],
       [3., 3.],
       [4., 4.],
       [5., 5.]])

你还可以使用复数:
p1 = 1+1j
p2 = 5+5j
HowManyParts = 4
A = np.linspace(p1, p2, HowManyParts+1)
A = np.stack((A.real,A.imag), axis=1)
print(A)

输出:

array([[1., 1.],
       [2., 2.],
       [3., 3.],
       [4., 4.],
       [5., 5.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接