Up 「モジュールA」 作成: 2021-11-20
更新: 2021-11-21


    緯度を固定して,公転角度を変数にしたつぎの配列を生成する:
      公転角度の cos, sin $tau_c[], $tau_s[]
      月日 (文字列) $date[]
      正午, 南中, 日出, 日入
       の経度 ( rad と deg )
      $midday_rad[], $midday_deg[]
      $midsun_rad[], $midsun_deg[]
      $sunrise_rad[], $sunrise_deg[]
      $sunset_rad[], $sunset_deg[]
      南中, 日出, 日入
        の時刻 (文字列)
      $midsun_time[]
      $sunrise_time[]
      $sunset_time[]
      日中, 日中午前, 日中午後
       の時間 (sec と文字列)
      $am_pm[], $am_pm_str[]
      $am[], $am_str[]
      $pm[], $pm_str[]
      南中太陽の仰角余角 (rad と deg) と
        これの cos, sin
      $alpha_rad[], $alpha_deg[]
      $alpha_c[], $alpha_s[]
      南中の日影倍率 $r[]


/* 設定 ******************************************************/ /* 公転角度の何度から何度までを表示するか */ $t_from_degree = 0; $t_to_degree = 360; /* 公転角度の何度おきに表示するか */ $t_u_degree = 5; /* 緯度 */ $a_degree = 50; /* 公転角度と月日の対応 *******************************/ $m_days[1] = 31; $m_days[2] = 28; $m_days[3] = 31; $m_days[4] = 30; $m_days[5] = 31; $m_days[6] = 30; $m_days[7] = 31; $m_days[8] = 31; $m_days[9] = 30; $m_days[10] = 31; $m_days[11] = 30; $m_days[12] = 31; /* 夏至 (6月20日) */ $summer_solstice_mon = 6; $summer_solstice_day = 20; $mm = $summer_solstice_mon; $dd = $summer_solstice_day; for( $i = 0; $i < 365; $i++ ){ $month[$i] = $mm; $day[$i] = $dd; if( $dd + 1 > $m_days[$mm] ){ $dd = 1; if( $mm + 1 < 13 ){ $mm++; } else{ $mm = 1; } } else{ $dd++; } } /* 定項 ******************************************************/ /* 自転軸の傾き */ $n_degree = 23.4; $n_radian = deg2rad( $n_degree ); $n_s = sin( $n_radian ); $n_c = cos( $n_radian ); /* 緯度 */ $a_radian = deg2rad( $a_degree ); $a_s = sin( $a_radian ); $a_c = cos( $a_radian ); /* 経度差1度あたりの時間差 (秒) */ $spd = 14600 / 61; /* 公転角度と経度・時刻の対応 ***************************/ /* t_pi, t_0 */ $sunrise_t_pi = 25; $sunrise_t_0 = 155; $sunset_t_pi = 205; $sunset_t_0 = 335; $midsun_t_pi = 270; $midsun_t_0 = 90; /* t_pi, t_0 */ $t_pi[0] = $sunrise_t_pi; $t_pi[1] = $sunset_t_pi; $t_pi[2] = $midsun_t_pi; $t_0[0] = $sunrise_t_0; $t_0[1] = $sunset_t_0; $t_0[2] = $midsun_t_0; /* 時間表示での単位フォント ***************************/ $h_font = "<font size=\"-1\" color=\"#999999\">h</font>"; $m_font = "<font size=\"-1\" color=\"#999999\">m</font>"; $s_font = "<font size=\"-1\" color=\"#999999\">s</font>"; /* 計算ループ **************************************************/ for( $i = 0; $i < 360; $i++ ){ $t = deg2rad( $i ); $t_s = sin( $t ); $t_c = cos( $t ); $tau[$i] = $t; $tau_s[$i] = $t_s; $tau_c[$i] = $t_c; /* 日出・日入・南中の経度計算 ***/ $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) ) ); $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) ) ); $midsun_b_c = $t_s / sqrt ( 1 - pow( $n_s, 2 ) * pow( $t_c, 2 ) ); $sunrise_b = acos( $sunrise_b_c ); $sunset_b = acos( $sunset_b_c ); $midsun_b = acos( $midsun_b_c ); /* 余弦方程式の二つの解 (αと 2π−α) のうちから,適正な方を選択 ***/ if( $i == 0 ){ $midsun_b = 2 * pi() - $midsun_b; $b_0[0] = $sunrise_b; $b_0[1] = $sunset_b; $b_0[2] = $midsun_b; $b[0] = $sunrise_b; $b[1] = $sunset_b; $b[2] = $midsun_b; } else { $b[0] = $sunrise_b; $b[1] = $sunset_b; $b[2] = $midsun_b; for( $j = 0; $j < 3; $j++ ){ $case = 0; if( ( $i == $t_0[$j] ) || ( $i == $t_pi[$j] ) ){ if( $i == $t_0[$j] ){ $b[$j] = 0; } else{ $b[$j] = pi(); } } else { if( ( 0 < $b_0[$j] ) && ( $b_0[$j] < pi() ) ){ if( $b_0[$j] <= $b[$j] ){ if( $i < $t_pi[$j] ){ $case = 111; } else{ $case = 112; } } else{ if( $i < $t_0[$j] ){ $case = 121; } else{ $case = 122; } } } /* ( pi() < $b_0[$j] ) && ( $b_0[$j] < 2 * pi() */ else { if( $b_0[$j] <= 2 * pi() - $b[$j] ){ if( $i < $t_0[$j] ){ $case = 211; } else{ $case = 212; } } else{ if( $i < $t_pi[$j] ){ $case = 221; } else{ $case = 222; } } } } if( ( $case == 112 ) || ( $case == 121 ) || ( $case == 211 ) || ( $case == 222 ) ){ $b[$j] = 2 * pi() - $b[$j]; } } } /* 配列の作成 ***/ if( ( $i >= $t_from_degree ) && ( $i < $t_to_degree ) ){ if( $i % $t_u_degree == 0 ){ /* 月日 ********/ $ii = round( 365 * $i / 360, 0); $date[$i] = $month[$ii]."/".$day[$ii]; /* 日出・日入・南中の経度 ********/ $sunrise_rad[$i] = $b[0]; $sunset_rad[$i] = $b[1]; $midsun_rad[$i] = $b[2]; $sunrise_deg[$i] = rad2deg( $b[0] ); $sunset_deg[$i] = rad2deg( $b[1] ); $midsun_deg[$i] = rad2deg( $b[2] ); /* 正午の経度 ********/ $midday_deg[$i] = 270 + $i; if( $midday_deg[$i] >= 360 ){ $midday_deg[$i] = $midday_deg[$i] - 360; } $midday_rad[$i] = deg2rad( $midday_deg[$i] ); /* 時刻の計算 ******/ $sunrise = $sunrise_deg[$i]; $sunset = $sunset_deg[$i]; $midsun = $midsun_deg[$i]; $midday = $midday_deg[$i]; if( $sunset < $midsun ){ $sunset = $sunset + 360; } if( $sunrise > $midsun ){ $midsun = $midsun + 360; $sunset = $sunset + 360; $midday = $midday + 360; } /* 日出から正午までの時間,日出の時刻 ******/ $bd = $midday - $sunrise; $sec = round( $spd * $bd, 0 ); $sec1 = $sec % ( 60 * 60 ); $hh = ( $sec - $sec1 ) / ( 60 * 60 ); $ss = $sec1 % 60; $mm = ( $sec1 - $ss ) / 60; $am[$i] = $sec; $am_str[$i] = $hh.$h_font.$mm.$m_font.$ss.$s_font; $ss = 60 - $ss; $mm = 59 - $mm; $hh = 11 - $hh; $sunrise_time[$i] = $hh.":".$mm.":".$ss; /* 正午から日入までの時間,日入の時刻 ******/ $bd = $sunset - $midday; $sec = round( $spd * $bd, 0 ); $sec1 = $sec % ( 60 * 60 ); $hh = ( $sec - $sec1 ) / ( 60 * 60 ); $ss = $sec1 % 60; $mm = ( $sec1 - $ss ) / 60; $pm[$i] = $sec; $pm_str[$i] = $hh.$h_font.$mm.$m_font.$ss.$s_font; $hh = 12 + $hh; $sunset_time[$i] = $hh.":".$mm.":".$ss; /* 日中時間 ******/ $sec = $am[$i] + $pm[$i]; $sec1 = $sec % ( 60 * 60 ); $hh = ( $sec - $sec1 ) / ( 60 * 60 ); $ss = $sec1 % 60; $mm = ( $sec1 - $ss ) / 60; $am_pm[$i] = $sec; $am_pm_str[$i] = $hh.$h_font.$mm.$m_font.$ss.$s_font; /* 南中の時刻 ******/ $bd = $midsun - $midday; $sec = round( $spd * $bd, 0 ); if( $sec < 0 ){ $sec = -$sec; } /* $sec は,3600秒 (1時間) 未満 */ $ss = $sec % 60; $mm = ( $sec - $ss ) / 60; /* 南中が午後 */ if( $bd >= 0 ){ $hh = 12; } /* 南中が正午前 */ else { $ss = 60 - $ss; $mm = 59 - $mm; $hh = 11; } $midsun_time[$i] = $hh.":".$mm.":".$ss; /* 南中の太陽の仰角余角 ******/ $t = deg2rad( $i ); $t_c = cos( $t ); $alpha_c[$i] = $a_c * sqrt( 1 - pow( $n_s, 2) * pow( $t_c, 2) ) + $n_s * $a_s * $t_c; $alpha_rad[$i] = acos($alpha_c[$i]); $alpha_s[$i] = sin($alpha_rad[$i]); $alpha_deg[$i] = round( rad2deg( $alpha_rad[$i] ), 1 ); /* 南中の日影倍率 */ $r[$i] = round( tan( $alpha_rad[$i] ), 2 ); } } }