Cómo dibujar un mapa del cielo?

¿Cómo dibujo un mapa de estrellas como este ?

Yo tengo:

  1. Una base de datos en estrella con coordenadas (ascensión recta y declinación)
  2. Coordenadas del observador (latitud, longitud)
  3. Hora de observación

Necesito una fórmula que considere estos parámetros.

  1. base de datos estelar

    google para:

    • BSC (Catálogo de estrellas shinys) ~ 10K estrellas hasta +6.5 mag (ojo desnudo)
    • Hipparcos ~ 118K estrellas hasta +12 mag (telescopios) y también tiene paralaje (coordenadas 3D) y muchos más
    • Hipparcos es el favorito. ambos se pueden descargar libremente en formato ASCII desde muchos servidores Astornomy solo google …
  2. planetas (cuerpos)

    Puede comstackr los parámetros orbitales necesarios de muchos sitios. Necesitará todos estos elementos orbitales, por ejemplo, aquí hay algunos

  3. simulación (calcular la posición en el tiempo)

    Para los planetas es solo obtener las efemérides de los planetas / satélites que se pueden hacer mediante el cálculo de la ecuación de Kepler

    M=Ee*sin(E) 

    dónde:

    M es ángulo medio (como si el planeta tuviera una trayectoria circular y una velocidad constante)
    E es un ángulo real desde el centro de la elipse (teniendo en cuenta la ley de Kepler)

    puedes resolverlo así:

     for (E=M,q=0;q<20;q++) E=M+e*sin(E); 

    Ahora sabes E para cualquier M que es todo lo que necesitas. Simplemente calcule la posición en la elipse y gírela por inclinación. La M se calcula también simplemente necesita saber el tiempo t0 cuando el planeta cruza el ángulo 0. Entonces:

     M = (t-t0) * dM 

    donde dM es la rotación alrededor de Sun. Si el tiempo es en días, entonces dM está en [rad/day] . Para la Tierra es 2.0*pi/tropical_year . Esto te llevará a todas las posiciones globales de los planetas (relativas al Sol)

    Kepler

    Para más información mira aquí Cómo calcular posiciones planetarias

  4. Vista de la tierra

    Las coordenadas equivalentes son relativas a la Tierra, por lo que debe agregar la rotación diaria de la Tierra a su simulación. Simplemente crea la matriz de transformación con un eje girado por 23.5 deg en la dirección "derecha" y agrega la rotación por este eje. También agregue rotación a su ubicación geográfica. Después de esto, traduce esta matriz a la posición de la Tierra calculada. A partir de esto es fácil convertir todas las coordenadas globales a la vista de su Tierra para que pueda trazar ahora los datos en la imagen / pantalla.

[Notas]

¡Ten cuidado con el período de rotación que utilizas!

  • El año tropical_year = 365.242195601852 days la Tierra tropical_year = 365.242195601852 days
  • Rotación del día de la Tierra dM = 0.0172021242603194 rad/day
  • el día es día solar malo !!! al igual que Julian date ...

    Calibre siempre sus datos con otro software o el real. Hay algunas librerías que hacen todo esto solo por google. Para mejorar la precisión, implementar la nutación, la precesión y los parámetros orbitales cambian con el tiempo.

[Edit1] ejemplo simple de C ++

Simplifiqué el ejemplo completo de C ++, así que solo se usan a a,b,M

captura de pantalla

 //--------------------------------------------------------------------------- void ellipse_kepler(double &x,double &y,double a,double b,double M) { int q; double c1,c2,e,E,V,r; e=1.0-((b*b)/(a*a)); // eccentricity if (e>=1.0) e=0; // wrong e c1=sqrt((1.0+e)/(1.0-e)); // some helper constants computation c2=a*(1-e*e); //b=a*sqrt(1.0-e); for (E=M,q=0;q<20;q++) E=M+e*sin(E);// Kepler's equation V=2.0*atan(c1*tan(E/2.0)); r=c2/(1.0+e*cos(V)); x=r*cos(V); // heliocentric ellipse y=r*sin(V); } //--------------------------------------------------------------------------- void draw() { scr.cls(clBlack); double x0,y0,x,y,a,b,M,r=5; // ellipse x0=scr.xs>>1; y0=scr.ys>>1; a=(x0*75)/100; b=(y0*35)/100; x0+=1.5*(ab); scr.bmp->Canvas->Pen->Color=clAqua; for (M=0.0;M<=2.0*M_PI;M+=M_PI*0.01) // small step so the ellipse trajectory is not edgy { ellipse_kepler(x,y,a,b,M); x+=x0; y+=y0; if (M<=1e-10) scr.bmp->Canvas->MoveTo(x,y); else scr.bmp->Canvas->LineTo(x,y); } scr.bmp->Canvas->Pen->Color=clAqua; scr.bmp->Canvas->Brush->Color=clYellow; scr.bmp->Canvas->Ellipse(x0-r,y0-r,x0+r,y0+r); scr.bmp->Canvas->Brush->Color=clBlue; for (M=0.0;M<=2.0*M_PI;M+=M_PI*0.05) // constant time step for the dots a bit bigger so not many dots are on one place { ellipse_kepler(x,y,a,b,M); x+=x0; y+=y0; scr.bmp->Canvas->Ellipse(xr,yr,x+r,y+r); } scr.rfs(); } //--------------------------------------------------------------------------- 

La primera función calcula la posición 2D (x,y) en la trayectoria heliocéntrica de Keplerian, mientras que a>=b son semiejes y M es el ángulo medio (ángulo lineal como el tiempo escalado a <0,2*Pi> por revolución anual). La segunda función solo representa la elipse con VCL / GDI, por lo que está claro cómo usar la primera utilizando un paso de tiempo constante para que se pueda ver cerca de la perihelia, el planeta se mueve más rápido ...