例二 水星大距计算
void greatest_elongation()
{
double dret[20];
double jut,tjd_ut;
int i=0,j,k;
int direct=0;
double buffer=0;
char buf[8000];
char s[AS_MAXCH];
double d_timezone=-8;
int32 iyear_out, imonth_out, iday_out, ihour_out, imin_out;
double dsec_out;
int flag=0;
strcpy(buf,"");
jday = 1;
jmon = 1;//pd.mon;
jyear = pd.year;
jhour = (int)d_timezone;
jmin = 0;
jsec = 0;
jut = jhour + jmin / 60.0 + jsec / 3600.0;
if ((long) pd.year * 10000L + (long) pd.mon * 100L + (long) pd.mday < 15821015L)
gregflag = FALSE;
else
gregflag = TRUE;
tjd_ut = swe_julday(jyear,jmon,jday,jut,gregflag);
tjd = tjd_ut;
// SE_MERCURY 2 水星
for(i=0;i<365;i++)
{
swe_pheno(tjd, SE_MERCURY, iflag, dret, serr);
if(buffer!=0)
{
flag=0;
if(dret[2]>=buffer) //上升
{
if(direct==-1)
{
flag=1;
}
direct=1;
}
else if(dret[2]
{
if(direct==1)
{
flag=2;
}
direct=-1;
}
if(dret[2]>15 && flag>=1)
{
tjd=tjd-1; //回退一天
buffer=0;
for(j=0;j<24;j++)
{
tjd=tjd+(double)1/24;
swe_pheno(tjd, SE_MERCURY, iflag, dret, serr);
if(dret[2]
{
buffer = dret[2];
break;
}
buffer = dret[2];
}
tjd=tjd-(double)1/24;
for(k=0;k<60;k++)
{
tjd=tjd+(double)1/1440;
swe_pheno(tjd, SE_MERCURY, iflag, dret, serr);
if(dret[2]
{
buffer = dret[2];
break;
}
buffer = dret[2];
}
swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut);
jut += 0.5 / 3600;
jhour = (int) jut;
jmin = (int) fmod(jut * 60, 60);
jsec = (int) fmod(jut * 3600, 60);
swe_utc_time_zone(
jyear, jmon, jday,
jhour, jmin, jsec,
d_timezone,
&iyear_out, &imonth_out, &iday_out,
&ihour_out, &imin_out, &dsec_out
);
sprintf(s, "水星大距 %d.%d.%d - %02d:%02d\r\n", iyear_out, imonth_out, iday_out,ihour_out, imin_out);
do_print(buf, s);
buffer=0;
direct=0;
tjd = swe_julday(jyear,jmon,jday,jut,gregflag);
}
}
buffer = dret[2];
tjd++;
}
MessageBox(0,buf,"",0);
}
[此贴子已经被作者于2016-10-6 22:16:53编辑过]