Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Java in C umprogrammieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.05.2006, 10:00 Uhr
~Sunny
Gast


Hallo zusammen!

Ich bin neu hier und bin auch nicht sicher ob im richtigen Topic bin.

Ich bastle an einer Wetterstation rum und würde dabei gerne einige Daten bezüglich Sonnenstand in Matlab berechnen, und weiter dann die Formeln in C für einen Microcontroller weiterverwenden.
Leider sind meine C Programmierkenntnisse nicht so gut und in Java überhaupt keine. Deshalb bin ich auf der suche nach jemandem der Lust hätte die Formeln, die in Java geschrieben sind, in C umzuwandeln.
Anbei sollte jetzt der Quelltext erscheinen.
Besten Dank



Code:

// Formeln aus dem Javascript der digitalen Sonnenuhr
// nach Formeln und Tabellen aus
// Arnold Zenkert: Faszination Sonnenuhr,
// Verlag Harri Deutsch 1995, ISBN 3-8171-1386-2


// d,m =aktuelles Datum (3.Mai => d=3, m=5)
// lambda=geogr. Länge im Bogenmaß
// phi=gegr. Breite im Bogenmaß
// delta=Deklination der Sonne im Bogenmaß
// tau=Stundenwinkel der Sonne im Bogenmaß
// z=Zeitgleichung in Zeit-Minuten


//--------------------------------------------------
// Berechnung der Deklination für den d.Tag des Monats m eines Jahres
// Ergebnis in Grad; => delta=Ergebnis*(Pi/180)
// Zenkert, Tabelle ab S. 155
//--------------------------------------------------
function Deklination (d,m) {
  var dekl=new Array(
  // Deklination für den
  //  1.     6.    11.    16.    21.    26.  des Monats
   -23.1, -22.6, -21.9, -21.0, -20.0, -18.8,
   -17.3, -15.8, -14.2, -12.5, -10.8,  -8.9,
    -7.8,  -5.9,  -3.9,  -2.0,   0.0,   2.0,
     4.3,   6.3,   8.1,   9.9,  11.7,  13.3,
    14.9,  16.4,  17.7,  19.0,  20.1,  21.0,
    22.0,  22.6,  23.1,  23.3,  23.4,  23.4,
    23.2,  22.8,  22.2,  21.5,  20.6,  19.1,
    18.2,  16.9,  15.4,  13.9,  12.3,  10.6,
     8.2,   6.7,   4.8,   2.9,   0.9,  -1.0,
    -3.0,  -4.9,  -6.8,  -8.7, -10.5, -12.3,
   -14.3, -15.8, -17.3, -18.6, -19.8, -20.8,
   -21.7, -22.4, -23.0, -23.3, -23.4, -23.4,
   -23.1
  );
  var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  var k=(d-1 - 5*Math.floor((d-1)/5))/5;
  return(dekl[i]+k*(dekl[i+1]-dekl[i]));
}

//--------------------------------------------------
// Berechnung der Zeitgleichung für den d.Tag des Monats m eines Jahres
// in Minuten (Das ist der Wert, um den jede Sonnenuhr wegen der elliptischen Erdbahn
// falsch geht (hängt von der Jahreszeit ab)
// Zenkert, Tabelle ab S. 155
//--------------------------------------------------
function Zeitgleichung (d,m) {
  var zgz=new Array(
  // Zeitgleichung für den
  //  1.     6.    11.    16.    21.    26.  des Monats
    -3.5,  -5.8,  -7.9,  -9.7, -11.3, -12.6, //Januar
   -13.6, -14.1, -14.3, -14.1, -13.7, -13.0,
   -12.4, -11.4, -10.1,  -8.7,  -7.3,  -5.8,
    -4.0,  -2.5,  -1.1,   0.2,   1.3,   2.2,
     2.9,   3.4,   3.7,   3.7,   3.5,   3.1,
     2.3,   1.5,   0.5,  -0.6,  -1.6,  -2.9,
    -3.7,  -4.6,  -5.4,  -6.0,  -6.3,  -6.5,
    -6.3,  -5.9,  -5.2,  -4.3,  -3.2,  -1.9,
    -0.2,   1.6,   3.3,   5.1,   6.9,   8.6,
    10.3,  11.7,  13.2,  14.4,  15.3,  16.0,
    16.4,  16.4,  16.0,  15.3,  14.2,  12.8,
    11.0,   9.1,   6.9,   4.5,   2.0,  -0.5,  //Dezember
    -3.5
  );
  var i=(m-1)*6+Math.floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  var k=(d-1 - 5*Math.floor((d-1)/5))/5;
  return(zgz[i]+k*(zgz[i+1]-zgz[i]));
}

//--------------------------------------------------
// Berechnet aus aktueller Uhrzeit, geogr. Länge lambda (0..tau..2*PI)
// und Zeitgleichung z den Stundenwinkel
// getUTCHours,getUTCMinutes,getUTCSeconds=Aktuelle Greenwich-Zeit (UTC)
// An einem Tage ändert sich der Stundenwinkel von 0h bis 24h Greenwich-Zeit
// dort gleichmäßig von -Pi über 0 (12h) bis +Pi
// Bei uns geht die Sonne pro Längengrad  um 4 Minuten früher auf => +4*b2g(lambda)
// (b2g: Umrechnung von lambda aus dem Bogenmaß ins Gradmaß)
// Dazu kommt noch die jahreszeitlich veränderliche Zeitgleichung
//--------------------------------------------------
function Date2Stundenwinkel (d,lambda,z) {
  var tau=
    Math.PI/(12*60*60)          // 12 Zeit-Stunden entsprechen Pi=180 Grad
    *(
      60*60*d.getUTCHours()       // Greenwich-Zeit (für lamda=0)
      +60*(
           d.getUTCMinutes()      
           +4*b2g(lambda)       // 1 Grad entspricht 4 Zeitminuten
           +z                   // Zeitgleichung in Minuten
          )
      +d.getUTCSeconds()
     )
     -Math.PI;                  // 12 Uhr entspricht 0 Grad
  if (tau<0){tau=tau+2.0*Math.PI}
  return(tau);
}


//--------------------------------------------------
// Berechnung des Sonnen-Azimuts (im Bogenmaß) aus geogr. Breite phi,
// Deklination delta und Stundenwinkel tau
// Zenkert S. 67
//--------------------------------------------------
function Azimut (phi, delta, tau){
  var k;
  with (Math) {    
    if (cos(tau)>=(tan(delta)/tan(phi))){k=0} else {k=1.0};
    var r=k*PI+atan(sin(tau)/(sin(phi)*cos(tau)-cos(phi)*tan(delta)));
    if (r>PI){r=r-2.0*PI};
    return(r);
  }
}

//--------------------------------------------------
// Berechnung der Sonnen-Höhe  (im Bogenmaß) aus geogr. Breite phi,
// Deklination delta und Stundenwinkel tau
// Zenkert S. 67
//--------------------------------------------------
function Hoehe (phi, delta, tau){
  with (Math) {    
    return(asin(sin(phi)*sin(delta)+cos(phi)*cos(delta)*cos(tau)))
  }
}

//--------------------------------------------------
<


Dieser Post wurde am 12.05.2006 um 11:45 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.05.2006, 11:02 Uhr
mauralix



Das ist nicht Java sondern Java-Script !!! Nicht verwechseln
--
nur olfaktorisch fassbar....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.05.2006, 11:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ansonsten wo liegt das genaue problem?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.05.2006, 12:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ich tippe mal das Hauptproblem dürften die Lookuptables sein, der rest ist ja fast nur abschreiben...


C++:
double dekl[] = {
  // Deklination für den
  //  1.     6.    11.    16.    21.    26.  des Monats
   -23.1, -22.6, -21.9, -21.0, -20.0, -18.8,
   -17.3, -15.8, -14.2, -12.5, -10.8,  -8.9,
    -7.8,  -5.9,  -3.9,  -2.0,   0.0,   2.0,
     4.3,   6.3,   8.1,   9.9,  11.7,  13.3,
    14.9,  16.4,  17.7,  19.0,  20.1,  21.0,
    22.0,  22.6,  23.1,  23.3,  23.4,  23.4,
    23.2,  22.8,  22.2,  21.5,  20.6,  19.1,
    18.2,  16.9,  15.4,  13.9,  12.3,  10.6,
     8.2,   6.7,   4.8,   2.9,   0.9,  -1.0,
    -3.0,  -4.9,  -6.8,  -8.7, -10.5, -12.3,
   -14.3, -15.8, -17.3, -18.6, -19.8, -20.8,
   -21.7, -22.4, -23.0, -23.3, -23.4, -23.4,
   -23.1
  };


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 12.05.2006 um 12:53 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.05.2006, 13:48 Uhr
ao

(Operator)


Wenns in einen Mikrocontroller soll - was für ein Typ ist das und wieviel Speicher hat der?

Die Tabellen sind jeweils gut ein halbes KB groß, so viel RAM haben viele Controller gar nicht. D.h., die Tabellen dürfen keine Stackvariablen sein, sondern müssen entweder global oder mit "static" deklariert werden, damit sie im Flash landen

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.05.2006, 23:08 Uhr
~irgendwer
Gast


Hallo

Wie ich sehe, hast Du meinen Rat befolgt und hier gepostet. Ich habe hier mal einen Entwurf, weiss aber nicht ob der das richtige zurückliefert. Kompilier das ganze mal und lass die Test durchlaufen und vergleich es mit deinen Berechnungen.
Ich habs mit DevCpp (http://sourceforge.net/projects/dev-cpp) getestet.


C++:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


// Formeln aus dem Javascript der digitalen Sonnenuhr
// nach Formeln und Tabellen aus
// Arnold Zenkert: Faszination Sonnenuhr,
// Verlag Harri Deutsch 1995, ISBN 3-8171-1386-2


// d,m =aktuelles Datum (3.Mai => d=3, m=5)
// lambda=geogr. Länge im Bogenmaß
// phi=gegr. Breite im Bogenmaß
// delta=Deklination der Sonne im Bogenmaß
// tau=Stundenwinkel der Sonne im Bogenmaß
// z=Zeitgleichung in Zeit-Minuten

#define PI 3.1415926535897932384626433832795


// Gemäss http://de.wikipedia.org/wiki/Bogenmass
double b2g(double lambda)
{
  return lambda*180.0/PI;
}


//--------------------------------------------------
// Berechnung der Deklination für den d.Tag des Monats m eines Jahres
// Ergebnis in Grad; => delta=Ergebnis*(Pi/180)
// Zenkert, Tabelle ab S. 155
//--------------------------------------------------
double Deklination (int d, int m) {
  int i;
  double k;
  double dekl[]={
  /* Deklination für den                                 */
  /*  1.     6.    11.    16.    21.    26.  des Monats  */
   -23.1, -22.6, -21.9, -21.0, -20.0, -18.8,
   -17.3, -15.8, -14.2, -12.5, -10.8,  -8.9,
    -7.8,  -5.9,  -3.9,  -2.0,   0.0,   2.0,
     4.3,   6.3,   8.1,   9.9,  11.7,  13.3,
    14.9,  16.4,  17.7,  19.0,  20.1,  21.0,
    22.0,  22.6,  23.1,  23.3,  23.4,  23.4,
    23.2,  22.8,  22.2,  21.5,  20.6,  19.1,
    18.2,  16.9,  15.4,  13.9,  12.3,  10.6,
     8.2,   6.7,   4.8,   2.9,   0.9,  -1.0,
    -3.0,  -4.9,  -6.8,  -8.7, -10.5, -12.3,
   -14.3, -15.8, -17.3, -18.6, -19.8, -20.8,
   -21.7, -22.4, -23.0, -23.3, -23.4, -23.4,
   -23.1
  };
  i=(m-1)*6+floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  k=(d-1 - 5*floor((d-1)/5))/5;
  return(dekl[i]+k*(dekl[i+1]-dekl[i]));
}

//--------------------------------------------------
// Berechnung der Zeitgleichung für den d.Tag des Monats m eines Jahres
// in Minuten (Das ist der Wert, um den jede Sonnenuhr wegen der elliptischen Erdbahn
// falsch geht (hängt von der Jahreszeit ab)
// Zenkert, Tabelle ab S. 155
//--------------------------------------------------
double Zeitgleichung (int d, int m) {
  int i;
  double k;
  double zgz[]={
  // Zeitgleichung für den
  //  1.     6.    11.    16.    21.    26.  des Monats
    -3.5,  -5.8,  -7.9,  -9.7, -11.3, -12.6, //Januar
   -13.6, -14.1, -14.3, -14.1, -13.7, -13.0,
   -12.4, -11.4, -10.1,  -8.7,  -7.3,  -5.8,
    -4.0,  -2.5,  -1.1,   0.2,   1.3,   2.2,
     2.9,   3.4,   3.7,   3.7,   3.5,   3.1,
     2.3,   1.5,   0.5,  -0.6,  -1.6,  -2.9,
    -3.7,  -4.6,  -5.4,  -6.0,  -6.3,  -6.5,
    -6.3,  -5.9,  -5.2,  -4.3,  -3.2,  -1.9,
    -0.2,   1.6,   3.3,   5.1,   6.9,   8.6,
    10.3,  11.7,  13.2,  14.4,  15.3,  16.0,
    16.4,  16.4,  16.0,  15.3,  14.2,  12.8,
    11.0,   9.1,   6.9,   4.5,   2.0,  -0.5,  //Dezember
    -3.5
  };
  i=(m-1)*6+floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist
  // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des
  // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen
  // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt.
  //
  k=(d-1 - 5*floor((d-1)/5))/5;
  return(zgz[i]+k*(zgz[i+1]-zgz[i]));
}

//--------------------------------------------------
// Berechnet aus aktueller Uhrzeit, geogr. Länge lambda (0..tau..2*PI)
// und Zeitgleichung z den Stundenwinkel
// getUTCHours,getUTCMinutes,getUTCSeconds=Aktuelle Greenwich-Zeit (UTC)
// An einem Tage ändert sich der Stundenwinkel von 0h bis 24h Greenwich-Zeit
// dort gleichmäßig von -Pi über 0 (12h) bis +Pi
// Bei uns geht die Sonne pro Längengrad  um 4 Minuten früher auf => +4*b2g(lambda)
// (b2g: Umrechnung von lambda aus dem Bogenmaß ins Gradmaß)
// Dazu kommt noch die jahreszeitlich veränderliche Zeitgleichung
//--------------------------------------------------
double Date2Stundenwinkel (double d_UTCHours, double d_UTCMinutes, double d_UTCSeconds, double lambda,double z) {
    /*
    double tau=
    PI/(12*60*60)          // 12 Zeit-Stunden entsprechen Pi=180 Grad
    *(
      60*60*d_UTCHours       // Greenwich-Zeit (für lamda=0)
      +60*(
           d_UTCMinutes      
           +4*b2g(lambda)       // 1 Grad entspricht 4 Zeitminuten
           +z                   // Zeitgleichung in Minuten
          )
      +d_UTCSeconds
     )
     -PI;                  // 12 Uhr entspricht 0 Grad
     */

  double tau=PI/(12.0*60.0*60.0)*(60.0*60.0*d_UTCHours+60.0*(d_UTCMinutes+4.0*b2g(lambda)+z)+d_UTCSeconds)-PI;
  if (tau<0)
  {
     tau=tau+2.0*PI;
  }
  return(tau);
}


//--------------------------------------------------
// Berechnung des Sonnen-Azimuts (im Bogenmaß) aus geogr. Breite phi,
// Deklination delta und Stundenwinkel tau
// Zenkert S. 67
//--------------------------------------------------
double Azimut( double phi, double delta, double tau){
    double k, r;
    
    if (cos(tau)>=(tan(delta)/tan(phi))){
       k=0;
    } else {
       k=1.0;
    }
    r=k*PI+atan(sin(tau)/(sin(phi)*cos(tau)-cos(phi)*tan(delta)));
    if (r>PI){r=r-2.0*PI;}
    return(r);
}

//--------------------------------------------------
// Berechnung der Sonnen-Höhe  (im Bogenmaß) aus geogr. Breite phi,
// Deklination delta und Stundenwinkel tau
// Zenkert S. 67
//--------------------------------------------------
double Hoehe (double phi, double delta, double tau){    
    return(asin(sin(phi)*sin(delta)+cos(phi)*cos(delta)*cos(tau)));
}

//--------------------------------------------------


int main(int argc, char *argv[])
{
  double lambda_b = 0.0;
  double lambda_g = 0.0;
  
  int d = 1; // 1.
  int m = 1; // Januar
  double deklination = 0.0;
  
  double zeitgl=0.0;
  
  double d_UTCHours   = 0.0;
  double d_UTCMinutes = 0.0;
  double d_UTCSeconds = 0.0;
  double d2sw = 0.0;
  double lambda = 0.0;
  double z = 0.0;
  
  double phi = 0.0;
  double delta = 0.0;
  double tau = 0.0;
  double azimut=0.0;
  
  double hoehe=0.0;
  
  puts("Teste b2g:");
  puts("----------");
  printf("lambda im Bogenmass [rad] eingeben:");
  scanf("%lf", &lambda_b);
  lambda_g = b2g(lambda_b);
  printf("b2g( %g rad ) => %g Grad\n\n", lambda_b, lambda_g);
  
  puts("Teste Deklination(d, m):");
  puts("------------------------");
  puts("d,m =aktuelles Datum (3.Mai => d=3, m=5)");
  printf("d eingeben:");
  scanf("%d", &d);
  printf("m eingeben:");
  scanf("%d", &m);
  deklination = Deklination(d,m);
  printf("Deklination( d=%d, m=%d ) => %g\n\n", d, m, deklination);
  
  puts("Teste Zeitgleichung (d, m):");
  puts("---------------------------");
  puts("d,m =aktuelles Datum (3.Mai => d=3, m=5)");
  printf("d eingeben:");
  scanf("%d", &d);
  printf("m eingeben:");
  scanf("%d", &m);
  zeitgl = Zeitgleichung(d,m);
  printf("Zeitgleichung( d=%d, m=%d ) => %g\n\n", d, m, zeitgl);
  
  puts("Teste double Date2Stundenwinkel (");
  puts("    int d_UTCHours,   => aktuelle Greenwich-Zeit (UTC) Stunden");
  puts("    int d_UTCMinutes, => aktuelle Greenwich-Zeit (UTC) Minuten");
  puts("    int d_UTCSeconds, => aktuelle Greenwich-Zeit (UTC) Sekunden");
  puts("    double lambda,    => lambda im Bogenmass");
  puts("    double z)         => Zeitgleichung" );
  puts("---------------------------------------------------------------");
  printf("d_UTCHours eingeben:");
  scanf("%lf", &d_UTCHours);
  printf("d_UTCMinutes eingeben:");
  scanf("%lf", &d_UTCMinutes);
  printf("d_UTCSeconds eingeben:");
  scanf("%lf", &d_UTCSeconds);
  printf("lambda eingeben:");
  scanf("%lf", &lambda);
  printf("z eingeben:");
  scanf("%lf", &z);
  d2sw = Date2Stundenwinkel(d_UTCHours, d_UTCMinutes, d_UTCSeconds, lambda, z);
  printf("Date2Stundenwinkel(\n");
  printf(" d_UTCHours = %g\n", d_UTCHours);
  printf(" m_UTCHours = %g\n", d_UTCMinutes);
  printf(" s_UTCHours = %g\n", d_UTCSeconds);
  printf(" lambda     = %g\n", lambda);
  printf(" z          = %g\n", z);
  printf("            => %g\n\n", d2sw);
  
  puts("Teste Azimut( phi, delta, tau):");
  puts("Teste  Hoehe( phi, delta, tau):");
  puts("-------------------------------");
  printf("phi eingeben:");
  scanf("%lf", &phi);
  printf("delta eingeben:");
  scanf("%lf", &delta);
  printf("tau eingeben:");
  scanf("%lf", &tau);
  azimut = Azimut( phi, delta, tau);
  hoehe = Hoehe( phi, delta, tau);
  printf("Azimut( phi=%g, delta=%g, tau=%g) => %g\n", phi, delta, tau, azimut);
  printf(" Hoehe( phi=%g, delta=%g, tau=%g) => %g\n\n", phi, delta, tau, hoehe);
  
  system("PAUSE");    
  return 0;
}



mod edit: BENUTZE DIE CPP TAGS SELBER

Dieser Post wurde am 12.05.2006 um 23:12 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.05.2006, 09:53 Uhr
sorry



Jungs und Mädels.....
Besten Dank, ich werde das ganze mal in ruhe mit Matlab ausprobieren...
und ja, die problematik lag an den unteschiedlichen befehlen zwischen java-script und C.
echt toll eure tips.
Nochmals danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: