Created
December 1, 2009 17:18
-
-
Save nobodyplace/246449 to your computer and use it in GitHub Desktop.
Class Calcurate Moon Age Time
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Class Calcurate Moon Age Time | |
* | |
* PHP version 5 | |
* | |
* Licence: | |
* | |
* Copyright (c) 2006-2009, Ippei Suzuki <[email protected]> | |
* All rights reserved. | |
* | |
* Sample: | |
* | |
* $m = new MoonAgeTime(); | |
* $m->setTargetTime(mktime(12, 0, 0, 10, 27, 1999)); | |
* $moonAge = $m->getMoonAge(); | |
* | |
* Special Thanks: | |
* | |
* Math Logic of this program is based on "日の出・日の入りの計算" by Ko Nagasawa, Japan. | |
* (see also: http://ja.wikipedia.org/wiki/%E9%95%B7%E6%B2%A2%E5%B7%A5) | |
* | |
* @version 0.0.1 | |
* @author Ippei Suzuki | |
* @link http://nplll.com | |
*/ | |
class MoonAgeTime | |
{ | |
/** | |
* Circle ratio(radian) | |
*/ | |
const PAI = 0.017453278; | |
/** | |
* 地球自転遅れの補正(day) | |
*/ | |
const DT = 0.00074074074; | |
/** | |
* target time | |
* | |
* @var unixtime | |
*/ | |
protected $targetTime; | |
/** | |
* gets targetTime | |
* | |
* @var unixtime | |
*/ | |
public function getTargetTime() { return $this->targetTime; } | |
/** | |
* sets targetTime | |
* | |
* @param unixtime $targetTime | |
* @return unixtime | |
*/ | |
public function setTargetTime($targetTime) { $this->targetTime = $targetTime; } | |
/** | |
* Returns Moon Age | |
* | |
* @return float | |
*/ | |
public function getMoonAge() | |
{ | |
$time = $this->getTargetTime(); | |
//the number of days since J2000.0 | |
$Ko = $this->getKo($time); | |
$dK = date('G', $time) / 24; | |
$K = $Ko + $dK; | |
//the number of years since J2000.0 | |
$T = $K / 365.25; | |
//太陽黄経(度) | |
$sunRamda = $this->getSunRamda($T); | |
//月黄経(度) | |
$moonRamda = $this->getMoonRamda($T); | |
//黄経差(度) | |
$dRamda = $moonRamda - $sunRamda; | |
if($dRamda < 0) | |
$dRamda += 360; | |
//月齢 | |
return $dRamda / 12.1908; | |
} | |
/** | |
* Returns the number of days since J2000.0(2000/01/01 in Japan) | |
* | |
* @return float | |
*/ | |
protected function getKo($time) | |
{ | |
$year = ((int) date('n', $time) < 3) ? (int) date('Y', $time) - 2001 : (int) date('Y', $time) - 2000; | |
$month = ((int) date('n', $time) < 3) ? (int) date('n', $time) +12 : (int) date('n', $time); | |
$day = (int) date('j', $time); | |
return (float) ($year * 365 + $month * 30 + $day - 33.875 + floor(3 * ($month + 1) / 5) + floor($year / 4)); | |
} | |
/** | |
* 太陽黄経 | |
* 0 <= $sunRamda < 360 | |
* | |
* @param float $T | |
* @return float | |
*/ | |
protected function getSunRamda($T) | |
{ | |
$sunRamda = 280.4603 + 360.00769 * $T | |
+ (1.9146 - 0.00005 * $T) * sin((357.538 + 359.991 * $T) * self::PAI) | |
+ 0.0200 * sin((355.05 + 719.981 * $T) * self::PAI) | |
+ 0.0048 * sin((234.95 + 19.341 * $T) * self::PAI) | |
+ 0.0020 * sin((247.1 + 329.64 * $T) * self::PAI) | |
+ 0.0018 * sin((297.8 + 4452.67 * $T) * self::PAI) | |
+ 0.0018 * sin((251.3 + 0.20 * $T) * self::PAI) | |
+ 0.0015 * sin((343.2 + 450.37 * $T) * self::PAI) | |
+ 0.0013 * sin((81.4 + 225.18 * $T) * self::PAI) | |
+ 0.0008 * sin((132.5 + 659.29 * $T) * self::PAI) | |
+ 0.0007 * sin((153.3 + 90.38 * $T) * self::PAI) | |
+ 0.0007 * sin((206.8 + 30.35 * $T) * self::PAI) | |
+ 0.0006 * sin((29.8 + 337.18 * $T) * self::PAI) | |
+ 0.0005 * sin((207.4 + 1.50 * $T) * self::PAI) | |
+ 0.0005 * sin((291.2 + 22.81 * $T) * self::PAI) | |
+ 0.0004 * sin((234.9 + 315.56 * $T) * self::PAI) | |
+ 0.0004 * sin((157.3 + 299.30 * $T) * self::PAI) | |
+ 0.0004 * sin((21.1 + 720.02 * $T) * self::PAI) | |
+ 0.0003 * sin((352.5 + 1079.97 * $T) * self::PAI) | |
+ 0.0003 * sin((329.7 + 44.43 * $T) * self::PAI) | |
; | |
if($sunRamda > 0): | |
while($sunRamda >= 360): | |
$sunRamda -= 360; | |
endwhile; | |
else: | |
while($sunRamda < 0): | |
$sunRamda += 360; | |
endwhile; | |
endif; | |
return $sunRamda; | |
} | |
/** | |
* 月黄経 | |
* 0 <= $moonRamda < 360 | |
* | |
* @param float $T | |
* @return float | |
*/ | |
protected function getMoonRamda($T) | |
{ | |
$Am = 0.0040 * sin((119.5 + 1.33 * $T) * self::PAI) | |
+ 0.0020 * sin((55.0 + 19.34 * $T) * self::PAI) | |
+ 0.0006 * sin((71 + 0.2 * $T) * self::PAI) | |
+ 0.0006 * sin((54 + 19.3 * $T) * self::PAI) | |
; | |
$moonRamda = 218.3161 + 4812.67881 * $T | |
+ 6.2887 * sin((134.961 + 4771.9886 * $T + $Am) * self::PAI) | |
+ 1.2740 * sin((100.738 + 4133.3536 * $T) * self::PAI) | |
+ 0.6583 * sin((235.700 + 8905.3422 * $T) * self::PAI) | |
+ 0.2136 * sin((269.926 + 9543.9773 * $T) * self::PAI) | |
+ 0.1856 * sin((177.525 + 359.9905 * $T) * self::PAI) | |
+ 0.1143 * sin(( 6.546 + 9664.0404 * $T) * self::PAI) | |
+ 0.0588 * sin((214.22 + 638.635 * $T) * self::PAI) | |
+ 0.0572 * sin((103.21 + 3773.363 * $T) * self::PAI) | |
+ 0.0533 * sin(( 10.66 +13677.331 * $T) * self::PAI) | |
+ 0.0459 * sin((238.18 + 8545.352 * $T) * self::PAI) | |
+ 0.0410 * sin((137.43 + 4411.998 * $T) * self::PAI) | |
+ 0.0348 * sin((117.84 + 4452.671 * $T) * self::PAI) | |
+ 0.0305 * sin((312.49 + 5131.979 * $T) * self::PAI) | |
+ 0.0153 * sin((130.84 + 758.698 * $T) * self::PAI) | |
+ 0.0125 * sin((141.51 +14436.092 * $T) * self::PAI) | |
+ 0.0110 * sin((231.59 + 4892.052 * $T) * self::PAI) | |
+ 0.0107 * sin((336.44 +13038.696 * $T) * self::PAI) | |
+ 0.0100 * sin(( 44.89 +14315.966 * $T) * self::PAI) | |
+ 0.0085 * sin((201.5 + 8266.71 * $T) * self::PAI) | |
+ 0.0079 * sin((278.2 + 4493.34 * $T) * self::PAI) | |
+ 0.0068 * sin(( 53.2 + 9265.32 * $T) * self::PAI) | |
+ 0.0052 * sin((197.2 + 319.32 * $T) * self::PAI) | |
+ 0.0050 * sin((295.4 + 4812.66 * $T) * self::PAI) | |
+ 0.0048 * sin((235.0 + 19.34 * $T) * self::PAI) | |
+ 0.0040 * sin(( 13.2 +13317.34 * $T) * self::PAI) | |
+ 0.0040 * sin((145.6 +18449.32 * $T) * self::PAI) | |
+ 0.0040 * sin((119.5 + 1.33 * $T) * self::PAI) | |
+ 0.0039 * sin((111.3 +17810.68 * $T) * self::PAI) | |
+ 0.0037 * sin((349.1 + 5410.62 * $T) * self::PAI) | |
+ 0.0027 * sin((272.5 + 9183.99 * $T) * self::PAI) | |
+ 0.0026 * sin((107.2 +13797.39 * $T) * self::PAI) | |
+ 0.0024 * sin((211.9 + 988.63 * $T) * self::PAI) | |
+ 0.0024 * sin((252.8 + 9224.66 * $T) * self::PAI) | |
+ 0.0022 * sin((240.6 + 8185.36 * $T) * self::PAI) | |
+ 0.0021 * sin(( 87.5 + 9903.97 * $T) * self::PAI) | |
+ 0.0021 * sin((175.1 + 719.98 * $T) * self::PAI) | |
+ 0.0021 * sin((105.6 + 3413.37 * $T) * self::PAI) | |
+ 0.0020 * sin(( 55.0 + 19.34 * $T) * self::PAI) | |
+ 0.0018 * sin(( 4.1 + 4013.29 * $T) * self::PAI) | |
+ 0.0016 * sin((242.2 +18569.38 * $T) * self::PAI) | |
+ 0.0012 * sin((339.0 +12678.71 * $T) * self::PAI) | |
+ 0.0011 * sin((276.5 +19208.02 * $T) * self::PAI) | |
+ 0.0009 * sin((218 + 8586.0 * $T) * self::PAI) | |
+ 0.0008 * sin((188 +14037.3 * $T) * self::PAI) | |
+ 0.0008 * sin((204 + 7906.7 * $T) * self::PAI) | |
+ 0.0007 * sin((140 + 4052.0 * $T) * self::PAI) | |
+ 0.0007 * sin((275 + 4853.3 * $T) * self::PAI) | |
+ 0.0007 * sin((216 + 278.6 * $T) * self::PAI) | |
+ 0.0006 * sin((128 + 1118.7 * $T) * self::PAI) | |
+ 0.0005 * sin((247 +22582.7 * $T) * self::PAI) | |
+ 0.0005 * sin((181 +19088.0 * $T) * self::PAI) | |
+ 0.0005 * sin((114 +17450.7 * $T) * self::PAI) | |
+ 0.0005 * sin((332 + 5091.3 * $T) * self::PAI) | |
+ 0.0004 * sin((213 + 398.7 * $T) * self::PAI) | |
+ 0.0004 * sin((278 + 120.1 * $T) * self::PAI) | |
+ 0.0004 * sin(( 71 + 9584.7 * $T) * self::PAI) | |
+ 0.0004 * sin(( 20 + 720.0 * $T) * self::PAI) | |
+ 0.0003 * sin(( 83 + 3814.0 * $T) * self::PAI) | |
+ 0.0003 * sin(( 66 + 3494.7 * $T) * self::PAI) | |
+ 0.0003 * sin((147 +18089.3 * $T) * self::PAI) | |
+ 0.0003 * sin((311 + 5492.0 * $T) * self::PAI) | |
+ 0.0003 * sin((161 + 40.7 * $T) * self::PAI) | |
+ 0.0003 * sin((280 +23221.3 * $T) * self::PAI) | |
; | |
if($moonRamda > 0): | |
while($moonRamda >= 360): | |
$moonRamda -= 360; | |
endwhile; | |
else: | |
while($moonRamda < 0): | |
$moonRamda += 360; | |
endwhile; | |
endif; | |
return $moonRamda; | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment