【问题标题】:Find the intersection points of two line created from list of points in python [duplicate]查找从python中的点列表创建的两条线的交点[重复]
【发布时间】:2019-12-17 13:11:22
【问题描述】:

我有一个列表和一个值,如下所示:

y = [5, 6, 7, 3, 8, 10, 5, 2, 8, 15]
y0 = 9

如果我绘图,那么我会低于绘图

为了绘图,我使用以下代码:

a = []
for i in range(len(y)):
    a.append(y0)
x = []
for i in range(len(y)):
    x.append(i)

l5 = list(zip(y, x))
print(l5)
l6 = list(zip(a, x))
print(l6)

plt.plot(x, y, '-')
plt.plot(x, a, '-')
plt.show()

从图中我可以看到有 3 个交叉点。如何获取交点的索引(x 轴的 x 值)?例如,在上面的图中,类似于 (4.2, 5.3, 8.1)。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    以下应该可以解决问题。它还处理 x 的分数。

    y = [
        5, 6, 7, 3, 8, 10, 5, 2, 8, 15,
        9, 10, 9, 9, 8, 9  # additional corner cases
    ]
    y0 = 9
    intersecting_x = [
        float(x + (y0 - y[x]) / (y[x+1] - y[x]) if y[x+1] != y[x] else x + 1)
        for x in range(len(y)-1)
        if y[x+1] == y0 or y[x] < y0 < y[x+1] or y[x] > y0 > y[x+1]
    ]
    print(intersecting_x)
    
    # [4.5, 5.2, 8.142857142857142, 10.0, 12.0, 13.0, 15.0]
    

    【讨论】:

      【解决方案2】:

      我认为这个简单的 sn-p 代码可以帮助你。

      y = [5, 6, 7, 3, 8, 10, 5, 2, 8, 15]
      y0 = 9
      
      fr = y[0]
      for i in range(1, len(y)):
          to = y[i]
          if fr <= y0 <= to or to <= y0 <= fr:
              y_delta = abs(to-fr)
              modifier = (y0-min(fr, to))/y_delta
              print("between", i-1, "and", i, "x =", i-1+modifier)
          fr = to
      

      【讨论】:

      • 虽然可以优化,但我不想让它变得过于复杂。
      • 注意,当交叉路口发生在下坡时,modifier 应该是 1-modifier。所以在 5 到 6 之间,应该是 5.2。
      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2020-06-10
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2021-10-26
      • 2017-09-26
      • 2020-04-01
      相关资源
      最近更新 更多