python - 如何计算两条线之间的水平距离
问题描述
我有两组点 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。
如何实施?
解决方案
您可以使用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)
推荐阅读
- android - 如果 Coroutine 的 Deferred 类型为 null 会怎样?
- android - 当我单击登录按钮时如何创建加载屏幕并且页面应该重定向到仪表板?
- python - 引用使用 from django.contrib.auth.models import User 的模型时,任务作业出错
- c# - 配置生成器 - 在子文件夹中搜索 JSON 文件
- java - 为什么这段代码中有 3 个构造函数?
- php - 使用 PHP 的 Azure 事件中心
- javascript - Javascript:获取部分中所有元素的 ID
- php - 用于检查是否应执行类的 PHP 设计模式
- python - 无法使用max函数从python(runestone)中的dict获取具有最大值或最小值的键
- android - 如何在android中将应用程序音频文件与whatsapp音频文件分开