2021/05/28 公開
・短針と長針の角度
ここでは、アナログ時計の短針と長針の間の角度を計算する方法を説明します。
時間を0以上の整数、分を0~59の整数で与えて角度を計算します。計算する角度は、短針を時計周り(右周り)に回していき、長針に追いつく角度です。例えば9:00場合は90度、3:00の場合は270度となります。
短針と長針の間の角度は、長針と短針の角度をそれぞれ求めて、その2つの角度の差から計算します。針の角度は0:00を基準とし、時計回り(右回り)をプラスとします。
それでは、短針と長針のそれぞれの角度の計算方法を解説していきます。
短針は、時の単位を表す針で0時(12時)~11時を表します。この針は、12時間で1回転(360度)するので、1時間では30度回転します(360/12=30)。1分間では0.5度回転します(30/60=0.5)。
長針は、分の単位を表す針で0~59分を表します。1時間(60分)で1回転(360度)するので、1分間では6度回転します(360/60=6)。
上記の内容をまとめると以下の計算式になります。
・短針の角度の計算式
短針の角度=(360÷12)×時 + (360÷12÷60)×分
・長針の角度の計算式
長針の角度=(360÷60)×分
短針と長針との間の角度は、
短針と長針との間の角度=長針の角度-短針の角度
で計算します。この値がマイナスになった場合、360を足します。
以下は、上記の計算を行うJavaのソースコードです。時間と分はそれぞれキーボードで入力します。
ClockHandtoDegree.java ← クリックしてダウンロードページに移動001: import java.util.Scanner; 002: 003: public class ClockHandtoDegree { 004: // 短針(the hour-hand)の角度を時と分から計算 005: // 角度は0時を0度として時計回りにプラス 006: // 計測不能時は、-1.0を戻す 007: static double getHourHandDeg( int hour, int minute ) 008: { 009: // 時が0未満の場合-1.0を戻す(エラー) 010: if ( 0 > hour ) return -1.0; 011: 012: // 分が0未満の場合-1.0を戻す(エラー) 013: if ( 0 > minute ) return -1.0; 014: 015: // 分が59を超える場合-1.0を戻す(エラー) 016: if ( 59 < minute ) return -1.0; 017: 018: // 時間を0~12に変換 019: hour = hour % 12; 020: 021: // 時から計算した短針の角度 022: double hh_deg; 023: hh_deg = ( 360.0 / 12.0 ) * (double)hour; 024: 025: // 分から計算した長針の角度 026: double mh_deg; 027: mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute; 028: 029: // 結果を戻す 030: return hh_deg + mh_deg; 031: } 032: 033: 034: // 長針(the minute-hand)の角度を分から計算 035: // 角度は0分を0度として時計回りにプラス 036: // 計測不能時は、-1.0を戻す 037: static double getMinuteHandDeg( int minute ) 038: { 039: // 分が0未満の場合-1.0を戻す(エラー) 040: if ( 0 > minute ) return -1.0; 041: 042: // 分が59を超える場合-1.0を戻す(エラー) 043: if ( 59 < minute ) return -1.0; 044: 045: // 結果を戻す 046: return ( 360.0 / 60.0 ) * (double)minute; 047: } 048: 049: 050: // 短針→長針の時計周りの角度を計算 051: // 計測不能時は、-1.0を戻す 052: static double getClockHandDeg( int hour, int minute ) 053: { 054: // 短針の角度 055: double hh_deg = getHourHandDeg( hour, minute ); 056: if ( 0.0 > hh_deg ) return -1.0; 057: 058: // 長針の角度 059: double mh_deg = getMinuteHandDeg( minute ); 060: if ( 0.0 > mh_deg ) return -1.0; 061: 062: // 短針→長針の角度 063: double clock_deg = mh_deg - hh_deg; 064: 065: // 計算結果がマイナスの場合、360を足してプラスにする 066: if ( 0.0 > clock_deg ) 067: clock_deg += 360.0; 068: 069: return clock_deg; 070: } 071: 072: 073: // メイン 074: public static void main( String[] args ) { 075: // 整数の値をキーボードから入力 076: Scanner scanner = new Scanner( System.in ); 077: 078: // 時間の入力 079: System.out.print( "時間を整数で入力してください:" ); 080: String h = scanner.next(); 081: int hour = Integer.parseInt( h ); 082: 083: // 分の入力 084: System.out.print( "分を整数で入力してください:" ); 085: String m = scanner.next(); 086: int minute = Integer.parseInt( m ); 087: 088: // 短針→長針の角度を計算 089: double clock_deg = getClockHandDeg( hour, minute ); 090: 091: // 結果出力 092: System.out.println( "時刻: " + hour + ":" + minute ); 093: System.out.println( "角度: " + clock_deg ); 094: } 095: }
ClockHandtoDegree実行
C:\talavax\javasample>java ClockHandtoDegree
ClockHandtoDegree.javaの出力結果
時間を整数で入力してください: 10 分を整数で入力してください: 10 時刻 10:10 角度 115.0
ここからは、このソースコードを上から順番に解説していきます。
001: import java.util.Scanner;
Javaのクラスライブラリの中から「java.util.Scanner」というパッケージにあるクラスを使うために記述しています。
003: public class ClockHandtoDegree {
クラス名を、ClockHandtoDegreeとしています。
004: // 短針(the hour-hand)の角度を時と分から計算 005: // 角度は0時を0度として時計回りにプラス 006: // 計測不能時は、-1.0を戻す 007: static double getHourHandDeg( int hour, int minute ) 008: { 009: // 時が0未満の場合-1.0を戻す(エラー) 010: if ( 0 > hour ) return -1.0; 011: 012: // 分が0未満の場合-1.0を戻す(エラー) 013: if ( 0 > minute ) return -1.0; 014: 015: // 分が59を超える場合-1.0を戻す(エラー) 016: if ( 59 < minute ) return -1.0; 017: 018: // 時間を0~12に変換 019: hour = hour % 12; 020: 021: // 時から計算した短針の角度 022: double hh_deg; 023: hh_deg = ( 360.0 / 12.0 ) * (double)hour; 024: 025: // 分から計算した長針の角度 026: double mh_deg; 027: mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute; 028: 029: // 結果を戻す 030: return hh_deg + mh_deg; 031: }
短針の角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。
引数hourは、hour = hour % 12;によって0~11の値に変換しています。例えばhour=23の場合、23 % 12 = 11となります。
034: // 長針(the minute-hand)の角度を分から計算 035: // 角度は0分を0度として時計回りにプラス 036: // 計測不能時は、-1.0を戻す 037: static double getMinuteHandDeg( int minute ) 038: { 039: // 分が0未満の場合-1.0を戻す(エラー) 040: if ( 0 > minute ) return -1.0; 041: 042: // 分が59を超える場合-1.0を戻す(エラー) 043: if ( 59 < minute ) return -1.0; 044: 045: // 結果を戻す 046: return ( 360.0 / 60.0 ) * (double)minute; 047: }
長針の角度を計算するメソッドです。引数に分を表すminuteを渡し、角度を戻すメソッドです。引数が範囲外の場合には、-1.0を戻します。これはエラーを意味しています。
050: // 短針→長針の時計周りの角度を計算 051: // 計測不能時は、-1.0を戻す 052: static double getClockHandDeg( int hour, int minute ) 053: { 054: // 短針の角度 055: double hh_deg = getHourHandDeg( hour, minute ); 056: if ( 0.0 > hh_deg ) return -1.0; 057: 058: // 長針の角度 059: double mh_deg = getMinuteHandDeg( minute ); 060: if ( 0.0 > mh_deg ) return -1.0; 061: 062: // 短針→長針の角度 063: double clock_deg = mh_deg - hh_deg; 064: 065: // 計算結果がマイナスの場合、360を足してプラスにする 066: if ( 0.0 > clock_deg ) 067: clock_deg += 360.0; 068: 069: return clock_deg; 070: }
短針と長針の間の角度を計算するメソッドです。引数に時間を表すhourと分を表すminuteを渡し角度を求めます。
短針の角度を求めるメソッドgetHourHandDegと、長針の角度を求めるメソッドgetMinuteHandDegから戻された角度の差を計算し、その値がマイナスの場合に360を足してプラスにしています。
073: // メイン 074: public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
075: // 整数の値をキーボードから入力 076: Scanner scanner = new Scanner( System.in );
標準入力System.inを使って、Scannerクラスのscanを初期化しています。
078: // 時間の入力 079: System.out.print( "時間を整数で入力してください:" ); 080: String h = scanner.next(); 081: int hour = Integer.parseInt( h );
printメソッドで、"時間を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。
nextLineメソッドで、キーボードから入力された1行を読み取り、String型のhに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
IntegerクラスのparseIntメソッドで、文字列hを整数hourに変換しています。
083: // 分の入力 084: System.out.print( "分を整数で入力してください:" ); 085: String m = scanner.next(); 086: int minute = Integer.parseInt( m );
printメソッドで、"分を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。
nextLineメソッドで、キーボードから入力された1行を読み取り、String型のmに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
IntegerクラスのparseIntメソッドで、文字列mを整数minuteに変換しています。
088: // 短針→長針の角度を計算 089: double clock_deg = getClockHandDeg( hour, minute );
短針と長針の間の角度を計算するメソッドを呼び出しています。計算結果は、double型の変数clock_degに代入されます。
091: // 結果出力 092: System.out.println( "時刻: " + hour + ":" + minute ); 093: System.out.println( "角度: " + clock_deg );
結果をコンソール出力しています。
以上です。
■関連コンテンツ
角度の正規化 | 角度(単位°)を0~360°に収めるメソッド |
キーボード入力 | ScannerクラスとSystem.inを使用 |
メソッド | メソッドについて解説 |
return文 | メソッドの戻り値 |
値のコンソール表示 | print()、println()とは? |
計算結果の表示足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明 |
|
if文条件による処理の分岐に使用するif文について解説 |
|
剰余(余り)計算剰余(余り)をを計算するプログラムの紹介と、その結果を表示する方法を解説 |
■新着情報
2022.07.07 | 外部プログラムの実行 | exeファイル実行 |
2022.07.06 | 完全数 | 6=1+2+3 |
■広告