#include main() { double dfPosition[8]; double dfRelativePos[8]; double dfCumuls[10]; double dfPosInitial[8] = { 0.0, 0.03, 0.37, -0.25, 0.45, 0.03, -0.4, -0.3 }; double dfPosDegrees[8] = { 246.1116, 179.5762, 278.9874, 354.6611, 034.2269, 041.0243, 313.2522, 304.8738 }; char *szNames[9] = { "Mercury ", "Venus ", "Earth ", "Mars ", "Jupiter ", "Saturn ", "Uranus ", "Neptune ", "Moon "}; char *szMois[14] = { "Dec", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Sep", "Oct", "Nov", "Dec", "Jan"}; /* Duration of an orbit expressed inEarth days from noon at noon*/ double dfOrbitre[8] = { 87.9651, 224.6901, 365.2425, /* 365.2421615, ?*/ 686.9628, 4332.6461, 10763.6749, 30700.0475, 60045.7004}; double dfOrbitre_a[8] = { /* Données orbitres en annees terestres */ 0.240840, 0.615181, 1.0, 1.880841, 11.862510, 29.469965, 84.053945, 164.399681}; /* double dfDate = 2012.97; */ /* 23-12-2012 Calandrier Maya*/ double dfDate = 2000.0 ; #define DIFFERENCE 4740 /*repere = 2000 Calandrier Maya = 23-12-2012*/ double dfCurDate; double dfLune,dfLunPos; long i,ii,lPos,lLune; int j,count,head,jours,iDate,iMois; head = 0; jours = 0; for (j = 0 ; j < 10 ; j++) dfCumuls[j] = 0.0; dfLunPos = 117.5390 / 360.0 ; /* Ajustement de position, 1-1-2000 = 0.0 */ for (j = 0 ;j < 8 ;j++) { if (j != 2) { dfPosInitial[j] = (dfPosDegrees[j] - (360 - dfPosDegrees[2])) / 360.0; //if (dfPosInitial[j] < 0) dfPosInitial[j] = dfPosInitial[j] + 1.0; } else { dfPosInitial[j] = 0.0; } } /* Calculate the duration of an orbit in Earth days */ for (j = 0 ; j < 8 ; j++) { if (j != 2) dfOrbitre[j] = dfOrbitre_a[j] * dfOrbitre[2]; } for (i = -1875000L ; i < 10000000L ; i++) { if ((i & 0xFFF) == 0) { dfCurDate = dfDate - ((double) i) / dfOrbitre[2]; fprintf(stderr,"%8.2lf\r",dfCurDate); } /* Calculate the lunar position */ lLune = (long) (((dfLunPos * 29.5305905) - (double) i) / 29.5305905) ; dfLune = (((dfLunPos * 29.5305905) - (double) i) / 29.5305905) ; dfLune = dfLune - (double) lLune; if (dfLune < 0) dfLune = -dfLune; /* Calculate the position of each planet in space relative to January 1 th */ for ( j = 0 ; j < 8 ; j++ ) { if ( j != 2 ) { lPos = (long) (((dfPosInitial[j] * dfOrbitre[j]) - (double) i) / dfOrbitre[j]) ; dfPosition[j] = ((dfPosInitial[j] * dfOrbitre[j]) - (double) i) / dfOrbitre[j]; } else { lPos = (long) (((double) i) / dfOrbitre[j]) ; dfPosition[j] = ((double) i) / dfOrbitre[j]; } dfPosition[j] = dfPosition[j] - (double) lPos; if (dfPosition[j] < 0) dfPosition[j] = -dfPosition[j]; } /* Calculate planitary postions relative to actual Earth position */ for ( j = 0 ; j < 8 ; j++) if ((dfPosition[j] < dfPosition[2]) && (j != 2)) { if ((((dfPosition[j] + 1.0) - dfPosition[2]) > 0.5) && (j != 2)) dfRelativePos[j] = 1.0 - ((dfPosition[j] + 1.0) - dfPosition[2]) ; else dfRelativePos[j] = ((dfPosition[j] + 1.0) - dfPosition[2]) ; } else { if (((dfPosition[j] - dfPosition[2]) > 0.5) && (j != 2)) dfRelativePos[j] = 1.0 - (dfPosition[j] - dfPosition[2]) ; else dfRelativePos[j] = (dfPosition[j] - dfPosition[2]) ; } count = 0; /* Check Venus position to be within 20 % lign-up on the same side of the Sun*/ if (((dfRelativePos[1] > dfRelativePos[2]) && ((dfRelativePos[1] - dfRelativePos[2]) < 0.08)) || ((dfRelativePos[1] < dfRelativePos[2]) && ((dfRelativePos[2] - dfRelativePos[1]) < 0.08))) { /* Check the positions of the big planets Jupiter - Saturn - Uranus - Neptune relative to the Earth on the opposite side of the Sun*/ for ( j = 4 ; j < 8 ; j++) { if (((dfRelativePos[j] > dfRelativePos[2]) && ((dfRelativePos[j] - dfRelativePos[2]) > 0.42)) || ((dfRelativePos[j] < dfRelativePos[2]) && ((dfRelativePos[2] - dfRelativePos[j]) > 0.42))) count++; } } if (i > 0) ii = 1872000L - (i % 1872000L); else ii = -i % 1872000L; /* Print out a line for each Maya calendar limit */ if (ii == DIFFERENCE) { if ((head & 63) == 0) { if (head != 0) printf("\f"); printf(" Year "); for ( j = 0 ; j < 8 ; j = j + 2) printf("%8s ",szNames[j]); printf("Moon\r\n"); printf(" Month "); for ( j = 1 ; j < 8 ; j = j + 2) printf(" %8s",szNames[j]); printf(" Duration\r\n\r\n"); head = head + 2; } head = head + 2; if (i <= 0) printf(" Start of maya era cycle J +%ld \r\n",1 - (i / 1872000L)); else if ( (i / 1872000L) == 0 ) printf(" Start of maya era cycle J \r\n"); else printf(" Start of maya era cycle J %ld \r\n",0 - (i / 1872000L)); dfCurDate = dfDate - ((double) i) / dfOrbitre[2]; iDate = (int) dfCurDate ; if (iDate < 0) iDate = iDate - 1; dfCurDate = dfCurDate - (double) iDate; if (dfCurDate < 0) dfCurDate = -dfCurDate; iMois = (int) (dfPosition[2] * 360.0 - 15.0); iMois = iMois / 30 ; printf("%6d-%3s ",iDate,szMois[iMois + 1]); for ( j = 0; j < 8 ; j++) printf("- %3d ", (int) (dfPosition[j] * 360.0)); printf("\r\n"); } /* Cumulate consicutive day of lign-ups with either Full Moon or New Moon */ else if (((count > 3) && ((dfLune < 0.1) || (dfLune > 0.9))) || ((count > 3) && ((dfLune > 0.4) && (dfLune < 0.6)))) { jours++; for (j = 0 ; j < 8 ; j++) dfCumuls[j] = dfCumuls[j] + dfPosition[j]; if (dfCumuls[9] <= 0.0) dfCumuls[9] = dfLune; dfCumuls[10] = dfLune; } /* Prin a line for the cumutated lign-up days */ else if (jours > 0) { if ((head & 63) == 0) { if (head != 0) printf("\f"); printf(" Year "); for ( j = 0 ; j < 8 ; j = j + 2) printf("%8s ",szNames[j]); printf("Moon\r\n"); printf(" Month "); for ( j = 1 ; j < 8 ; j = j + 2) printf(" %8s",szNames[j]); printf(" Duration\r\n\r\n"); head = head + 2; } head = head + 1; dfCurDate = dfDate - ((double) i - jours + 1) / dfOrbitre[2]; iDate = (int) dfCurDate ; if (iDate < 0) iDate = iDate - 1; dfCurDate = dfCurDate - (double) iDate; if (dfCurDate < 0) dfCurDate = -dfCurDate; iMois = (int) ((dfCumuls[2] / (double) jours) * 360.0 - 15.0); iMois = iMois / 30 ; printf("%6d-%3s ",iDate,szMois[iMois + 1]); for ( j = 0; j < 8 ; j++) printf("- %3d ", (int) ((dfCumuls[j] / (double) jours) * 360.0)); if ((dfLune < 0.1) || (dfLune > 0.9)) printf(" Full - "); else printf(" New - "); printf("%d\r\n",jours); jours = 0; for (j = 0 ; j < 10 ; j++) dfCumuls[j] = 0.0; } } if (head != 0) printf("\f"); return 0; }