我在某个方向指向太阳能电池板(它是法线矢量)。我想计算它与太阳当前位置之间的角度。我正在使用pyephem,我有两对方位角和高度信息。
panel_az = ephem.degrees('180')
panel_alt = ephem.degrees('45')
sun_az = ephem.degrees('245')
sun_alt = ephem.degrees('22')
找到面板法线向量与指向太阳的向量之间的角度最简单的方法是什么?
答案 0 :(得分:5)
该库提供separation()
函数,该函数给出两个球坐标之间的角度;看看快速参考本部分底部附近:
http://rhodesmill.org/pyephem/quick.html#other-functions
我认为如果你跑步,你会得到你所寻求的角度:
a = ephem.separation((panel_az, panel_alt), (sun_az, sun_alt))
print a
祝你好运!
答案 1 :(得分:2)
首先将两者都转换为向量:
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
答案 2 :(得分:0)
clear,clc,clf;
for n=[15 46 74 105 135 166 196 227 258 288 319 349];
delta=23.45*(sind(360*(284+n)/365));
phi=31.2;
omega=acosd(-tand(phi).*tand(delta));
omega1=-omega:0.1:omega;
alt=(sind(delta).*sind(phi))+(cosd(delta).*cosd(omega1).*cosd(phi));
alt1=asind(abs(alt))
azm=(cosd(delta).*sind(omega1))./cosd(alt);
azm1=asind(azm)
plot(azm1,alt1,'b');hold on;
end
grid on
xlabel('Solar Azimuth');ylabel('Solar altitude');
text(0,85,'noon')
hold off