2015-10-21 2 views
1

Это мой текущий код:Пытаясь вычислить восход ... не получает правильный ответ

public class Sunpos { 
    final private double Pi = Math.PI; 
    final private double eul = 2.71828182845904523552 ; 
    final private double sonauf = 90; 
    final private double RAD = 0.017453292519943295769236907684886; 

public double sunrisefinal (double Breitengrad, double Laengengrad, int tagzahl, int sommerzeit, int nacht) { 

    double lngHour = Laengengrad/15; 
    double t = tagzahl + ((6 - lngHour)/24); 

    // double ab = tagzahl + ((18 - lngHour)/24); 
    double M = (0.9856 * t) - 3.289; 
    double L = M + (1.916 * Math.sin(M)) + (0.020 * Math.sin(2 * M)) + 282.634; 

     if (L >= 359) { L -= 360; } 
     else if (L < 0) { L += 360; } 

    double RA = (Math.atan(0.91764 * Math.tan(Pi/180)*L)); 

     if (RA >= 359) { RA -= 360; } 
     else if (RA < 0) { RA += 360; } 

    double Lquadrant = (Math.floor(L/90)*90); 
    double RAquadrant = (Math.floor(RA/90))*90; 
    RA = RA + (Lquadrant - RAquadrant); 
    RA = RA/15; 

    double sinDec = 0.39782 * Math.sin((Pi/180)*L); 
    double cosDec = (180/Pi)*(Math.cos(Math.asin(sinDec))); 
    double cosH = (Math.cos((Pi/180)*sonauf)-(sinDec*Math.sin((Pi/180)*Breitengrad)))/(cosDec * Math.cos((Pi/180)*Breitengrad)); 
    double H = 360 - Math.acos(cosH); 
    H /= 15; 

    double T = H + RA -(0.06571 * t) - 6.622; 
    double UTC = T - lngHour; 

     if (UTC >= 23) { UTC -= 24; } 
     else if (UTC < 0) { UTC += 24; } 

    double locTime = UTC; // Fuer die schweiz! 
    System.out.println(locTime); 
    return(0); 


} 

Входы являются следующие: (50, 10, 294, 1, 0). Последние 2 могут быть проигнорированы.

Сейчас я основывая это на следующей странице: http://williams.best.vwh.net/sunrise_sunset_algorithm.htm

Код должен быть завершен в соответствии с сайта, но я не получаю какой-либо предполагаемых результатов. На сегодня мне нужно 7,5, но я получаю 9.358.

Теперь это может быть из-за чего-то с радиантами/градусами? Я не могу вникать в этот ум, поскольку я пытался вставить эти конвертеры (Pi/180) в код без какого-либо полезного результата.

Может ли кто-нибудь сказать мне, где их поставить или указать мне в правильном направлении? Я потратил waaaay слишком много времени на это уже, и теперь я так близко.

+1

как небольшое слово совета - в то время как это не имеет большого значения для компилятора так долго, как только код технически корректен, ваш стиль синтаксиса очень затрудняет легко прочитать ваш код и выявить любые ошибки. Добавьте некоторый интервал между строками логических блоков кода, не произвольно отступайте от фрагментов кода, а не других, и т. Д. Читаемость намного лучше, чем краткая краткость. – SnakeDoc

+2

Это слишком много, чтобы спросить SO, чтобы отлаживать такой алгоритм :) Но вот алгоритм восхода/захода солнца, который я портировал на Java, который работает (для моего собственного тестирования) - https://gist.github.com/zhong -j-yu/2232343b14a5b5ef5b9d – ZhongYu

+1

@SnakeDoc Ive отредактировал и добавил некоторые пробелы. Я просто работаю в течение нескольких часов, и я очень устал думать об этом. Сожалею! – Redimo

ответ

2

Я только после моего осуществления здесь в случае, если люди нуждаются в его (портированы из того же источника, что и ваш)

https://gist.github.com/zhong-j-yu/2232343b14a5b5ef5b9d

public class SunRiseSetAlgo 
    { 
     static double calcSunrise(int dayOfYear, double localOffset, double latitude, double longitude) 
     { 
      return calc(dayOfYear, localOffset, latitude, longitude, true); 
     } 
     static double calcSunset(int dayOfYear, double localOffset, double latitude, double longitude) 
     { 
      return calc(dayOfYear, localOffset, latitude, longitude, false); 
     } 

     // http://williams.best.vwh.net/sunrise_sunset_algorithm.htm 
     static double calc(int dayOfYear, double localOffset, double latitude, double longitude, boolean rise) 
     { 
      //1. first calculate the day of the year 

    //  int N1 = floor(275 * month/9.0); 
    //  int N2 = floor((month + 9)/12.0); 
    //  int N3 = (1 + floor((year - 4 * floor(year/4.0) + 2)/3.0)); 
    //  int N = N1 - (N2 * N3) + day - 30; 
      int N = dayOfYear; 

      //2. convert the longitude to hour value and calculate an approximate time 

      double lngHour = longitude/15; 
      double t = rise? 
       N + ((6 - lngHour)/24) : 
       N + ((18 - lngHour)/24); 

      //3. calculate the Sun's mean anomaly 

      double M = (0.9856 * t) - 3.289; 

      //4. calculate the Sun's true longitude 

      double L = M + (1.916 * sin(M)) + (0.020 * sin(2 * M)) + 282.634; 
      L = mod(L, 360); 

      //5a. calculate the Sun's right ascension 
      double RA = atan(0.91764 * tan(L)); 
      RA = mod(RA, 360); 

      //5b. right ascension value needs to be in the same quadrant as L 
      double Lquadrant = (floor(L/90)) * 90; 
      double RAquadrant = (floor(RA/90)) * 90; 
      RA = RA + (Lquadrant - RAquadrant); 

      //5c. right ascension value needs to be converted into hours 
      RA = RA/15; 

      //6. calculate the Sun's declination 
      double sinDec = 0.39782 * sin(L); 
      double cosDec = cos(asin(sinDec)); 

      //7a. calculate the Sun's local hour angle 
      double zenith = 90 + 50.0/60; 
      double cosH = (cos(zenith) - (sinDec * sin(latitude)))/(cosDec * cos(latitude)); 

      if (cosH > 1) 
       throw new Error("the sun never rises on this location (on the specified date"); 
      if (cosH < -1) 
       throw new Error("the sun never sets on this location (on the specified date"); 

      //7b. finish calculating H and convert into hours 
      double H = rise? 
       360 - acos(cosH) : 
       acos(cosH); 
      H = H/15; 

      //8. calculate local mean time of rising/setting 
      double T = H + RA - (0.06571 * t) - 6.622; 

      //9. adjust back to UTC 
      double UT = T - lngHour; 

      //10. convert UT value to local time zone of latitude/longitude 
      double localT = UT + localOffset; 
      localT = mod(localT, 24); 
      return localT; 
     } 

     static int floor(double d){ return (int)Math.floor(d); } 

     static double sin(double degree) 
     { 
      return Math.sin(degree*Math.PI/180); 
     } 
     static double cos(double degree) 
     { 
      return Math.cos(degree*Math.PI/180); 
     } 
     static double tan(double degree) 
     { 
      return Math.tan(degree*Math.PI/180); 
     } 
     static double atan(double x) 
     { 
      return Math.atan(x) *180/Math.PI; 
     } 
     static double asin(double x) 
     { 
      return Math.asin(x) *180/Math.PI; 
     } 
     static double acos(double x) 
     { 
      return Math.acos(x) *180/Math.PI; 
     } 

     static double mod(double x, double lim) 
     { 
      return x - lim * floor(x/lim); 
     } 

    } 
+1

Я люблю тебя. Я сравнил его, и это было главным образом с конверсией между градусами и радианами. он работает сейчас! Это не совсем точно, но его достаточно! gime ваш пар iD, поэтому я могу подарить вам что-то приятное: D – Redimo

+1

@ Redimo - добро пожаловать :) – ZhongYu

0

Everone, кажется, ссылка на http://williams.best.vwh.net/sunrise_sunset_algorithm.htm , который не делает существует больше. Почему бы не попробовать что-то, что обновляется раз в то время как https://en.wikipedia.org/wiki/Sunrise_equation Тогда, если вам нравится, вы можете помочь отредактировать его, чтобы он стал лучше.