Python: поиск точки пересечения двух линий в полулогарифмическом масштабе - PullRequest
0 голосов
/ 07 мая 2020

У меня две линии на графике в полулогарифмическом масштабе. Line1 имеет зеленый цвет, а Line2 - темно-фиолетовый. Как найти точку пересечения между Line1 (зеленый) и Line2 (темно-фиолетовый)? Я пробовал формулу пересечения на основе Википедии ссылка , но она вернула красную линию.

import numpy as np
import matplotlib.pyplot as plt

xmin, xmax = 2000, 7000
ymin, ymax = 10, 50000

#lighting fixture limitation
cct_min = 2700
cct_max = 6000
illu_min = 110
illu_max = 2100

def findIntersection(x1,y1,x2,y2,x3,y3,x4,y4):
        px= ( (x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) ) 
        py= ( (x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) )
        return [px, py]

#arrays
x_grid = np.array([2000, 3000, 4000, 5000, 6000, 7000])
x = np.linspace(xmin, xmax)

#plot
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(xmin=xmin, xmax=xmax)
ax.set_ylim(ymin=ymin, ymax=ymax)
ax.set_yscale('log')
ax.axvline(x=4000, color='g', linestyle='-')
ax.plot([cct_min, cct_max],[illu_min,illu_max], color='darkviolet')
a,b = findIntersection(cct_min,illu_min,cct_max,illu_max,4000,10,4000,10000)
ax.axhline(y=b, color='r', linestyle='-')
plt.show()

intersection of two lines

Спасибо.

1 Ответ

1 голос
/ 07 мая 2020

Вы можете сначала преобразовать все ваши y позиции в пространство журнала, вычислить пересечение, а затем взять exp полученного py.

В случае вертикальных линий формулы можно упростить , но следующий подход должен работать для любого типа линий. Только будьте осторожны, все значения y должны быть строго положительными. И что входные линии не параллельны.

def findIntersection(x1, y1, x2, y2, x3, y3, x4, y4):
    y1 = np.log(y1)
    y2 = np.log(y2)
    y3 = np.log(y3)
    y4 = np.log(y4)
    denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    px = ((x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)) / denom
    py = ((x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)) / denom
    return [px, np.exp(py)]

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...