Calcular el área de la sombra que proyecta un modelo

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).

Ver más sobre el tema y los comentarios en el foro