首页 > 解决方案 > 如何计算两条线之间的水平距离

问题描述

我有两组点 A 和 B。A 和 B 都有相同的 x 值,只是 y 值不同。例如,考虑 x 值为:

[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
   17, 18, 19]

对于 A,给定的 y 值为:

[ 4,  1,  2,  7,  8,  8,  6, 11,  7, 10, 11, 15, 14, 14, 13, 17, 17,
   21, 22, 20]

对于 B,给定的 y 值为:

 [ 3,  0,  1,  6,  3,  6,  9, 11,  8,  8, 11, 15, 14, 15, 17, 14, 18,
   17, 18, 20]

在 A 和 B 中的连续点之间绘制直线。

对于每个 x 值(在此示例中为 0 到 19),我想知道从 A 到 B 的线之间的水平直线距离,始终向右。这张图片给出了一个示例,其中我为 x = 0, 1, 2, 3 绘制了水平线。

在此处输入图像描述

对于某些点,例如在 x = 6 处,没有与线 A 点 (6, 6) 右侧的水平线相交。在这种情况下,代码只能报告 False 或 -1。

如何实施?

标签: python

解决方案


您可以使用zip获取系列中的点对,并使用(y2-y1)/(x2-x1)=constant直线上任意点对的公式找到交点。

(编辑:感谢这里的另一个答案,我注意到我们还必须处理水平线段,否则会导致除以零错误。)

def find_horizontal_intersection(y, points):
    """ Return the x coordinate at which the straight line segments linking a series
        of points first intersect the horizontal line y=y

        Returns None if there is no intersection.
    """
    for (x1, y1), (x2, y2) in zip(points, points[1:]):
        if y1 == y2:   # if the segment is itself horizontal
            if y == y1:
                return x1
        elif y1 <= y <= y2 or y2 <= y <= y1: # Check the horizontal intersects this segment at all
            return (x2-x1) * (y-y1) / (y2-y1) + x1
    
A = [ 4,  1,  2,  7,  8,  8,  6, 11,  7, 10, 11, 15, 14, 14, 13, 17, 17, 21, 22, 20]
B = [ 3,  0,  1,  6,  3,  6,  9, 11,  8,  8, 11, 15, 14, 15, 17, 14, 18, 17, 18, 20]        
b = list(enumerate(B)) # b is a list of coords [(0, 3), (1, 0), (2, 1)...]

for x, y in enumerate(A):
    bx = find_horizontal_intersection(y, b[x:])
    if bx is None:
        print("B does not intersect y=", y)
    else:
        print("B intersects y=", y, "at x=", bx, "; distance=", bx-x)

    

推荐阅读