Te pongo un sencillo script que calcula la posición del sol según fecha, hora, latitud y longitud. También te da el Vector dirección: s=(x y, z).
Para calcular el área, dependerá lo difícil es hallar el área de la proyección del edificio sobre el plano perpendicular a, y dividirla por el seno de altitude. Si no me equivoco.
#*********************.
# posicionamiento del sol respecto a la hora solar.
# -.
#*********************.
Latitude =
S_latitude = Latitude * pi/180.
Longitude =
S_longitude = longitude * pi/180.
Meridian = -2.
S_meridian = meridian * pi/180.
Tsolar = 1 (el +gmt).
Hour =.(0.23).
Month =. (1,2.12).
Day =.(1.31).
#-.
#/* Julián date (days into year) */.
#-.
Def jdate (month, day).
Mo_da = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334].
Return(mo_da[month-1] + day).
#-.
#/* solar time adjustment from Julián date */.
#-.
Def stadj(jd).
Return(0.170 * sin((4*pi/373) * (jd - 80)) - 0.129 * sin((2*pi/355) * (jd + 12 * (s_meridian - S_longitude) / pi).
#-.
#/* solar declination angle from Julián date */.
#-.
Def sdec(jd).
Return(0.4093 * sin((2*pi/36 * (jd - 81))).
#-.
#/* solar altitude from solar declination and solar time */.
#-.
Def salt(sd, st).
Return(así(sin(s_latitude) * sin(sd) - Cos(s_latitude) * cos(sd) * cos(st*(pi/12)))).
#-.
# /* solar azimuth from solar declination and solar time */.
#-.
Def sazi (sd, st).
Return(-atan2(cos(sd)*sin(st*(pi/12)), -cos(s_latitude)*sin(sd) - Sin(s_latitude)*cos(sd)*cos(st*(pi/12)))).
#-.
# main.
#-.
Jd = jdate (month, day).
Sd = sdec(jd).
If tsolar == 1:
St = hour.
Else:
St = hour + stadj(jd).
Altitude = salt(sd, st).
Azimuth = sazi (sd, st).
Print local solar time, st.
Print altitude, altitude*180/pi.
Print azimuth, azimuth*180/pi.
Print x,-sin(azimuth)*cos(altitude).
Print y,-cos(azimuth)*cos(altitude).
Print z, sin(altitude).