我有一个太阳能电池板指向某个方向(它是法线向量)。我想计算它与太阳当前位置之间的角度。我正在使用 pyephem,我有两对方位角和高度的信息。
panel_az = ephem.degrees('180')
panel_alt = ephem.degrees('45')
sun_az = ephem.degrees('245')
sun_alt = ephem.degrees('22')
找到面板法线向量和指向太阳的向量之间的角度的最简单方法是什么?
该库提供了一个separation()
函数,可以给出两个球坐标之间的角度;查看快速参考本部分底部附近:
http://rhodesmill.org/pyephem/quick.html#other-functions
我认为如果你跑步,你会得到你正在寻找的角度:
a = ephem.separation((panel_az, panel_alt), (sun_az, sun_alt))
print a
祝你好运!
首先将两者都转换为向量:
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
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