コード例 #1
0
ファイル: sunriseset.c プロジェクト: Eric-Schnipke/snippets
main()
{
      int year,month,day;
      double lon, lat;
      double daylen, civlen, nautlen, astrlen;
      double rise, set, civ_start, civ_end, naut_start, naut_end,
             astr_start, astr_end;
      double daylen_int,daylen_frac;  /* CWR */
      int    rs, civ, naut, astr;
      int daylen_hours,daylen_min, gmtoff_hr; /* cwr */
      double rise_int,rise_frac,set_int,set_frac; 
      int rise_hours,rise_min,set_hours,set_min;

      time_t the_time; /* only need so can get time zone of local machine... */
      struct tm *mylocal_time;
      char buf[80];
      
/* get time and offset from GMT */ 
      time(&the_time);
      mylocal_time = localtime(&the_time);
      gmtoff_hr = mylocal_time->tm_gmtoff/3600;

      printf("Enter longitude and latitude in decimal degrees, i.e. -97.75 30.23\n");
      printf("Hint: divide minutes by 60 to get decimal portion\n");
      printf( "Longitude (+ is east) and latitude (+ is north) : " );
      fgets(buf, 80, stdin);
      sscanf(buf, "%lf %lf", &lon, &lat );

      for(;;)
      {
            printf( "Input date ( yyyy mm dd ) (ctrl-C exits): " );
            fgets(buf, 80, stdin);
            sscanf(buf, "%d %d %d", &year, &month, &day );

            daylen  = day_length(year,month,day,lon,lat);
            civlen  = day_civil_twilight_length(year,month,day,lon,lat);
            nautlen = day_nautical_twilight_length(year,month,day,lon,lat);
            astrlen = day_astronomical_twilight_length(year,month,day,
                  lon,lat);
                  
            daylen_frac = modf(daylen,&daylen_int); /* daylen into int and fraction */
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "Day length:                 %5.2f hours", daylen );
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf(civlen,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "With civil twilight         %5.2f hours", civlen );
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf(nautlen,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "With nautical twilight      %5.2f hours", nautlen );
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf(astrlen,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "With astronomical twilight  %5.2f hours", astrlen );
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf((civlen-daylen)/2.0,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "Length of twilight: civil   %5.2f hours",
                  (civlen-daylen)/2.0);
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf((nautlen-daylen)/2.0,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "                  nautical  %5.2f hours",
                  (nautlen-daylen)/2.0);
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );
            daylen_frac = modf((astrlen-daylen)/2.0,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);
            printf( "              astronomical  %5.2f hours",
                  (astrlen-daylen)/2.0);
            printf( "(%2d hours %2d min)\n", daylen_hours,daylen_min );

            rs   = sun_rise_set         ( year, month, day, lon, lat,
                                          &rise, &set );
            civ  = civil_twilight       ( year, month, day, lon, lat,
                                          &civ_start, &civ_end );
            naut = nautical_twilight    ( year, month, day, lon, lat,
                                          &naut_start, &naut_end );
            astr = astronomical_twilight( year, month, day, lon, lat,
                                          &astr_start, &astr_end );

            daylen_frac = modf(((rise+set)/2.0)+gmtoff_hr ,&daylen_int); 
            daylen_hours = (int)daylen_int;
            daylen_min = (int)(daylen_frac * 60);

            printf( "Sun at south %5.2fh UT,%20d:%02d local\n", (rise+set)/2.0,daylen_hours,daylen_min);

            switch( rs )
            {
                case 0:
                    /* add minutes and local. CWR*/
                    rise_frac = modf(rise+gmtoff_hr ,&rise_int); 
                    rise_hours = (int)rise_int;
                    rise_min = (int)(rise_frac * 60);
                    set_frac = modf(set+gmtoff_hr ,&set_int); 
                    set_hours = (int)set_int;
                    set_min = (int)(set_frac * 60);

                    printf( "Sun rises %5.2fh UT, sets %5.2fh UT;\n    rises %02d:%02d,     sets %02d:%02d local\n",
                             rise, set, rise_hours,rise_min,set_hours,set_min);
                    break;
                case +1:
                    printf( "Sun above horizon\n" );
                    break;
                case -1:
                    printf( "Sun below horizon\n" );
                    break;
            }

            switch( civ )
            {
                case 0:
                    rise_frac = modf(civ_start+gmtoff_hr ,&rise_int); 
                    rise_hours = (int)rise_int;
                    rise_min = (int)(rise_frac * 60);
                    set_frac = modf(civ_end+gmtoff_hr ,&set_int); 
                    set_hours = (int)set_int;
                    set_min = (int)(set_frac * 60);

                    printf( "Civil twilight starts %5.2fh, "
                            "ends %5.2fh UT;\n               starts %02d:%02d,  ends %02d:%02d local\n", 
                            civ_start, civ_end, 
                            rise_hours, rise_min, set_hours, set_min);
                    break;
                case +1:
                    printf( "Never darker than civil twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as civil twilight\n" );
                    break;
            }

            switch( naut )
            {
                case 0:
                    rise_frac = modf(naut_start+gmtoff_hr ,&rise_int); 
                    rise_hours = (int)rise_int;
                    rise_min = (int)(rise_frac * 60);
                    set_frac = modf(naut_end+gmtoff_hr ,&set_int); 
                    set_hours = (int)set_int;
                    set_min = (int)(set_frac * 60);

                    printf( "Nautical twilight starts %5.2fh, "
                            "ends %5.2fh UT;\n                  starts %02d:%02d,  ends %02d:%02d local\n", 
                            naut_start, naut_end, 
                            rise_hours, rise_min, set_hours, set_min );
                    break;
                case +1:
                    printf( "Never darker than nautical twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as nautical twilight\n" );
                    break;
            }

            switch( astr )
            {
                case 0:
                    rise_frac = modf(astr_start+gmtoff_hr ,&rise_int); 
                    rise_hours = (int)rise_int;
                    rise_min = (int)(rise_frac * 60);
                    set_frac = modf(astr_end+gmtoff_hr ,&set_int); 
                    set_hours = (int)set_int;
                    set_min = (int)(set_frac * 60);

                    printf( "Astronomical twilight starts %5.2fh, "
                            "ends %5.2fh UT;\n                      starts %02d:%02d,  ends %02d:%02d local\n", 
                            astr_start, astr_end, 
                            rise_hours, rise_min, set_hours, set_min );
                    break;
                case +1:
                    printf( "Never darker than astronomical twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as astronomical twilight\n" );
                    break;
            }
      return 0;
      }
}
コード例 #2
0
ファイル: main.c プロジェクト: themitch/suncalc
int main(int argc, char *argv[])
{
  int i, j;
  int year,month,day;
  double lon = -77.06945;
  double lat = 38.794433;
  int coords_set = 0;
  double temp;
  int local = 1;
  int hemisphere;
  int mode = MODE_USAGE;
  int offset_hour = 0; 
  int offset_min = 0;
  int offset_sec = 0;
  int verbose = 0;

  time_t tt;
  struct tm *tm;

  tt = time(NULL);
  ctime(&tt);
  tm = localtime(&tt);

  year = 1900 + tm->tm_year;
  month = 1+ tm->tm_mon;
  day =  1+ tm->tm_mday;
  timezone_name = tm->tm_zone;
  timezone_offset = tm->tm_gmtoff;
  
  for (i=1; i< argc; i++) {
    if (!strcmp("-V", argv[i])) {
      printf("sunwait version 0.1\n");
      exit(0);
    }
    if (!strcmp("-z", argv[i])) {
      local = 0;
    }
    if (!strcmp("-h", argv[i])) {
      print_usage();
      exit(0); 
    }
    if (!strcmp("-v", argv[i])) {
      verbose++;
    }
    if (!strcmp("-p", argv[i])) {
      mode = MODE_PRINT;
    }

    if (!strcmp("-y", argv[i])) {
      i++;
      year = atoi(argv[i]);
    }
    if (!strcmp("-m", argv[i])) {
      i++;
      month = atoi(argv[i]);
    }
    if (!strcmp("-d", argv[i])) {
      i++;
      day = 1 + atoi(argv[i]);
    }

    if (2 == sscanf(argv[i], "%lf%1[Nn]", &temp, &hemisphere)) {
      lat = temp; 
      coords_set |= LAT_SET;
    }
    if (2 == sscanf(argv[i], "%lf%1[Ss]", &temp, &hemisphere)) {
      lat = -temp;
      coords_set |= LAT_SET;
    }
    if (2 == sscanf(argv[i], "%lf%1[Ww]", &temp, &hemisphere)) {
      lon = -temp;
      coords_set |= LON_SET;
    }
    /* this looks different from the others because 77E 
       parses as scientific notation */
    if (1 == sscanf(argv[i], "%lf%", &temp, &hemisphere)
	&& (argv[i][strlen(argv[i])-1] == 'E' ||
	    argv[i][strlen(argv[i])-1] == 'e')) {
      lon = temp;
      coords_set |= LON_SET;
    }

    for (j=0; options[j].label; j++) {
      if (strstr(argv[i], options[j].label)) {
	mode = (mode &~ options[j].mask) | options[j].value;
      }
    }

    if (('+' == argv[i][0] || '-' == argv[i][0]) &&
	('0' <= argv[i][1] && '9' >= argv[i][1])) {
      /* perl would be nice here */
      char* temp;
      temp = 1+argv[i];
      offset_min = strtol(temp, &temp, 10);
      if (':' == *temp) {
	offset_hour = offset_min;
	offset_min = strtol(temp+1, &temp, 10);
      }
      if (':' == *temp) {
	offset_sec = strtol(temp+1, &temp, 10);
      }
      if ('-' == argv[i][0]) {
	offset_hour *= -1;
	offset_min *= -1;
	offset_sec *= -1;
      }
    }
  }

  if (coords_set != (LAT_SET | LON_SET)) {
      fprintf(stderr, "warning: latitude or longitude not set\n\tdefault coords of Alexandria, Virgina, USA used\n");
  }
    if ((mode & MODE_MASK) && (mode & EVENT_MASK)) {
    int sit;
    double up, down, now, interval, offset;
    switch (mode & MODE_MASK) {
    case MODE_USAGE:
      print_usage();
      exit(0);
      break;
    case MODE_SUN:
      sit   = sun_rise_set         ( year, month, day, lon, lat,
				    &up, &down );
      break;
    case MODE_CIVIL:
      sit  = civil_twilight       ( year, month, day, lon, lat,
				    &up, &down );
      break;
    case MODE_NAUT:
      sit = nautical_twilight    ( year, month, day, lon, lat,
				    &up, &down );
      break;
    case MODE_ASTR:
      sit = astronomical_twilight( year, month, day, lon, lat,
				    &up, &down );
      break;
    }
    
    if (0 != sit) {
      fprintf(stderr, "Event does not occur today\n");
      exit(1);
    }
	
    up = TMOD(up+timezone_offset/3600);
    down = TMOD(down+timezone_offset/3600);
    now = tm->tm_hour/1.0 + tm->tm_min/60.0 + tm->tm_sec/3600.0; 
    offset = offset_hour/1.0 + offset_min/60.0 + offset_sec/3600.0; 

    if (EVENT_RISE == (mode & EVENT_MASK)) {
		printf("%2.2d:%2.2d\n", HOURS(up+offset), MINUTES(up+offset));	
    } else if (EVENT_SET == (mode & EVENT_MASK)){
		printf("%2.2d:%2.2d\n", HOURS(down+offset), MINUTES(down+offset));	
    } else { /* mode is EVENT_STATE */
		if(now>up && now<down) { 
			printf("up\n");
		} else {
			printf("down\n");
		}		
	}

    if (0 > interval) {
      if (0 < verbose) {
		fprintf(stderr, "Warning: event already passed for today, waiting till tomorrow.\n");
      }
    }

    if (1 < verbose) {
      fprintf(stderr, "Up %f\n", up);
      fprintf(stderr, "Down %f\n", down);
      fprintf(stderr, "Now %f\n", now);
      fprintf(stderr, "Offset %f\n", offset);
    }

  }
  
  if (MODE_PRINT == (MODE_MASK & mode))
    print_everything(year, month, day, lat, lon, tm, local);


  if (MODE_USAGE == (MODE_MASK & mode))
    print_usage();

  exit(0);
}
コード例 #3
0
ファイル: sunriset.c プロジェクト: ThomasBaur/skycalendar
main()
{
      int year,month,day;
      double lon, lat;
      double daylen, civlen, nautlen, astrlen;
      double rise, set, civ_start, civ_end, naut_start, naut_end,
             astr_start, astr_end;
      int    rs, civ, naut, astr;
      char buf[80];

      printf( "Longitude (+ is east) and latitude (+ is north) : " );
      fgets(buf, 80, stdin);
      sscanf(buf, "%lf %lf", &lon, &lat );

      for(;;)
      {
            printf( "Input date ( yyyy mm dd ) (ctrl-C exits): " );
            fgets(buf, 80, stdin);
            sscanf(buf, "%d %d %d", &year, &month, &day );

            daylen  = day_length(year,month,day,lon,lat);
            civlen  = day_civil_twilight_length(year,month,day,lon,lat);
            nautlen = day_nautical_twilight_length(year,month,day,lon,lat);
            astrlen = day_astronomical_twilight_length(year,month,day,
                  lon,lat);

            printf( "Day length:                 %5.2f hours\n", daylen );
            printf( "With civil twilight         %5.2f hours\n", civlen );
            printf( "With nautical twilight      %5.2f hours\n", nautlen );
            printf( "With astronomical twilight  %5.2f hours\n", astrlen );
            printf( "Length of twilight: civil   %5.2f hours\n",
                  (civlen-daylen)/2.0);
            printf( "                  nautical  %5.2f hours\n",
                  (nautlen-daylen)/2.0);
            printf( "              astronomical  %5.2f hours\n",
                  (astrlen-daylen)/2.0);

            rs   = sun_rise_set         ( year, month, day, lon, lat,
                                          &rise, &set );
            civ  = civil_twilight       ( year, month, day, lon, lat,
                                          &civ_start, &civ_end );
            naut = nautical_twilight    ( year, month, day, lon, lat,
                                          &naut_start, &naut_end );
            astr = astronomical_twilight( year, month, day, lon, lat,
                                          &astr_start, &astr_end );

            printf( "Sun at south %5.2fh UT\n", (rise+set)/2.0 );

            switch( rs )
            {
                case 0:
                    printf( "Sun rises %5.2fh UT, sets %5.2fh UT\n",
                             rise, set );
                    break;
                case +1:
                    printf( "Sun above horizon\n" );
                    break;
                case -1:
                    printf( "Sun below horizon\n" );
                    break;
            }

            switch( civ )
            {
                case 0:
                    printf( "Civil twilight starts %5.2fh, "
                            "ends %5.2fh UT\n", civ_start, civ_end );
                    break;
                case +1:
                    printf( "Never darker than civil twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as civil twilight\n" );
                    break;
            }

            switch( naut )
            {
                case 0:
                    printf( "Nautical twilight starts %5.2fh, "
                            "ends %5.2fh UT\n", naut_start, naut_end );
                    break;
                case +1:
                    printf( "Never darker than nautical twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as nautical twilight\n" );
                    break;
            }

            switch( astr )
            {
                case 0:
                    printf( "Astronomical twilight starts %5.2fh, "
                            "ends %5.2fh UT\n", astr_start, astr_end );
                    break;
                case +1:
                    printf( "Never darker than astronomical twilight\n" );
                    break;
                case -1:
                    printf( "Never as bright as astronomical twilight\n" );
                    break;
            }
      return 0;
      }
}