2014-03-18 2 views
1

Я хочу знать, какое время, когда солнце находится на X градусов ниже/выше горизонта.рассчитать время, когда солнце находится на X градусов ниже/выше Горизонта

Например, я хочу найти время, когда солнце находится на 19,75 градуса ниже горизонта. Я думаю, что это имеет какое-то отношение к зениту в функции date_sunrise/date_sunset, но я не уверен.

Заранее благодарен!

+1

Вы найдете большинство алгоритмов [здесь] (http://en.wikipedia.org/wiki/ Position_of_the_Sun), но вам также нужна дата и положение на поверхности земли, а также высота –

+0

@MarkBaker Эй! Я нашел много уравнений на веб-странице, но не смог найти уравнение, где я даю ему градусы ниже/выше горизонта. Не могли бы вы мне помочь? – kfirba

+0

btw вам нужна визуальная, физическая или геометрическая позиция Солнца? (см. атмосферное преломление, время прохождения света составляет 8 мин, поэтому вы видите позицию за последние 8 минут), какая точность вам нужна (если большой, то вам также нужны аберации) – Spektre

ответ

1
  1. собирать Sun ephemerids данные за день вам нужно

    принять 1 часы шагов и получить Солнца позиции в азимутальной координате геотег вам нужно. Либо использовать уравнения вы нашли или использовать некоторые веб-службы, как:

    • JPL Horizons не нравится это, поскольку они используют некоторые странные отсчета выходные, которые не соответствуют моим измерениям, но это, скорее всего, я что-то неправильно преобразование по пути ...
    • Presov observatory Это мой любимый (но он на словацком) выходе легко копируется в шахтные двигатели, а выход соответствует шахтным наблюдениям, вычислениям, оценкам и измерениям. Просто заполните:

      • гео-расположение (Miesto pozorovania)
      • дата, время (ИГД čas pozorovania)
      • в нижней части слева направо: интервал [дней], интервал шага [дней]
      • нажмите на кнопку для Солнца (Slnko), Луны (Mesiac), Planets (Планеты)

    есть много таких страниц там просто смотреть, но всегда проверяйте, если они выводят Corre ct данных. Я использую законы Келлера/уравнения, формирующие планетарные движения (более низкая точность, но для Земли-Солнца должно быть ОК). В настоящее время двигатели используют гравитационную модель вместо (но это нестабильно более длительного времени от эпохи)

  2. обрабатывать данные в виде набора 3D точек вдоль ломаной линии (азимут, высота, время)

  3. теперь просто найти в данных 2 балла

    один под нужный угол и следующий выше желаемый угол. Точки будки должны быть соседними.Если какая-либо точка находится на желаемый угол, то у вас уже есть решение так остановить

  4. интерполировать угол высоты времени пересечения

    enter image description here

    так, если требуемый угол высота b и хотел время t затем :

    • a0, a1 являются азимутальными углами
    • b0, b1 по высоте углов
    • t0, t1 времена

    то просто решить эту линейную систему:

    b=b0+(b1-b0)*u 
    t=t0+(t1-t0)*u 
    

    так, если я не сделал некоторые глупые ошибки:

    t=t0+((t1-t0)*(b-b0)/(b1-b0)) 
    

[Примечания]

, если вам не нужно слишком высокая точность (и использование выше 100 лет) и географическое положение фиксировано, то вы можете стол целого года и использовать эти данные периодически. Таким образом, вам не понадобится шаг 1 во время выполнения.

[Edit1] закон Кеплера

если вы хотите идти таким образом выглядеть here. Вам понадобятся орбитальные и вращательные параметры Земли. Они извлечены из шахты эфемерид двигателя * .ini для солнечной системы:

[Earth] 
txr_map=Earth_Map.jpg 
txr_nor=Earth_Normal.jpg 
txr_clouds=Earth_Cloud.jpg 
txr_lights=Earth_Light.jpg 
txr_ring_map= 
txr_ring_alpha= 
is_star=0 
mother=Sun 
re=6378141.2 
rp=6356754.79506139 
r0=-1 
r1=-1 
ha=60000 
vd=250000 
B0r=0.1981 
B0g=0.4656 
B0b=0.8625 
B0a=0.75 
t0=-0.0833333333333333 ; this means 1.1.2000 00:00:00 UT 
a=149597896927.617 
da=-0.122872993839836 
e=0.01673163 
de=-1.00232717316906E-9 
i=-9.48516635288838E-6 
di=-6.38963964003634E-9 
O=-0.004695 
dO=-1.15274665428334E-7 
o=1.79646842620403 
do=1.51932094052745E-7 
M =1.7464 
dM =0.0172021242603194 
ddM=0 
rota0 =3.0707963267949 
rotda =6.30038738085328 
prea0 =1.5707963267949 
preda =-6.68704522111755E-7 
prei =0.409124584728753 
predi =0 
nuta =0 
nutda =0 
nutia =0 
nutdia=0 
nutii =0 
nutdii=0 

и вот объяснение:

[Name]  [string id] object ID name 
txr_map  [filename] surface texture 
txr_nor  [filename] surface normal/bump texture 
txr_clouds [filename] cloud blend texture (white cloud, black clear sky) 
txr_lights [filename] night surface texture 
txr_ring_map [filename] rings color texture 
txr_ring_alpha [filename] rings alpha texture (alpha0 transparent, alpha1 solid) 
is_star  [0/1] is star ? 
mother  [string] "" or owner object name 
re  [m] equator radius 
rp  [m] polar radius 
r0  [m] -1 or rings inner radius 
r1  [m] -1 or rings outer radius 
ha  [m] 0 or atmosphere thickness 
vd  [m] -1 or atmosphere view depth 
B0r  <0,1> star R light or atmosphere color 
B0g  <0,1> star G light or atmosphere color 
B0b  <0,1> star B light or atmosphere color 
B0a  <0,1> overglow of star below horizont 
t0  [day]  t0 time the parameters are taken after 1.1.2000 00:00:00 
a  [m]  a main semiaxis 
da  [m/day] a change in time 
e  [-]  e eccentricity 
de  [-/day] e change in time 
i  [rad]  i inclination 
di  [rad/day] i change in time 
O  [rad]  O (node n) position of inclination axis 
dO  [rad/day] O node shift (pi2/T) 
o  [rad]  o perihelium (no change in inclination position) 
do  [rad/day] o perihelium shift (pi2/T) 
M  [rad]  M rotation around owner position in t0 
dM  [rad/day] dM orbital rotation (pi2/draconic month) 
ddM0  [rad/day^2] dM change in time 
rota0  [rad]  rota0 rotation around self axis position in t0 
rotda  [rad/day] rotda mean rotation around self axis 
prea0  [rad]  prea rotation axis position in t0 
preda  [rad/day] preda precession rotation (pi2/Platonic year) 
prei  [rad]  prei equator inclination to ecliptic 
predi  [rad/day] prei change in time 
nuta  [rad]  nuta angle position on nutation ellipse 
nutda  [rad/day] nutation rotation (pi2/T) 
nutia  [rad]  nutia nutation (of rotation axis) ellipse semiaxis axis in ecliptic plane 
nutdia  [rad/day] nutia change in time 
nutii  [rad]  nutii nutation (of rotation axis) ellipse semiaxis axis in rotation axis direction 
nutdii  [rad/day] nutii change in time 

игнорировать is_star, текстуры, кольцо и параметры атмосферы.Так:

  1. получить ВС в положение (0,0,0) в декартовых координатах
  2. положения вычислить Земли (x,y,z) из закона Кеплера

    ВС затем (-x,-y,-z) в геоцентрических координатах

  3. повернуть назад суточным вращением, прецессия , нутация (-x,-y,-z) -> (x',y',z')

  4. вычислить NEH рамка для геолокации (North,East,High(Up))
  5. новообращенного (x',y',z') в НФИ локальные координаты (xx,yy,zz)
  6. вычислить:

    azimut=atanxy(-xx,-yy) 
    height=atanxy(sqrt((xx*xx)+(yy*yy)),-zz) 
    

    и что это такое

здесь моя Heliocentric позиция вычисления астро тела:

void astro_body::compute(double t) 
    { 
     // t is time in days after 1.1.2000 00:00:00 
     // double pos[3] is output heliocentric position [m] 
     // reper rep is output heliocentric position [m] and orientation transform matrix (mine class) where Z is rotation axis (North pole) and X is long=0,lat=0 

    rot_a.compute(t); // compute actual value for orbital parameters changing in time 
    pre_a.compute(t); // the actual parameter is in XXX.a you can ignore this part 
    pre_i.compute(t); 
    nut_a.compute(t); 
    nut_ia.compute(t); 
    nut_ii.compute(t); 

// pre_a=pre_a0+(pre_da.a*dt)+(nut_ia*cos(nut_a)); // some old legacy dead code 
// pre_i=pre_i0+(pre_di.a*sin(pre_e))+(nut_ii*sin(nut_a)); 

    rep.reset(); // rep is the transform matrix representing body coordinate system (orientation and position) 
    rep.lrotz(pre_a.a); // local rotation around reps Z axis by pre_a.a [rad] angle 
    rep.lroty(pre_i.a); 
    rep.lrotx(nut_ia.a*cos(nut_a.a)); 
    rep.lroty(nut_ii.a*sin(nut_a.a)); 
    rep.lrotz(rot_a.a); 

    a.compute(t); // the same as above can ignore this part 
    e.compute(t); 
    i.compute(t); 
    O.compute(t); 
    o.compute(t); 
    M.compute(t); 
    M.compute(t); 

    double c0,c1,c2,sO,si,cO,ci,b;  // trajectory constants 
    double x,y; 
    int  q; 

    if (e.a>=1.0) e.a=0; 
    c0=sqrt((1.0-e.a)/(1.0+e.a));  // some helper constants computation 
    c1=sqrt((1.0+e.a)/(1.0-e.a)); 
    c2=a.a*(1-e.a*e.a); 
    sO=sin(O.a); 
    cO=cos(O.a); 
    si=sin(-i.a); 
    ci=cos(-i.a); 
    b=a.a*sqrt(1.0-e.a); 

    M.a-=o.a;       // correction 
    M.a=M.a-pi2*floor(M.a/pi2); 
    E=M.a; 
    for (q=0;q<20;q++) E=M.a+e.a*sin(E); // Kepler's equation 
    V=2.0*atan(c1*tan(E/2.0)); 
    r=c2/(1.0+e.a*cos(V)); 
    pos[0]=r*cos(V+o.a-O.a); // now just compute heliocentric position along ecliptic ellipse 
    pos[1]=r*sin(V+o.a-O.a); // and then rotate by inclination 
    pos[2]=-pos[1]*si; 
    pos[1]=+pos[1]*ci; 
    x=pos[0]; y=pos[1]; 
    pos[0]=x*cO-y*sO; 
    pos[1]=x*sO+y*cO; 

    if ((mother>=0)&&(tab!=NULL)) vector_add(pos,pos,tab[mother].pos); // if satelite like Moon add owners position 
    rep.gpos_set(pos); // set the global position to transform matrix also 
    } 
//--------------------------------------------------------------------------- 

reper класс довольно сложный (что-то вроде GLM), единственное, что вам нужно от него - это локальные вращения (все остальные вещи являются базовыми). это как lrotx работы:

double c=cos(ang),s=sin(ang); 
double rot[16],inv[16]; // rot is the rotation around x transform matrix 
rot=(1, 0, 0, 0, 
     0, c,-s, 0, 
     0, s, c, 0, 
     0, 0, 0, 1); 
inv=inverse(rep); // inverse is inverse matrix 4x4 
inv=inv*rot 
rep=inverse(inv); 
  • rep является вход и выход матрицы
  • ang угол поворота [рад]

теперь вы можете использовать респ конвертировать в/из Земли локальная система координат

  • LCS to GCS (l2g) ... (gx,gy,gz)=rep*(lx,ly,lz)
  • GCS к ЛВПУ (g2l) ... (lx,ly,lz)=inverse(rep)*(gx,gy,gz)

локальный является системой координат Земли и система координат глобальной компании Sun

 Смежные вопросы

  • Нет связанных вопросов^_^