2021.05.28
時計の短針と長針の角度
角度の計算方法
ここでは、アナログ時計の短針と長針の間の角度を計算する方法を説明します。
それでは、短針と長針のそれぞれの角度の計算方法を解説していきます。
短針は、時の単位を表す針で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 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095
import java.util.Scanner; public class ClockHandtoDegree { // 短針(the hour-hand)の角度を時と分から計算 // 角度は0時を0度として時計回りにプラス // 計測不能時は、-1.0を戻す static double getHourHandDeg( int hour, int minute ) { // 時が0未満の場合-1.0を戻す(エラー) if ( 0 > hour ) return -1.0; // 分が0未満の場合-1.0を戻す(エラー) if ( 0 > minute ) return -1.0; // 分が59を超える場合-1.0を戻す(エラー) if ( 59 < minute ) return -1.0; // 時間を0~12に変換 hour = hour % 12; // 時から計算した短針の角度 double hh_deg; hh_deg = ( 360.0 / 12.0 ) * (double)hour; // 分から計算した長針の角度 double mh_deg; mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute; // 結果を戻す return hh_deg + mh_deg; } // 長針(the minute-hand)の角度を分から計算 // 角度は0分を0度として時計回りにプラス // 計測不能時は、-1.0を戻す static double getMinuteHandDeg( int minute ) { // 分が0未満の場合-1.0を戻す(エラー) if ( 0 > minute ) return -1.0; // 分が59を超える場合-1.0を戻す(エラー) if ( 59 < minute ) return -1.0; // 結果を戻す return ( 360.0 / 60.0 ) * (double)minute; } // 短針→長針の時計周りの角度を計算 // 計測不能時は、-1.0を戻す static double getClockHandDeg( int hour, int minute ) { // 短針の角度 double hh_deg = getHourHandDeg( hour, minute ); if ( 0.0 > hh_deg ) return -1.0; // 長針の角度 double mh_deg = getMinuteHandDeg( minute ); if ( 0.0 > mh_deg ) return -1.0; // 短針→長針の角度 double clock_deg = mh_deg - hh_deg; // 計算結果がマイナスの場合、360を足してプラスにする if ( 0.0 > clock_deg ) clock_deg += 360.0; return clock_deg; } // メイン public static void main( String[] args ) { // 整数の値をキーボードから入力 Scanner scanner = new Scanner( System.in ); // 時間の入力 System.out.print( "時間を整数で入力してください:" ); String h = scanner.next(); int hour = Integer.parseInt( h ); // 分の入力 System.out.print( "分を整数で入力してください:" ); String m = scanner.next(); int minute = Integer.parseInt( m ); // 短針→長針の角度を計算 double clock_deg = getClockHandDeg( hour, minute ); // 結果出力 System.out.println( "時刻: " + hour + ":" + minute ); System.out.println( "角度: " + clock_deg ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis ClockHandtoDegree.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac ClockHandtoDegree.java
実行
C:\talavax\javasample>java ClockHandtoDegree
実行結果
時間を整数で入力してください: 10 分を整数で入力してください: 10 時刻 10:10 角度 115.0
10時10分の短針と長針との間の角度115.0が出力されています。
Javaソースコードの解説
ここからは、このソースコードを上から順番に解説していきます。
001
import java.util.Scanner;
003
public class ClockHandtoDegree {
クラス名を、ClockHandtoDegreeとしています。
004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031
// 短針(the hour-hand)の角度を時と分から計算 // 角度は0時を0度として時計回りにプラス // 計測不能時は、-1.0を戻す static double getHourHandDeg( int hour, int minute ) { // 時が0未満の場合-1.0を戻す(エラー) if ( 0 > hour ) return -1.0; // 分が0未満の場合-1.0を戻す(エラー) if ( 0 > minute ) return -1.0; // 分が59を超える場合-1.0を戻す(エラー) if ( 59 < minute ) return -1.0; // 時間を0~12に変換 hour = hour % 12; // 時から計算した短針の角度 double hh_deg; hh_deg = ( 360.0 / 12.0 ) * (double)hour; // 分から計算した長針の角度 double mh_deg; mh_deg = ( 360.0 / 12.0 / 60.0 ) * (double)minute; // 結果を戻す return hh_deg + mh_deg; }
引数hourは、hour = hour % 12;によって0~11の値に変換しています。例えばhour=23の場合、23 % 12 = 11となります。
034 035 036 037 038 039 040 041 042 043 044 045 046 047
// 長針(the minute-hand)の角度を分から計算 // 角度は0分を0度として時計回りにプラス // 計測不能時は、-1.0を戻す static double getMinuteHandDeg( int minute ) { // 分が0未満の場合-1.0を戻す(エラー) if ( 0 > minute ) return -1.0; // 分が59を超える場合-1.0を戻す(エラー) if ( 59 < minute ) return -1.0; // 結果を戻す return ( 360.0 / 60.0 ) * (double)minute; }
050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070
// 短針→長針の時計周りの角度を計算 // 計測不能時は、-1.0を戻す static double getClockHandDeg( int hour, int minute ) { // 短針の角度 double hh_deg = getHourHandDeg( hour, minute ); if ( 0.0 > hh_deg ) return -1.0; // 長針の角度 double mh_deg = getMinuteHandDeg( minute ); if ( 0.0 > mh_deg ) return -1.0; // 短針→長針の角度 double clock_deg = mh_deg - hh_deg; // 計算結果がマイナスの場合、360を足してプラスにする if ( 0.0 > clock_deg ) clock_deg += 360.0; return clock_deg; }
短針の角度を求めるメソッド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 080 081
// 時間の入力 System.out.print( "時間を整数で入力してください:" ); String h = scanner.next(); int hour = Integer.parseInt( h );
printメソッドで、"時間を整数で入力してください:" をコンソール出力しています。printメソッドを使っているので、コンソール入力した文字はメッセージの右側に表示されます。printlnメソッドを使った場合、コンソール入力した文字はメッセージの下の行に表示されます。
nextLineメソッドで、キーボードから入力された1行を読み取り、String型のhに代入しています。ここで、入力待ち状態になり、Enterキーが押されるまでの入力文字がlineに格納されます。キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
IntegerクラスのparseIntメソッドで、文字列hを整数hourに変換しています。
083 084 085 086
// 分の入力 System.out.print( "分を整数で入力してください:" ); String m = scanner.next(); 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 );
091 092 093
// 結果出力 System.out.println( "時刻: " + hour + ":" + minute ); System.out.println( "角度: " + clock_deg );
結果をコンソール出力しています。
以上です。