Calcular el área de la sombra que proyecta un modelo

tirengarfio - 04/01/2007 14:03
Saludos. Tengo intención de hacer un programa que me calcule el área de la sombra que un edificio crea sobre el suelo a una determinada hora del día.
¿Pensáis que 3d Studio Max y alguna Api me podrían ayudará.

Tengo entendido que hay alguna aplicación que permite simular la luz en un determinado momento del día en cualquier parte del mundo.
¿Es cierto?
Klópes - 04/01/2007 14:30
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).
TBC3D - 04/01/2007 16:32
Hola, chicos, eso lo hace el max desde la versión 4 creo. Tu le dices: España-Zaragoza a las 14:35 de la tarde y el tipo te coloca el sol clavado, eso eso? Saludos.
tirengarfio - 05/01/2007 10:36

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

Gracias Klópes, pero este script ¿para qué aplicación es?
Klópes - 05/01/2007 10:42
Editado porque soy así de chulo.
Klópes - 05/01/2007 10:42

Gracias Klópes, pero este script ¿para qué aplicación es?

Así a bote pronto, para ninguna. Es Python, pero le he quitado las órdenes que, acceden a objetos para que quede casi como seudocódigo, para algo tan específico como lo que pides no te puedo ayudar más, lo siento. Simplemente tienes que traducirlo al lenguaje de tu programa y adaptarlo.

Como dice TBC3D, max ya tiene el cálculo solar implementado, sólo tienes que, acceder a la dirección del sol, ni siquiera necesitas ese script. La madre del cordero está en lo que te he dicho después, que no es poco trabajo, siento no poder ayudarte más, suerte.