0

我正在计算 2D (x,y) 中 A(x0,y0) 和 B(x1,y1) 点之间的距离。

我有以下代码表示给定两个边界点 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 - 初始点,x1,y1 - 最终点。其他值是相交线坐标!

4

1 回答 1

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

并生成情节:

网格交点图

于 2013-05-05T01:12:17.550 回答