public class Transform {
    static final float pi = 3.141592f; 

    public static void main(String args[]) {
        float[][] elm = new float[3][3];
        
        // z軸回りのd度(ラジアン)の回転
        float d = pi/4.0f;  // 45度
        float cosD = (float) Math.cos( (double) d );
        float sinD = (float) Math.sin( (double) d );
        elm[0][0] = cosD; elm[0][1] = -sinD; elm[0][2] = 0.0f;
        elm[1][0] = sinD; elm[1][1] = cosD;  elm[1][2] = 0.0f;
        elm[2][0] = 0.0f;  elm[2][1] = 0.0f;   elm[2][2] = 1.0f;
                        
        // 行列インスタンスの生成
        Matrix3D m0 = new Matrix3D( elm );
        
        // x軸回りのd度(ラジアン)の回転
        d = pi/6.0f;  // 30度
        cosD = (float) Math.cos( (double) d );
        sinD = (float) Math.sin( (double) d );
        elm[0][0] = 1.0f; elm[0][1] = 0.0f; elm[0][2] = 0.0f;
        elm[1][0] = 0.0f; elm[1][1] = cosD; elm[1][2] = -sinD;
        elm[2][0] = 0.0f; elm[2][1] = sinD; elm[2][2] = cosD;
                        
        // 行列インスタンスの生成
        Matrix3D m1 = new Matrix3D( elm );
        
        // ベクトルのセット
        float[] crd = new float[3];
        crd[0] = 1.0f; crd[1] = crd[2] = 0.0f;
        Vector3D v0 = new Vector3D( crd );
        System.out.println( "Vector = ("+crd[0]+", "+crd[1]+", "+crd[2]+")");
        
        // m0 による回転移動
        Vector3D v1 = new Vector3D();
        m0.vprod( v0, v1 );
        v1.get( crd );
        System.out.println( "After rotated by m0" );
        System.out.println( "Vector = ("+crd[0]+", "+crd[1]+", "+crd[2]+")");
        
        // m1 による回転移動
        Vector3D v2 = new Vector3D();
        m1.vprod( v1, v2 );
        v2.get( crd );
        System.out.println( "After rotated by m1" );
        System.out.println( "Vector = ("+crd[0]+", "+crd[1]+", "+crd[2]+")"); 
        
        // m0 m1 (行列の積)による回転移動
        Matrix3D m2 = new Matrix3D();
        Matrix3D.prod( m1, m0, m2 );
        m2.vprod( v0, v1 );
        v1.get( crd );
        System.out.println( "After rotated by m1 m0" );
        System.out.println( "Vector = ("+crd[0]+", "+crd[1]+", "+crd[2]+")");         
    }  
}
