如何计算python中两点之间的坐标?

时间:2017-04-24 17:45:30

标签: python math vector geometry

如何获得python中两点之间的所有坐标点? 例如:我有一个坐标为x1,y1的点,另一个坐标为x10,y10。我需要它们之间的所有点(在这种情况下,例如x2,y2 ...... x9,y9)。非常感谢你的帮助!

4 个答案:

答案 0 :(得分:3)

“所有人”?有无穷无尽的数字。

你可以calculate the slope and intercept of the line between those two points。知道那些你可以使用线的等式计算x的每个值的y值。

这是高中代数。有什么问题?

给定两个点(x1, y1)(x2, y2),它们之间的线的等式是:

y = m*x + b

其中

m = slope = (y1-y2)/(x1-x2)

b = y-intercept = (x1*y1 - x2*y1)/(x1-x2)

如果你的意思是“绘制在两点之间经过的圆并找到里面的所有点”,我会将中心点计算为该线的中点,半径等于该线长度的一半。您可以通过确定距离中心的距离并将其与半径进行比较来计算点是在圆内还是在圆外。

圆圈内外都有无数个点。你真的想在这做什么?

答案 1 :(得分:3)

似乎您要为给定点之间的线段生成整数点的列表。此问题在计算机图形中得到解决,例如,使用Bresenham algorithmDDA algo

答案 2 :(得分:1)

def intermediates(p1, p2, nb_points=8):
    """"Return a list of nb_points equally spaced points
    between p1 and p2"""
    # If we have 8 intermediate points, we have 8+1=9 spaces
    # between p1 and p2
    x_spacing = (p2[0] - p1[0]) / (nb_points + 1)
    y_spacing = (p2[1] - p1[1]) / (nb_points + 1)

    return [[p1[0] + i * x_spacing, p1[1] +  i * y_spacing] 
            for i in range(1, nb_points+1)]

print(intermediates([1, 2], [10, 6.5], nb_points=8))

# [[2.0, 2.5], [3.0, 3.0], [4.0, 3.5], [5.0, 4.0], 
#  [6.0, 4.5], [7.0, 5.0], [8.0, 5.5], [9.0, 6.0]]

答案 3 :(得分:0)

详细解释Thierry Lathuille提供的答案,您可以尝试制作矢量化版本,如下所示。编写此代码是为了在wkt几何图中插入额外的点,这就是为什么它具有z_v点的原因,它有两个选择,要么在现有坐标点之间插入固定数量的点(n_p),要么在给定的固定距离(d)处插入点彼此之间在现有坐标点之间。

此外,“ BORRAR-REVISION GRAFICA DE LOS PUNTOS”也只是一种以可视方式查看代码是否正常工作的方法,请确保确定点放置有效后将其注释掉。

v range函数是在stackoverflow中找到的,但似乎找不到要引用的帖子,我只是对其进行了一些修改。

在相同的WKT几何上,我的机器将时间减少了约25倍。

 def vrange(stops):
    """Create concatenated ranges of integers for multiple [1]/stop

    Parameters:
        starts (1-D array_like): starts for each range
        stops (1-D array_like): stops for each range (same shape as starts)

    Returns:
        numpy.ndarray: concatenated ranges
    """
    starts = np.array([1] * len(stops))
    stops = np.asarray(stops) + 1
    L_p = stops - starts
    return np.array(np.split(np.repeat(stops - L_p.cumsum(), L_p) + np.arange(L_p.sum()), np.cumsum(stops - 1)[:-1]))

def get_points_v(x_v, y_v, z_v, d=None, n_p= None):
        "DESEMPACAR ARRAY DE WKT"
        x_v, y_v, z_v = np.asarray(x_v), np.asarray(y_v), np.asarray(z_v)

        "DISTANCIAS ENTRE X(n) - X(n-1), Y(n) - Y(n-1)"
        Lx, Ly = np.array(x_v[1:] - x_v[:-1]), np.array(y_v[1:] - y_v[:-1])

        "EXCLUIR LINEAS DE LONGITUD MENOR A LA DISTANCIA 'd'"
        if d and np.sum(np.asarray(((x_v[1:] - x_v[:-1]) ** 2 + (y_v[1:] - y_v[:-1]) ** 2) ** 0.5)) < d:
            print(np.sum(Lx), np.sum(Ly))
            pass
        else:
            "NUMERO DE PUNTOS ENTRE VERTICES"
            if n_p is None:
                nx, ny = np.array(np.around(np.abs(Lx / d), decimals=0)), np.array(np.around(np.abs(Ly / d), decimals=0))
                nx, ny = np.where(nx <= 0, 1, nx).astype(np.int), np.where(ny <= 0, 1, ny).astype(np.int)
                n_points = np.maximum(nx, ny)
            else:
                n_points = np.array([1] * len(Lx)) * np.array(n_p)

            "LONGUITUD DE SEGMENTOS ENTRE PUNTOS"
            x_space, y_space = Lx / (n_points + 1), Ly / (n_points + 1)

            "CREAR 2D ARRAY DE VALORES INICIALES"
            x_init, y_init = np.array(np.split(np.repeat(x_v[:-1], n_points), np.cumsum(n_points)[:-1])), np.array(np.split(np.repeat(y_v[:-1], n_points), np.cumsum(n_points)[:-1]))

            "CREAR RANGO DE NUMERO DE SEGMENTOS (n_points)"
            range_n = vrange(n_points)

            "CALCULO DE PUNTOS INTERMEDIOS ENTRE SEGMENTOS DE X_V y Y_v"
            if n_p is None:
                points_x, points_y = x_init + (range_n * x_space).T, y_init + (range_n * y_space).T
            else:
                points_x, points_y = x_init + (range_n * x_space[:, None]), y_init + (range_n * y_space[:,None])

            "GENERAR ARRAY DE VALORES z_v"
            points_z = np.split(np.repeat(np.array([z_v[0]] * len(points_x)), n_points), np.cumsum(n_points)[:-1])

            "BORRAR - REVISION GRAFICA DE LOS PUNTOS"
            import matplotlib.pyplot as plt
            [plt.plot(m, n, marker='o', color='red') for m,n in zip(points_x, points_y)]
            plt.plot(line.T[0], line.T[1], linewidth=1, color='C0',marker='>')
            plt.show()
            return points_x, points_y, points_z

图n_p = 3 Figure n_p=3

图d = 0.5m Figure d= 0.25m