Угол между двумя парами азимута и высоты?

У меня есть солнечная панель, указывающая (это нормальный вектор) в каком-то направлении. Я хочу рассчитать угол между этим и текущим положением солнца. Я использую пифем, и у меня есть эта информация в двух парах азимута и высоты.

panel_az = ephem.degrees('180')
panel_alt = ephem.degrees('45')
sun_az = ephem.degrees('245')
sun_alt = ephem.degrees('22')

Как проще всего найти угол между вектором нормали панели и вектором, направленным на солнце?


person Mads Skjern    schedule 08.09.2013    source источник


Ответы (3)


Библиотека предлагает функцию separation(), которая дает угол между двумя сферическими координатами; посмотрите внизу этого раздела Краткого справочника:

http://rhodesmill.org/pyephem/quick.html#other-functions

Я думаю, вы получите нужный угол, если побежите:

a = ephem.separation((panel_az, panel_alt), (sun_az, sun_alt))
print a

Удачи!

person Brandon Rhodes    schedule 10.09.2013

Сначала преобразуйте оба в векторы:

z = sin(altitude)
hyp = cos(altitude)
y = hyp*cos(azimuth)
x = hyp*sin(azimuth)
vector = (x,y,z)

Затем вычислите угол между векторами (скажем, a и b), используя перекрестные и точечные произведения.

angle = atan2(norm(cross(a,b)), dot(a,b))

Для перекрестного использования:

def cross(a, b):
    c = [a[1]*b[2] - a[2]*b[1],
         a[2]*b[0] - a[0]*b[2],
         a[0]*b[1] - a[1]*b[0]]
    return c

Для точечного использования:

def dot(a, b):
    c = [ a[i] * b[i] for i in range(len(a)) ]
    return c

Для нормального использования:

def norm(a):
    mag = sqrt(sum(a[i]*a[i] for i in range(len(a))))
    c = [ a[i]/mag  for i in range(len(a)) ]
    return c
person Henk van der Laak    schedule 08.09.2013
comment
Думаю, это работает. Раньше я делал что-то подобное. Однако я надеялся на решение, которое не потребовало бы с моей стороны так много кода. PyEphem большой, поэтому я надеялся, что это можно вычислить с помощью некоторых вспомогательных функций. Кроме того, SciPy огромен, так что действительно ли нужно писать мое собственное определение пересечения, точки и нормы? - person Mads Skjern; 09.09.2013

person    schedule
comment
Для этого было бы полезно некоторое объяснение, а не просто дамп кода. - person Raidri; 28.04.2017