Up 日時計作成コンピュータプログラム 作成: 2020-10-07
更新: 2020-10-08


    日時計作成のコンピュータプログラム例を,以下に示す。
    これは,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." の場合) <table border=1 cellspacing=0> <tr> <td align=center> 時 </td> <td align=center>南中との<br>経度差</td> <td align=center>南中時の影との<br>角度</td> </tr> "; for( $i = -10; $i < 11; $i++ ){ $db_deg = $mid_south_b_deg + 15 * $i; if( ( $i == 0 ) && ( $mid_south_b_deg == 0 ) ){ print " <tr> <td align=center>12</td> <td align=center>0</td> <td align=center>0</td> </tr> "; } 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 " <tr> <td align=center>".( $i + 12 )."</td> <td align=center>".$db_deg."</td> <td align=center>".$beta_deg."</td> </tr> "; } } } print " </table> ";