Up 「モジュールB」 作成: 2021-11-21
更新: 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) と
        これの cos, sin
      $alpha_rad[][], $alpha_deg[][]
      $alpha_c[][], $alpha_s[][]
      南中の日影倍率 $r[][]


    (以下は,2変数配列の生成では $alpha_rad[][], $alpha_deg[][], $alpha_c[][], $r[][] のみを示す)
/* 設定 ******************************************************/ /* 公転角度の何度から何度までを表示するか */ $t_from_degree = 0; $t_to_degree = 360; /* 公転角度の何度おきに表示するか */ $t_u_degree = 5; /* 緯度の何度から何度までを表示するか */ $a_from_degree = 25; $a_to_degree = 60; /* 緯度の何度おきに表示するか */ $a_u_degree = 5; /* 公転角度と月日の対応 *******************************/ $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 ); /* 経度差1度あたりの時間差 (秒) */ $spd = 14600 / 61; /* 公転角度と経度・時刻の対応 ***************************/ /* t_pi, t_0 */ $midsun_t_pi = 270; $midsun_t_0 = 90; /* t_pi, t_0 */ $t_pi = $midsun_t_pi; $t_0 = $midsun_t_0; /* 計算ループ **************************************************/ 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; /* 南中の経度計算 ***/ $midsun_b_c = $t_s / sqrt ( 1 - pow( $n_s, 2 ) * pow( $t_c, 2 ) ); $midsun_b = acos( $midsun_b_c ); /* 余弦方程式の二つの解 (αと 2π−α) のうちから,適正な方を選択 ***/ if( $i == 0 ){ $midsun_b = 2 * pi() - $midsun_b; $b_0 = $midsun_b; $b = $midsun_b; } else { $b = $midsun_b; $case = 0; if( ( $i == $t_0 ) || ( $i == $t_pi ) ){ if( $i == $t_0 ){ $b = 0; } else{ $b = pi(); } } else { if( ( 0 < $b_0 ) && ( $b_0 < pi() ) ){ if( $b_0 <= $b ){ if( $i < $t_pi ){ $case = 111; } else{ $case = 112; } } else{ if( $i < $t_0 ){ $case = 121; } else{ $case = 122; } } } /* ( pi() < $b_0 ) && ( $b_0 < 2 * pi() */ else { if( $b_0 <= 2 * pi() - $b ){ if( $i < $t_0 ){ $case = 211; } else{ $case = 212; } } else{ if( $i < $t_pi ){ $case = 221; } else{ $case = 222; } } } if( ( $case == 112 ) || ( $case == 121 ) || ( $case == 211 ) || ( $case == 222 ) ){ $b = 2 * pi() - $b; } } } /* 配列の作成 ***/ 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]; /* 南中の経度 ********/ $midsun_rad[$i] = $b; $midsun_deg[$i] = rad2deg( $b ); /* 正午の経度 ********/ $midday_deg[$i] = 270 + $i; if( $midday_deg[$i] >= 360 ){ $midday_deg[$i] = $midday_deg[$i] - 360; } $midday_rad[$i] = deg2rad( $midday_deg[$i] ); /* 南中の時刻 ******/ $midsun = $midsun_deg[$i]; $midday = $midday_deg[$i]; $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; /* 緯度に対する南中太陽の高度 */ for( $j = $a_from_degree; $j <= $a_to_degree; $j = $j + $a_u_degree ){ /* 緯度 */ $a_radian = deg2rad( $j ); $a_s = sin( $a_radian ); $a_c = cos( $a_radian ); /* 南中太陽の仰角余角α */ $alpha_c[$i][$j] = $a_c * sqrt( 1 - pow($n_s * $t_c, 2) ) + $n_s * $a_s * $t_c; $alpha_rad[$i][$j] = acos( $alpha_c[$i][$j] ); $alpha_s[$i][$j] = sin( $alpha_rad[$i][$j] ); $alpha_deg[$i][$j] = round( rad2deg( $alpha_rad[$i][$j] ), 1 ); /* 南中影倍率 */ $r[$i][$j] = round( tan( $alpha_rad[$i][$j] ), 2 ); } } } }