日時計作成のコンピュータプログラム例を,以下に示す。
これは,html で実行する PHP プログラムである。
";
/******* 変数 (代入項) は,緯度と公転角度 ****************************************************/
/* 緯度 */
$a_deg = 50;
$a = deg2rad( $a_deg );
$a_c = cos( $a );
$a_s = sin( $a );
/* 公転角度 */
$t_deg = 0;
$t = deg2rad( $t_deg );
$t_c = cos( $t );
$t_s = sin( $t );
/******* 以下,自動処理 ****************************************************************************/
/* 自転軸の傾き */
$n_deg = 23.4;
$n = deg2rad( $n_deg );
$n_c = cos( $n );
$n_s = sin( $n );
/* 日出・正午・日入の経度 */
$sunrise_b_c = ( - $n_s * $a_s * $t_s * $t_c - $n_c * $t_c * sqrt( pow($a_c, 2) - pow($n_s * $t_c, 2) ) )
/ ( $a_c * (1 - pow($n_s * $t_c, 2) ) );
$mid_b_c = ( $a_s * $n_s * $t_s * $t_c + $n_c * $t_s * sqrt( pow($a_c, 2) - pow($n_s * $t_s, 2) ) )
/ ( $a_c * (1 - pow($n_s * $t_s, 2) ) );
$sunset_b_c = ( - $n_s * $a_s * $t_s * $t_c + $n_c * $t_c * sqrt( pow($a_c, 2) - pow($n_s * $t_c, 2) ) )
/ ( $a_c * (1 - pow($n_s * $t_c, 2) ) );
$sunrise_b = acos( $sunrise_b_c );
$mid_b = acos( $mid_b_c );
$sunset_b = acos( $sunset_b_c );
/******* 余弦方程式の二つの解 (αと 2π−α) のうちから,適正な方を選択 ********/
/* 公転角度0のときの日出・正午・日入の経度 */
$sunrise0_b_c = - sqrt( pow($a_c, 2) - pow($n_s, 2) ) / ( $a_c * $n_c );
$sunset0_b_c = sqrt( pow($a_c, 2) - pow($n_s, 2) ) / ( $a_c * $n_c );
$sunrise0_b = acos( $sunrise_b_c );
$mid0_b = pi() * 3/2;
$sunset0_b = acos( $sunset_b_c );
/* 緯度50 のτπ, τ0値 (経度が0, πになるときの公転角度) */
$sunrise_t_pi = 25;
$sunrise_t_0 = 155;
$mid_t_pi = 295;
$mid_t_0 = 65;
$sunset_t_pi = 205;
$sunset_t_0 = 335;
$t_pi[0] = $sunrise_t_pi;
$t_pi[1] = $mid_t_pi;
$t_pi[2] = $sunset_t_pi;
$t_0[0] = $sunrise_t_0;
$t_0[1] = $mid_t_0;
$t_0[2] = $sunset_t_0;
$c_0[0] = $sunrise0_b;
$c_0[1] = $mid0_b;
$c_0[2] = $sunset0_b;
$c[0] = $sunrise_b;
$c[1] = $mid_b;
$c[2] = $sunset_b;
for( $j = 0; $j < 3; $j++ ){
$case = 0;
if( ( $t_deg == $t_0[$j] ) || ( $t_deg == $t_pi[$j] ) ){
if( $t_deg == $t_0[$j] ){
$c[$j] = 0;
}
else{
$c[$j] = pi();
}
}
else {
if( ( 0 < $c_0[$j] ) && ( $c_0[$j] < pi() ) ){
if( $c_0[$j] <= $c[$j] ){
if( $t_deg < $t_pi[$j] ){
$case = 111;
}
else{
$case = 112;
}
}
else{
if( $t_deg < $t_0[$j] ){
$case = 121;
}
else{
$case = 122;
}
}
}
/* ( pi() < $c_0[$j] ) && ( $c_0[$j] < 2 * pi() */
else {
if( $c_0[$j] <= 2 * pi() - $c[$j] ){
if( $t_deg < $t_0[$j] ){
$case = 211;
}
else{
$case = 212;
}
}
else{
if( $t_deg < $t_pi[$j] ){
$case = 221;
}
else{
$case = 222;
}
}
}
}
if( ( $case == 112 ) || ( $case == 121 ) || ( $case == 211 ) || ( $case == 222 ) ){
$c[$j] = 2 * pi() - $c[$j];
}
}
$sunrise_b = $c[0];
$mid_b = $c[1];
$sunset_b = $c[2];
/* 南中の経度 */
$south_b_c = $t_s / sqrt( 1 - pow( $n_s, 2 ) * pow( $t_c, 2 ) );
$south_b = acos( $south_b_c );
if( $t_deg < 90 || $t >=270 ) {
$south_b = 2 * pi() - $south_b;
}
/* 日出・正午・日入と南中の経度差 */
$sunrise_south_b = $sunrise_b - $south_b;
$mid_south_b = $mid_b - $south_b;
$sunset_south_b = $sunset_b - $south_b;
if( $sunrise_south_b > 0 ){
$sunrise_south_b = $sunrise_south_b - 2 * pi();
}
if( $sunset_south_b < 0 ){
$sunset_south_b = $sunset_south_b + 2 * pi();
}
if( $mid_south_b > pi() / 2 ) {
$mid_south_b = 2 * pi() - $mid_south_b;
}
if( $mid_south_b < - pi() / 2 ) {
$mid_south_b = 2 * pi() + $mid_south_b;
}
$mid_south_b_deg = round( rad2deg( $mid_south_b ), 0 );
/* 南中太陽の高度 */
$alpha0_c = $a_c * sqrt( 1 - pow( $n_s, 2 ) * pow( $t_c, 2 ) ) + $n_s * $a_s * $t_c;
$alpha0 = acos( $alpha0_c );
$alpha0_s = sin( $alpha0 );
/* 計算・レコード書き出し */
print "
影の移動 (公転角度 ".$t_deg.", 緯度 ".$a_deg." の場合)
時 |
南中との 経度差 |
南中時の影との 角度 |
";
for( $i = -10; $i < 11; $i++ ){
$db_deg = $mid_south_b_deg + 15 * $i;
if( ( $i == 0 ) && ( $mid_south_b_deg == 0 ) ){
print "
12 |
0 |
0 |
";
}
else {
$db = deg2rad( $db_deg );
/* 日出から日入までの間か? */
if( ( $db > $sunrise_south_b ) && ( $db <$sunset_south_b ) ){
$b = $south_b + $db;
$b_c = cos( $b );
$b_s = sin( $b );
$alpha_c = $a_c * $t_s * $b_c - $n_c * $a_c * $t_c * $b_s + $n_s * $a_s * $t_c;
$alpha = acos( $alpha_c );
$alpha_s = sin( $alpha );
$db_c = cos( $db );
$beta_c = ( $db_c - $alpha_c * $alpha0_c ) / ( $alpha_s * $alpha0_s );
$beta = acos( $beta_c );
$beta_deg = round( rad2deg( $beta ), 0 );
if( $db_deg < 0 ){
$beta_deg = - $beta_deg;
}
print "
".( $i + 12 )." |
".$db_deg." |
".$beta_deg." |
";
}
}
}
print "
";
|