Рассчитать угол (градус) прямой - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь определить угол в градусах прямой из двух точек, я сталкивался со многими решениями онлайн, но ни одно из них не помогло мне, рассмотрим этот фрагмент кода

import matplotlib.pyplot as plt
data = np.array([7405.,7447.4,7433.99,7410.,7443.15,7429.4,7590.03,7550.,7566.32,7619.62,7549.71,7551.8,7530,7522.99,7499.75,7453.99,7542.16,7564.,7552.77,7552])
y = [7606.672474,7570.240928]
plt.plot(data)
plt.plot([6,17], y)
plt.show()

enter image description here

Целевая линия равна y, она должна быть около -5 градусов, просто взглянув на нее. Похоже, что большинство онлайн-решений предполагают, что мы можем найти угол, выполнив

degree = np.math.atan2(y[-1] - y[0], x[-1] - x[0])
degree = np.degrees(degree)

. Я упустил другие значения y только для первой и последней точки для простоты, поэтому часть x[-1] - x[0] здесь будет равна 11 = 17-6, то есть длина линии y по оси x, это то, что предлагают большинство онлайн-решений, однако все подходы не смогли получить правильный угол для этого, я должен отметить, что во время моих испытаний некоторые подходы Казалось, что дает правильный угол для данного блока данных, например, при полном сбое в другом блоке данных, таком как

data = [52.3384984,53.04757978,52.04276249,51.77348257,49.93056673,52.24062341,55.74022485,60.77761392,60.89290148,60.1995072,60.40524964,59.00590344,59.67589831,56.49266698,49.02464746,51.53876823,57.77368203,59.48092106,56.63155446,56.0648491 ]
y = [51.337288,50.331895]
plt.plot(data)
plt.plot([3,15], y)
plt.show()

Я также пытался мин-макс нормализовать данные, но безуспешно, поэтому, учитывая у нас есть первая и последняя точка линии и ее длина, как мы можем или можем определить ее угол в градусах?

1 Ответ

2 голосов
/ 15 февраля 2020

Есть два угла, которые вам нужно понять. Первый рассчитывается на основе данных, второй рассчитывается на основе рисунка.

Первый

Код, который вы написали, вычисляет первый:

degree = np.math.atan2(y[-1] - y[0], x[-1] - x[0])
degree = np.degrees(degree)

Это delta_y = y[-1] - y[0] = -36.43, delta_x = x[-1] - x[0] = 11

degree = -73.20, что вполне имеет смысл, если вы рисуете в своем уме треугольник.

Второй

Однако вы можете спросить меня, что Вы смотрите линию около -5 градусов. Это вторая задача, которая включает в себя вычисление отношения отображения (обратите внимание, что ось y и ось x имеют разную единицу длины в дюймах). Здесь я нашел отдельный вопрос, который поможет вам вычислить это.

from operator import sub
def get_aspect(ax):
    # Total figure size
    figW, figH = ax.get_figure().get_size_inches()
    # Axis size on figure
    _, _, w, h = ax.get_position().bounds
    # Ratio of display units
    disp_ratio = (figH * h) / (figW * w)
    # Ratio of data units
    # Negative over negative because of the order of subtraction
    data_ratio = sub(*ax.get_ylim()) / sub(*ax.get_xlim())

    return disp_ratio / data_ratio

Таким образом, вам нужно умножить это соотношение, чтобы получить манхэттенское расстояние от конечных точек линии.

ax = plt.gca()
ratio = get_aspect(ax)
degree = np.math.atan2((y[-1] - y[0])*ratio, x[-1] - x[0])
degree = np.degrees(degree)

Результат -4,760350735146195, что составляет около -5.

...