簡體   English   中英

如何計算python中兩點之間連線的坐標?

[英]How to calculate the coordinates of the line between two points in python?

如何獲取python中兩點之間的所有坐標點? 例如:我有一個坐標為 x1、y1 的點和另一個坐標為 x10、y10 的點。 我需要它們之間的所有點(在這種情況下,例如 x2, y2 ... x9, y9)。 非常感謝您的幫助!

“他們都”? 有無窮多個。

您可以計算這兩個點之間的線的斜率和截距 知道這些后,您可以使用直線方程計算您希望的每個 x 值處的 y 值。

這是高中代數。 有什么問題?

給定兩個點(x1, y1)(x2, y2) ,它們之間的直線方程為:

y = m*x + b

在哪里

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

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

如果您的意思是“繪制經過兩點之間的圓並找到里面的所有點”,我會將中心點計算為該線的中點,半徑等於該線長度的一半。 您可以通過確定到圓心的距離並將其與半徑進行比較來計算點是在圓內還是圓外。

圓內外都有無數個點。 你真的想在這里做什么?

似乎您想為給定點之間的線段生成整數點列表。 這個問題在計算機圖形學中得到解決,例如使用Bresenham 算法DDA 算法

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]]

詳細說明 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 圖 n_p=3

圖 d=0.5m 圖 d=0.25m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM