Расстояние между прямыми

Как получить угол между двумя линиями на графике? Шкала значения не имеет, т.к. полагаю что какие бы то ни было углы все равно будут на одном графике соотносится правильно.

В списке y значения графика. y = [5.6, 6.9, 6.1, 5.5, 5.6, 6.9, 6.1, 5.5] Ему соответствует список chouse заполнен 0-ми, а там где стоит 1 - означает конец линии из графика y, которое будем сравнивать со следующим. chouse = [0,1,0,0,1,0,0,0]

К примеру. Первая 1 стоит на 6.9. Сравнивать будем угол между линией 5.6-6.9 и следующую 6.9-6.1. То есть от начала и до конца линию "рисуем" в уме и сравниваем потом. Второй 1 соответственно сравнивает линию 5.5-5.6 и 5.6-6.9.

Вот пример какие углы пытаюсь найти:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

Ну, как-то так должно быть. Углы не соответствуют тому, что видно на вашем графике, потому что у вас масштабы осей разные. Для проверки что всё правильно, я подкрасил участвующие в расчёте отрезки и нарисовал точку в месте их соединения.

import numpy as np
import seaborn as sns
import matplotlib.pylab as plt

def angle_between(v1, v2):
    return np.degrees(np.arccos(np.dot(v1, v2) /
        (np.linalg.norm(v1) * np.linalg.norm(v2))))

y = [5.6, 6.9, 6.1, 5.5, 5.6, 6.9, 6.1, 5.5]
chouse = [0,1,0,0,1,0,0,0]

sns.lineplot(x = range(len(y)), y = y)

for i, f in enumerate(chouse):
    if not f:
        continue
    x11 = i
    x12 = i - 1
    y11 = y[x11]
    y12 = y[x12]
    x21 = i
    x22 = i + 1
    y21 = y[x21]
    y22 = y[x22]
    v1 = np.array([x12 - x11, y12 - y11])
    v2 = np.array([x22 - x21, y22 - y21])
    plt.plot([x11, x12], [y11, y12], 'g-')
    plt.plot([x11], [y11], 'b*')
    plt.plot([x21, x22], [y21, y22], 'g-')
    plt.plot([x21], [y21], 'b*')
    plt.plot([x12, x22], [y12, y22], 'b--')
    print(angle_between(v1, v2))

plt.ylim((3, 8)) # выравниваем масштаб осей!

Вывод:

88.90878377473736
133.2791851663271

введите сюда описание изображения

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

    angle = angle_between(v1, v2)
    if (y12 - y11) * (y22 - y21) > 0:
        angle = -angle
    print(angle)

Вывод:

-88.90878377473736
133.2791851663271
→ Ссылка