RA und Dec einem Sternbild zuordnen

Status
Es sind keine weiteren Antworten möglich.

PitWi

Aktives Mitglied
Kennt zufällig jemand einen Algorithmus (für mich am einfachsten wäre BASIC), wo man anhand von RA und Dec berechnen kann, in welchem Sternbild die Koordinaten liegen?
Notfalls tut es auch ein fertiges Programm oder Online-Dienst.

TheSky5 nervt, weil man h m s immer in extra Felder eingeben muss.
 
Hallo Peter,

dafür gibt es den sog. Roman-Algorithmus. Die einzelnen Dateien gibt es auch beim CDS, halte Dich bei der Suche nach ihnen an den Katalogbezeichner.

Wenn ich mich recht erinnere, muss man die gesuchten Koordinaten zunächst ins Äquinoktium 1875.0 präzedieren, weil die Grenzen der Sternbilder zu diesem Zeitpunkt RA- und Dec-parallel verliefen. Danach kommt dann die eigentliche Suche.

Gruß,
Tom
 
Hm,
einen Algorithmus kenn ich nicht direkt, aber ich kann dir eine Software empfehlen, die das anzeigt.
http://www.cybersky.com
...ist zwar schon etwas älter, dafür läufst schön schnell und du kannst da die Sternbildgrenzen einblenden, aber es zeigt dir auch so, in welchem Sternbild gerade der Cursor ist.
 
Hm,
einen Algorithmus kenn ich nicht direkt, aber ich kann dir eine Software empfehlen, die das anzeigt.
http://www.cybersky.com
...ist zwar schon etwas älter, dafür läufst schön schnell und du kannst da die Sternbildgrenzen einblenden, aber es zeigt dir auch so, in welchem Sternbild gerade der Cursor ist.
Ist ein nettes kleines Programm aber nützt mir nicht, weil ich die Koordinaten eingebe und dann sehen möchte, zu welchem Sternbild der Punkt gehört und bei CyberSky muss ich - wie bei TheSky5 - h m s in extra Felder eingeben. Ist sehr umständlich.
Noch lieber wäre mir natürlich ich könnte einen Algorithmus durch meine Datenbank laufen lassen.
 
Die Präzesson von heute nach 1875 rechne ich mit den Routinen aus "Astronomie mit dem Personal Computer" um. Natürlich findest Du sowas auch in anderen Quellen, aber in APC ist alles schon in C++ (bzw. Pascal in der zweiten Auflage) formuliert.

Ansonsten konnte ich den Roman-Algorithmus damals (für E&T) nahezu 1:1 von der C-Version nach C++ umsetzen. Ich habe allerdings auf eine externe Eingabedatei verzichtet und die Daten in geeigneten Strukturten im Programm selbst abgelegt (weil eine nicht erforderliche Eingabedatei niemals fehlen kann).

Gruß,
Tom
 
@tompfleger,

ok, ich hab die "constel.c" -Datei aufgemacht und reingeschaut.
Das einzigste, was ich daran verstehe ist das Array

/* The Constellation Boundaries as extracted from Cat.#6042,
paper by N.G. Roman, 1987PASP...99..695R
*/
static ROW data[] = {
{ 0, 360, 90, "" }, /* North Pole */
{ 0.0000,360.0000, 88.0000,"UMi"},
{120.0000,217.5000, 86.5000,"UMi"},
{315.0000,345.0000, 86.1667,"UMi"},
{270.0000,315.0000, 86.0000,"UMi"},
{ 0.0000,120.0000, 85.0000,"Cep"},
{137.5000,160.0000, 82.0000,"Cam"},
{ 0.0000, 75.0000, 80.0000,"Cep"},
{160.0000,217.5000, 80.0000,"Cam"},
...usw..

Wobei, so wie ich das sehe, das Array 4 Elemente pro reihe hat.
Das Erste ist wohl die Start RA(in Dezimalgrad), dann die End-Rekastzension(in Dezimalgrad) und dann wahrscheinlich die Deklination (in Dezimalgard).
Zum Schluss dann die Abkürzung des Sternbilds "UMa" zb ect..
Aber wie ermittelt man dann das Sternbild aus den Daten? Kann man sich das wie Dreiecke vorstellen??

Sry, ich bin da Leie:).
 
Hi,

der Sourcecode in C liegt auf dem FTP-Server des CDS, Link steht oben auf der Katalogseite. Hier kommt er:

Code:
/* This program is a translation with a few adaptations of the 
   Fortran program.f, made by FO @ CDS  (francois@simbad.u-strasbg.fr)  
   in November 1996.
   On a Unix station, don't forget the -lm flag, i.e. create the program by:
   cc program.c -o program -lm
*/

#include <stdio.h>	/* Standard i/o functions */
#include <string.h>	/* for strchr routine     */
#include <ctype.h>      /* for isgraph, isspace   */
#include <math.h>       /* All mathematics        */
#define DCOS	cos
#define DSIN	sin
#define DATAN2	atan2
#define DASIN	asin

#define X1(i)	x1[i-1]
#define X2(i)	x2[i-1]
#define R(i,j)	r[i-1][j-1]

void HGTPRC(RA1,DEC1,EPOCH1,EPOCH2,RA2,DEC2)
/*------------------------------------------
C      HERGET PRECESSION, SEE P. 9 OF PUBL. CINCINNATI OBS. NO. 24
C INPUT=  RA1 AND DEC1 MEAN PLACE, IN RADIANS, FOR EPOCH1, IN YEARS A.D.
C OUTPUT= RA2 AND DEC2 MEAN PLACE, IN RADIANS, FOR EPOCH2, IN YEARS A.D.
--------------------------------------------*/
  double *RA1, *DEC1, *EPOCH1, *EPOCH2, *RA2, *DEC2 ;
{
  static double CDR = 0.17453292519943e-01 ;
  static double EP1=0, EP2=0 ;
  static double x1[3],x2[3],r[3][3], 
	T,ST,A,B,C,CSR,SINA,SINB,SINC,COSA,COSB,COSC ;
  int i, j;
    /* Compute input direction cosines */
    A=DCOS(*DEC1) ;
    X1(1)=A*DCOS(*RA1) ;
    X1(2)=A*DSIN(*RA1) ;
    X1(3)=DSIN(*DEC1) ;
    /* Set up rotation matrix (R) */
    if(EP1 == *EPOCH1 &&  EP2 == *EPOCH2) ;
    else {
      EP1 = *EPOCH1 ; EP2 = *EPOCH2 ;
      CSR=CDR/3600. ;
      T=0.001*(EP2-EP1) ;
      ST=0.001*(EP1-1900.) ;
      A=CSR*T*(23042.53+ST*(139.75+0.06*ST)+T*(30.23-0.27*ST+18.0*T)) ;
      B=CSR*T*T*(79.27+0.66*ST+0.32*T)+A ;
      C=CSR*T*(20046.85-ST*(85.33+0.37*ST)+T*(-42.67-0.37*ST-41.8*T)) ;
      SINA=DSIN(A) ;
      SINB=DSIN(B) ;
      SINC=DSIN(C) ;
      COSA=DCOS(A) ;
      COSB=DCOS(B) ;
      COSC=DCOS(C) ;
      R(1,1)=COSA*COSB*COSC-SINA*SINB ;
      R(1,2)=-COSA*SINB-SINA*COSB*COSC ;
      R(1,3)=-COSB*SINC ;
      R(2,1)=SINA*COSB+COSA*SINB*COSC ;
      R(2,2)=COSA*COSB-SINA*SINB*COSC ;
      R(2,3)=-SINB*SINC ;
      R(3,1)=COSA*SINC ;
      R(3,2)=-SINA*SINC ;
      R(3,3)=COSC ;
    }
    /* Perform the rotation to get the direction cosines at epoch2 */
    for (i=1; i<=3; i++) {
      X2(i)=0. ;
      for (j=1; j<=3; j++) X2(i)+=R(i,j)*X1(j) ;
    }
    *RA2=DATAN2(X2(2),X2(1)) ;
    if(*RA2 <  0) *RA2 = 6.28318530717948 + *RA2 ;
    *DEC2=DASIN(X2(3)) ;
    return ;
}

main()
/*-------------------------------------------------------
C PROGRAM TO FIND CONSTELLATION NAME  FROM A POSITION
C ---> Modified FO, CDS Strasbourg, DARSIN is NOT a standard F77 function...
C	... but DASIN !!!
C
C THE FIRST RECORD IN THE DATA SET MUST BE THE EQUINOX FOR THE POSITIONS
C  IN THE FORMAT XXXX.X
C THE REMAINING RECORDS MUST BE THE POSITION IN HOURS AND DECIMALS OF
C  AN HOUR FOLLOWED BY THE DECLINATION IN DEGREES AND FRACTIONS OF A
C  DEGREE IN THE FORMAT: F7.4,F8.4
C THE OUTPUT WILL REPEAT THE POSITION ENTERED AND GIVE THE THREE LETTER
C  ABBREVIATION OF THE CONSTELLATION IN WHICH IT IS LOCATED
C
-------------------------------------------------------*/
{
  char *CON ;
  static double CONVH = 0.2617993878;
  static double CONVD = 0.1745329251994e-01;
  static double PI4 = 6.28318530717948;
  static double E75 = 1875.;
  double ARAD,DRAD,A,D,E,RAH,RA,DEC,RAL,RAU,DECL,DECD;
  char buf[BUFSIZ], *p ;
  FILE *f2 ;
    f2 = fopen("data.dat", "r"); if (!f2) perror("data.dat") ;
    printf("  CONSTELLATION derived from POSITION for Equinox: ") ;
    gets(buf) ;
    E = atof(buf) ;
    if (!isatty(0)) puts(buf) ;
    while(1) {
      if (isatty(0)) printf("Enter the position (HH.hhhh+DD.dddd): "); 
      if (!gets(buf)) break ;
      if (!*buf) break ;
      p = strchr(buf, '+'); if (!p) p = strchr(buf, '-');
      if (!p) { 
	printf("****\aSign missing in: %s\n", buf); 
	continue ;
      }
      RAH = atof(buf); DECD = atof(p) ;
      /* PRECESS POSITION TO 1875.0 EQUINOX */
      ARAD = CONVH * RAH ;
      DRAD = CONVD * DECD ;
      HGTPRC(&ARAD,&DRAD,&E,&E75,&A,&D) ;
      if(A <  0.)A=A+PI4 ;
      if(A >= PI4)A=A-PI4 ;
      RA= A/CONVH ;
      DEC=D/CONVD ;

    /* FIND CONSTELLATION SUCH THAT THE DECLINATION ENTERED IS HIGHER THAN
       THE LOWER BOUNDARY OF THE CONSTELLATION WHEN THE UPPER AND LOWER
       RIGHT ASCENSIONS FOR THE CONSTELLATION BOUND THE ENTERED RIGHT
       ASCENSION
    */
      fseek(f2, 0, 0) ;
      while(fgets(buf, sizeof(buf), f2)) {
	for (p=buf; isspace(*p); p++) ;
	RAL = atof(p); while(isgraph(*p)) p++; while(isspace(*p)) p++ ;
	RAU = atof(p); while(isgraph(*p)) p++; while(isspace(*p)) p++ ;
	DECL= atof(p); while(isgraph(*p)) p++; while(isspace(*p)) p++ ;
	CON = p; while(isgraph(*p)) p++; *p = 0;
      	if(DECL >  DEC) continue ;
   	if (RAU <= RA) continue ;
   	if(RAL >  RA) continue ;
	/* if CONSTELLATION HAS BEEN FOUND, WRITE RESULT AND RERUN PROGRAM FOR
	   NEXT ENTRY.  OTHERWISE, CONTINUE THE SEARCH BY RETURNING TO RAU
	*/
      	if (RA >= RAL &&  RA <  RAU &&  DECL <= DEC) 
          printf(" RA =%8.4f Dec = %8.4f  is in Constellation: %s\n",
		RAH, DECD,CON);
        else if(RAU <  RA) continue ;
        else printf(" Constellation NOT FOUND for: RA =%8.4f Dec = %8.4f\n",
		RAH,DECD);
	break ;
      }
    }
    /* printf(" End of input positions after: RA = %7.4f   DEC = %8.4f\n", 
	RAH,DECD) ;
    */
    if (isatty(0)) puts("") ;
    printf("===============The Equinox for these positions is: %6.1f\n", E) ;
}

Außer dem ganzen Drumherum (Datei einlesen, satzweise durchlaufen) passiert nur ein Vergleich der Position mit den Daten, bis das Sternbild erfolgreich gefunden wurde. Wenn Du allen Ballast entfernst bleibt nicht viel "Fleisch" übrig. Der eigentliche Trick besteht in der geschickten Aufbereitung der Daten.

Gruß,
Tom
 
Super, danke für den Code.
Dann werd ich mal versuchen das in gutes, altes BASIC zu übersetzen. (Bin leider nie darüber hinaus gekommen.)
 
Status
Es sind keine weiteren Antworten möglich.
Zurück
Oben