2013-05-04 13 views
0

我計算A(X0,Y0)之間和B(X1,Y1)的點在二維(X,Y)的距離。每個距離在2D相交的線的點增加的順序座標

我有以下代碼表示在給定的兩個邊界點中的每個小區,A(X0,Y0)和B(X1,Y1)的相交點。

def intersected_points(x0, x1, y0, y1): 
    # slope 
    m = (y1 - y0)/(x1 - x0) 
    # Boundary of the selected points 
    x_ceil = ceil(min (x0, x1)) 
    x_floor = floor(max(x0, x1)) 
    y_ceil = ceil(min(y0, y1)) 
    y_floor = floor(max(y0, y1)) 

    # calculate all intersected x coordinate 
    ax = [] 
    for x in arange(x_ceil, x_floor + 1, 1): 
      ax.append([ x, m * (x - x0) + y0 ]) 
    # calculate all intersected y coordinate 
    for y in arange(y_ceil, y_floor + 1, 1): 
      ax.append([ (y - y0) * (1./m) + x0, y ]) 
    return ax 

示例值:

intersected_points(1.5, 4.4, 0.5, 4.1); 

輸出:

[ 
    [2.0, 1.1206896551724137], 
    [3.0, 2.3620689655172411], 
    [4.0, 3.6034482758620685], 
    [1.9027777777777779, 1.0], 
    [2.7083333333333335, 2.0], 
    [3.5138888888888893, 3.0], 
    [4.3194444444444446, 4.0] 
] 

我得到的輸出是混合和未分選的值,因此,對於每一個單元座標,其中線穿過。 ,但我想應該是(包括邊界點)結果:(X0,Y0),所有的相交點,(X1,Y1) 其中X0,Y0 - INTIAL,X1,Y1 - 最後一點。其他值是相交的線座標!

+0

它看起來像你可以只追加'[X0,Y0]'和'[X1,Y1 ]'到'ax',然後在返回之前對'ax'進行排序。 – 2013-05-05 00:41:25

+0

我沒有看到你在哪裏計算*距離*。這裏距離 – 2013-05-05 01:13:32

+0

是,你發現像點之間的區別:(X1-X0),(X2-X1),(X3-X2),(X4-X3),...這是我想怎麼說。 – Spider 2013-05-05 16:52:40

回答

1

這是你的代碼的修改版本。它更多地使用numpy,並且它包含點的排序數組中的端點。

import numpy as np 

def intersected_points(x0, x1, y0, y1): 
    # slope 
    m = (y1 - y0)/(x1 - x0) 
    # Boundary of the selected points 
    x_ceil = np.ceil(min(x0, x1)) 
    x_floor = np.floor(max(x0, x1)) 
    y_ceil = np.ceil(min(y0, y1)) 
    y_floor = np.floor(max(y0, y1)) 

    # calculate all intersected x coordinate 
    x = np.arange(x_ceil, x_floor + 1) 
    y = m * (x - x0) + y0 
    ax = zip(x, y) 
    # calculate all intersected y coordinate 
    y = np.arange(y_ceil, y_floor + 1) 
    x = (y - y0)/m + x0 
    ax.extend(zip(x, y)) 
    ax.append((x0, y0)) 
    ax.append((x1, y1)) 
    ax.sort() 
    return np.array(ax) 


if __name__ == "__main__": 
    import matplotlib.pyplot as plt 

    x0, y0 = 1.5, 0.5 
    x1, y1 = 4.4, 4.1 

    points = intersected_points(x0, x1, y0, y1) 
    print points 

    rect = plt.Rectangle((x0, y0), x1 - x0, y1 - y0, 
         facecolor="#60ff60", alpha=0.2) 
    plt.gca().add_patch(rect) 
    plt.plot([x0, x1], [y0, y1], 'b-') 
    plt.plot(points[:, 0], points[:, 1], 'bo') 
    plt.grid(True) 
    plt.xticks(np.arange(np.floor(x0), np.ceil(x1))) 
    plt.yticks(np.arange(np.floor(y0), np.ceil(y1))) 
    plt.show() 

它打印:

[[ 1.5   0.5  ] 
[ 1.90277778 1.  ] 
[ 2.   1.12068966] 
[ 2.70833333 2.  ] 
[ 3.   2.36206897] 
[ 3.51388889 3.  ] 
[ 4.   3.60344828] 
[ 4.31944444 4.  ] 
[ 4.4   4.1  ]] 

和生成的情節:

plot of grid intersection points

+0

THanks沃倫爲修改後的代碼!經過計算croseed線長度後,我會計算兩點之間的距離。這將由畢達哥拉斯定理完成(沒問題)。另外,我還有另一個表示x,y軸長度的矩陣。 Let'say **矩陣(MxN)=(150x120)與一些隨機值**。 Matrix中的每一步都是250米,比方說0.25公里。問題是**分別計算矩陣(MxN)* intersected_line_length。是否可以不考慮**矩陣座標和線座標**之間的平衡?在此先感謝 – Spider 2013-05-05 10:47:02

+0

這聽起來像一個新的問題。也許表明一個完整的例子,你已經制定了「手動」,並詢問如何使用代碼完成它 - 如果你開始一個新的問題,它會,如果你給你正在試圖完成一個完整的例子幫助。 – 2013-05-05 13:37:17

+0

嗨,沃倫而我是測試一些其他值的代碼,我也遇到了這個問題。例如,x0,y0 = 0.6,0.21; x1,y1 = 0.78,0.65。此外,dx = 0.25而不是1,grid size_height和_width = 0.25,我得到了錯誤的值..如何解決? – Spider 2013-05-06 20:07:52