8

我想知道两点之间的等距点。例如:

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

我期待的答案是:

def getEquidistantPoints(p1, p2, HowManyParts):
    #some code
    return (array with points)

在此示例中,使用p1, 和p2

A = getEquidistantPoints(p1,p2,4)
A = [(1,1),(2,2),(3,3),(4,4),(5,5)]

永远是一条直线。 在这种HowManyParts情况下,整个距离被划分为二维。
numpy.linspace()

4

3 回答 3

19

由于连接两点的线的线性,您可以简单地独立使用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)]
于 2017-11-22T20:08:39.233 回答
5

使用纯Python解决方案linear interpolation

首先创建一个linear interpolation函数:

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

然后在和坐标interpolate之间使用它: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)]
于 2017-11-22T20:08:35.740 回答
0

最简单的方法是使用可迭代的(元组、列表等)。指定start和 的end参数numpy.linspace

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.]])
于 2021-10-01T09:57:54.783 回答