From owner-svn-src-user@FreeBSD.ORG Tue Feb 23 06:35:04 2010 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7E0B5106566B; Tue, 23 Feb 2010 06:35:04 +0000 (UTC) (envelope-from edwin@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6DA928FC19; Tue, 23 Feb 2010 06:35:04 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o1N6Z40j084785; Tue, 23 Feb 2010 06:35:04 GMT (envelope-from edwin@svn.freebsd.org) Received: (from edwin@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o1N6Z4Fo084783; Tue, 23 Feb 2010 06:35:04 GMT (envelope-from edwin@svn.freebsd.org) Message-Id: <201002230635.o1N6Z4Fo084783@svn.freebsd.org> From: Edwin Groothuis Date: Tue, 23 Feb 2010 06:35:04 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r204243 - user/edwin/calendar X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Feb 2010 06:35:04 -0000 Author: edwin Date: Tue Feb 23 06:35:04 2010 New Revision: 204243 URL: http://svn.freebsd.org/changeset/base/204243 Log: Use a smarter way to calculate the equinoxes. Modified: user/edwin/calendar/sunpos.c Modified: user/edwin/calendar/sunpos.c ============================================================================== --- user/edwin/calendar/sunpos.c Tue Feb 23 05:02:10 2010 (r204242) +++ user/edwin/calendar/sunpos.c Tue Feb 23 06:35:04 2010 (r204243) @@ -180,6 +180,8 @@ sunpos(int inYY, int inMM, int inDD, dou #define SIGN(a) (((a) > 180) ? -1 : 1) #define ANGLE(a, b) (((a) < (b)) ? 1 : -1) +#define SHOUR(s) ((s) / 3600) +#define SMIN(s) (((s) % 3600) / 60) #define HOUR(h) ((h) / 4) #define MIN(h) (15 * ((h) % 4)) #define DEBUG1(y, m, d, hh, mm, pdec, dec) \ @@ -207,6 +209,9 @@ fequinoxsolstice(int year, double UTCoff int h, d, prevangle, angle; int found = 0; + double decleft, decright, decmiddle; + int dial, s; + int *cumdays; cumdays = cumdaytab[isleap(year)]; @@ -218,23 +223,35 @@ fequinoxsolstice(int year, double UTCoff found = 0; prevdec = 350; for (d = 18; d < 31; d++) { - for (h = 0; h < 4 * HOURSPERDAY; h++) { - sunpos(year, 3, d, UTCoffset, HOUR(h), MIN(h), - 0.0, 0.0, &L, &dec); - if (SIGN(prevdec) != SIGN(dec)) { -#ifdef NOTDEF - DEBUG1(year, 3, d, HOUR(h), MIN(h), - prevdec, dec); -#endif - equinoxdays[0] = 1 + cumdays[3] + d + - ((h / 4.0) / 24.0); - found = 1; - break; +// printf("Comparing day %d to %d.\n", d, d+1); + sunpos(year, 3, d, UTCoffset, 0, 0, 0.0, 0.0, &L, &decleft); + sunpos(year, 3, d + 1, UTCoffset, 0, 0, 0.0, 0.0, + &L, &decright); +// printf("Found %g and %g.\n", decleft, decright); + if (SIGN(decleft) == SIGN(decright)) + continue; + + dial = SECSPERDAY; + s = SECSPERDAY / 2; + while (s > 0) { +// printf("Obtaining %d (%02d:%02d)\n", +// dial, SHOUR(dial), SMIN(dial)); + sunpos(year, 3, d, UTCoffset, SHOUR(dial), SMIN(dial), + 0.0, 0.0, &L, &decmiddle); +// printf("Found %g\n", decmiddle); + if (SIGN(decleft) == SIGN(decmiddle)) { + decleft = decmiddle; + dial += s; + } else { + decright = decmiddle; + dial -= s; } - prevdec = dec; +// printf("New boundaries: %g - %g\n", decleft, decright); + + s /= 2; } - if (found) - break; + equinoxdays[0] = 1 + cumdays[3] + d + (dial / FSECSPERDAY); + break; } /* Find the second equinox, somewhere in September: @@ -244,23 +261,35 @@ fequinoxsolstice(int year, double UTCoff found = 0; prevdec = 10; for (d = 18; d < 31; d++) { - for (h = 0; h < 4 * HOURSPERDAY; h++) { - sunpos(year, 9, d, UTCoffset, HOUR(h), MIN(h), - 0.0, 0.0, &L, &dec); - if (SIGN(prevdec) != SIGN(dec)) { -#ifdef NOTDEF - DEBUG1(year, 9, d, HOUR(h), MIN(h), - prevdec, dec); -#endif - equinoxdays[1] = 1 + cumdays[9] + d + - ((h / 4.0) / 24.0); - found = 1; - break; + printf("Comparing day %d to %d.\n", d, d+1); + sunpos(year, 9, d, UTCoffset, 0, 0, 0.0, 0.0, &L, &decleft); + sunpos(year, 9, d + 1, UTCoffset, 0, 0, 0.0, 0.0, + &L, &decright); + printf("Found %g and %g.\n", decleft, decright); + if (SIGN(decleft) == SIGN(decright)) + continue; + + dial = SECSPERDAY; + s = SECSPERDAY / 2; + while (s > 0) { +// printf("Obtaining %d (%02d:%02d)\n", +// dial, SHOUR(dial), SMIN(dial)); + sunpos(year, 9, d, UTCoffset, SHOUR(dial), SMIN(dial), + 0.0, 0.0, &L, &decmiddle); +// printf("Found %g\n", decmiddle); + if (SIGN(decleft) == SIGN(decmiddle)) { + decleft = decmiddle; + dial += s; + } else { + decright = decmiddle; + dial -= s; } - prevdec = dec; +// printf("New boundaries: %g - %g\n", decleft, decright); + + s /= 2; } - if (found) - break; + equinoxdays[1] = 1 + cumdays[9] + d + (dial / FSECSPERDAY); + break; } /*