Skip to content

Instantly share code, notes, and snippets.

@nobodyplace
Created December 1, 2009 17:18
Show Gist options
  • Save nobodyplace/246449 to your computer and use it in GitHub Desktop.
Save nobodyplace/246449 to your computer and use it in GitHub Desktop.
Class Calcurate Moon Age Time
<?php
/**
* Class Calcurate Moon Age Time
*
* PHP version 5
*
* Licence:
*
* Copyright (c) 2006-2009, Ippei Suzuki <nobodyplace@gmail.com>
* 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