2025.03.21
回転行列

回転行列とは


赤の四角で囲んだ部分が回転行列です。

回転行列を使わないで書くと以下のようになります。

Javaソースコード
RotationMatrix1.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
import java.util.Scanner; public class RotationMatrix1 { public static void main( String[] args ) { // Scannerを作成 Scanner scan = new Scanner( System.in ); // x座標の入力 System.out.println( "x座標を入力してください" ); double x = scan.nextDouble(); // y座標の入力 System.out.println( "y座標を入力してください" ); double y = scan.nextDouble(); // 回転角度の入力 System.out.println( "回転角度を度単位で入力してください" ); double deg = scan.nextDouble(); // 度をラジアンに変換 double rad = Math.toRadians( deg ); // 回転後の座標(rx,ry)を計算 double rx = x * Math.cos( rad ) - y * Math.sin( rad ); double ry = x * Math.sin( rad ) + y * Math.cos( rad ); // 結果をコンソール出力 System.out.println( "入力した座標 : ( " + x + ", " + y + " )"); System.out.println( "入力した角度 : " + deg + "度" ); System.out.println( "回転後の座標 : ( " + rx + ", " + ry + " )"); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis RotationMatrix1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac RotationMatrix1.java
実行
C:\talavax\javasample>java RotationMatrix1
実行例1 座標(1.0)を90°回転
x座標を入力してください 1 y座標を入力してください 0 回転角度を度単位で入力してください 90 入力した座標 : ( 1.0, 0.0 ) 入力した角度 : 90.0度 回転後の座標 : ( 6.123233995736766E-17, 1.0 )
実行例2 座標(1.0)を30°回転
x座標を入力してください 1 y座標を入力してください 0 回転角度を度単位で入力してください 30 入力した座標 : ( 1.0, 0.0 ) 入力した角度 : 30.0度 回転後の座標 : ( 0.8660254037844387, 0.49999999999999994 )
Javaソースコードの解説
ここから、ソースコードを解説していきます。
001
import java.util.Scanner;
003
public class RotationMatrix1 {
クラス名を、RotationMatrix1としています。
004
public static void main( String[] args ) {
005 006
// Scannerを作成
Scanner scan = new Scanner( System.in );
標準入力System.inを使って、Scannerクラスのscanを初期化しています。
008 009 010
// x座標の入力 System.out.println( "x座標を入力してください" ); double x = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、x座標を格納するdouble型の変数xに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数xに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
012 013 014
// y座標の入力 System.out.println( "y座標を入力してください" ); double y = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、y座標を格納するdouble型の変数yに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数yに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
016 017 018
// 回転角度の入力 System.out.println( "回転角度を度単位で入力してください" ); double deg = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、度単位の角度を格納するdouble型の変数degに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数degに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
020 021
// 度をラジアンに変換 double rad = Math.toRadians( deg );
度単位の角度degを、Math.toRadiansメソッドを使ってラジアンに変換し、double型の変数radに代入しています。
Math.toRadiansメソッド
public static double Math.toRadians( double a )
・引数aで指定した角度をラジアンに変換した値を返します。 パラメータ a : 角度(単位:度)[ 戻り値 ラジアン
023 024 025
// 回転後の座標(rx,ry)を計算 double rx = x * Math.cos( rad ) - y * Math.sin( rad ); double ry = x * Math.sin( rad ) + y * Math.cos( rad );
027 028 029 030
// 結果をコンソール出力 System.out.println( "入力した座標 : ( " + x + ", " + y + " )"); System.out.println( "入力した角度 : " + deg + "度" ); System.out.println( "回転後の座標 : ( " + rx + ", " + ry + " )");
結果をコンソール出力しています。
Javaソースコード - 回転のメソッド化
RotationMatrix2.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
import java.util.Scanner; public class RotationMatrix2 { // (x,y)をdegだけ回転したx座標を戻す private static double rotation_x( double x, double y, double deg ) { // 度をラジアンに変換 double rad = Math.toRadians( deg ); // 回転後のx座標を計算 return x * Math.cos( rad ) - y * Math.sin( rad ); } // (x,y)をdegだけ回転したy座標を戻す private static double rotation_y( double x, double y, double deg ) { // 度をラジアンに変換 double rad = Math.toRadians( deg ); // 回転後のy座標を計算 return x * Math.sin( rad ) + y * Math.cos( rad ); } // メインメソッド public static void main( String[] args ) { // Scannerを作成 Scanner scan = new Scanner( System.in ); // x座標の入力 System.out.println( "x座標を入力してください" ); double x = scan.nextDouble(); // y座標の入力 System.out.println( "y座標を入力してください" ); double y = scan.nextDouble(); // 回転角度の入力 System.out.println( "回転角度を度単位で入力してください" ); double deg = scan.nextDouble(); // 回転後の座標(rx,ry)を計算 double rx = rotation_x( x, y, deg ); double ry = rotation_y( x, y, deg ); // 結果をコンソール出力 System.out.println( "入力した座標 : ( " + x + ", " + y + " )"); System.out.println( "入力した角度 : " + deg + "度" ); System.out.println( "回転後の座標 : ( " + rx + ", " + ry + " )"); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis RotationMatrix2.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac RotationMatrix2.java
実行
C:\talavax\javasample>java RotationMatrix2
Javaソースコード - 回転のメソッド化の解説
ここから、ソースコードを解説していきます。
001
import java.util.Scanner;
003
public class RotationMatrix2 {
クラス名を、RotationMatrix2としています。
004 005 006 007 008 009 010 011 012
// (x,y)をdegだけ回転したx座標を戻す private static double rotation_x( double x, double y, double deg ) { // 度をラジアンに変換 double rad = Math.toRadians( deg ); // 回転後のx座標を計算 return x * Math.cos( rad ) - y * Math.sin( rad ); }
015 016 017 018 019 020 021 022 023
// (x,y)をdegだけ回転したy座標を戻す private static double rotation_y( double x, double y, double deg ) { // 度をラジアンに変換 double rad = Math.toRadians( deg ); // 回転後のy座標を計算 return x * Math.sin( rad ) + y * Math.cos( rad ); }
026 027
// メインメソッド public static void main( String[] args ) {
028 029
// Scannerを作成
Scanner scan = new Scanner( System.in );
標準入力System.inを使って、Scannerクラスのscanを初期化しています。
031 032 033
// x座標の入力 System.out.println( "x座標を入力してください" ); double x = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、x座標を格納するdouble型の変数xに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数xに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
035 036 037
// y座標の入力 System.out.println( "y座標を入力してください" ); double y = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、y座標を格納するdouble型の変数yに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数yに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
039 040 041
// 回転角度の入力 System.out.println( "回転角度を度単位で入力してください" ); double deg = scan.nextDouble();
nextDoubleメソッドで、キーボードから入力された1行を読み取り、度単位の角度を格納するdouble型の変数degに代入しています。
ここで、入力待ち状態になり、Enterキーが押されるまでに入力した値が変数degに格納されます。
キーボードの"Ctrl"キーを押しながら"C"を押すと強制終了します。
043 044 045
// 回転後の座標(rx,ry)を計算 double rx = rotation_x( x, y, deg ); double ry = rotation_y( x, y, deg );
047 048 049 050
// 結果をコンソール出力 System.out.println( "入力した座標 : ( " + x + ", " + y + " )"); System.out.println( "入力した角度 : " + deg + "度" ); System.out.println( "回転後の座標 : ( " + rx + ", " + ry + " )");
結果をコンソール出力しています。
回転に関するコンテンツ
「回転」に関係があるコンテンツをまとめています。