Вычисление угла наклона с использованием координат - PullRequest
0 голосов
/ 03 ноября 2019

Мне нужно вычислить угол между двумя точками, скажем, A (x1, y1) и B (x2, y2). И текущий код, который я использую, выглядит следующим образом:

import math
direction = math.degrees(math.atan((y2 - y1) / (x2 - x1)))

Я попытался выполнить тот же код, используя следующий код:

x = np.asarray(data['x'])
y = np.asarray(data['y'])

direction = np.rad2deg(np.arctan2(y, x))

Здесь 'x' и 'y 'относятся к двум атрибутам, имеющим координаты.

Однако значения, которые я получаю для вычисления направления с использованием numpy, отличаются от вычислений, полученных с использованием пакета' math '.

Просто для предоставленияминимальное и максимальное значения-

data['x'].min(), data['x'].max()                                       
# (25.24, 803.85)

data['y'].min(), data['y'].max()                                       
# (21.44, 805.76)

Два распределения для 'x' и 'y' имеют почти нормальное распределение.

Как реализовать вычисление углов с использованием numpy?

Спасибо!

Пример данных-

data_d = 
{'time': [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
 'x': [405.31,
  405.3,
  405.29,
  405.27,
  405.27,
  405.27,
  405.31,
  405.38,
  405.46,
  405.54,
  405.63],
 'y': [417.07,
  416.86,
  416.71,
  416.61,
  416.54,
  416.49,
  416.37,
  416.27,
  416.13,
  415.93,
  415.84],
 'direction': [87.27368900609596,
  86.18592516571398,
  78.69006752595475,
  0.0,
  0.0,
  -71.56505117706985,
  -55.007979801450084,
  -60.25511870306028,
  -68.19859051363696,
  -45.00000000001809,
  -67.38013505194608],
 'direction_np_computation': [-134.1807285626706,
  -134.19444442862144,
  -134.2040441491018,
  -134.2095039258752,
  -134.21431600901414,
  -134.2177537199761,
  -134.2288323248442,
  -134.24065659640502,
  -134.2559407971113,
  -134.27535831135458,
  -134.2879109537407]}

data = pd.DataFrame(data_d)

Здесь столбец 'direction' вычисляется с помощью пакета 'math', а 'direction_np_computation' - с помощью кода-

# Reference point- Xr = 0 Yr = 0


# Get 'x' and 'y' attributes from 'data'- x = np.array(data['x']) y = np.array(data['y'])

# Compute direction from reference point with the coordinates- direction = np.rad2deg(np.arctan2(Yr - y, Xr - x))

Почему существует несоответствие между столбцами?

1 Ответ

1 голос
/ 03 ноября 2019

Сдается мне, что работает нормально. Из-за того, что я не вижу характер вашего массива координат numpy / pandas, я не могу дать вам точное решение

3 версии:

arctan

>>> direction = np.rad2deg(np.arctan((2-1)/(2-1)))
>>> direction
45.0

math

>>> direction = math.degrees(math.atan((2 - 1) / (2 - 1)))
>>> direction
45.0

arctan2

>>> direction = np.rad2deg(np.arctan2((2-1),(2-1)))
>>> direction
45.0

С поддельными данными (как я не вижу ваши данные), используя вашу функцию,

контрольная точка:

>>> Xr = 10
>>> Yr = 10

Проверьте направление к контрольной точке с помощью следующих координат:

>>> Xs = np.array([1,2,3,4,5,6])
>>> Ys = np.array([1,2,3,4,5,6])

Я ожидаю, что все они будут иметь направление 45 градусов

>>> direction = np.rad2deg(np.arctan2(Yr-Ys,Xr-Xs))
>>> direction
array([45., 45., 45., 45., 45., 45.])

РЕДАКТИРОВАТЬ

На основе предоставленных вами данных:

Кажется, вы были правы, считая, что есть другой результат.

Подробнее здесь: numpyОшибка arctan2 или проблемы с использованием?

при использовании np.arctan должно быть в порядке

модуль numpy

>>> direction = np.rad2deg(np.arctan(data.y/data.x))
>>> direction
0     45.819271
1     45.805556
2     45.795956
3     45.790496
4     45.785684
5     45.782246
6     45.771168
7     45.759343
8     45.744059
9     45.724642
10    45.712089
dtype: float64

математический МОДУЛЬ

>>> for i in range(10):
...     math.degrees(math.atan((data.y[i]) / (data.x[i])))
... 
45.81927143732942
45.805555571378584
45.79595585089821
45.79049607412479
45.78568399098587
45.782246280023934
45.771167675155795
45.75934340359498
45.744059202888714
45.72464168864543
>>> 

ПРИМЕЧАНИЕ

Будьте осторожны со знаком + -. Y2-Y1 / X2-X1 против Y1-Y2 / X1-X2 может дать другой результат, но в действительности оба верны. В нашем случае эти результаты составляют 45 градусов или -135 градусов. Они оба правы, только один из них по часовой стрелке

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