public class Vector3D {
    private float[] crd; // (x,y,z)：座標(coordinate)
    
    // コンストラクタ #0
    Vector3D() {
        crd = new float[3];
        crd[0] = crd[1] = crd[2] = 0.0f;
    }
    
    // コンストラクタ #1
    Vector3D(float[] crdIn) {
        crd = new float[3];
        for ( int i = 0; i < 3; ++i ) crd[i] = crdIn[i];
    }
    
    // 読み出しメソッド
    public void get(float[] crdOut) {
        for ( int i = 0; i < 3; ++i ) crdOut[i] = crd[i];
    }
        
    // 書き込みメソッド 
    public void set(float[] crdIn) {
        for ( int i = 0; i < 3; ++i ) crd[i] = crdIn[i];
    }
    
    // ベクトルの大きさ
    public float norm() {
        float norm;
        norm = 0.0f;
        for ( int i = 0; i < 3; ++i ) norm += crd[i] * crd[i];
        norm = (float) Math.sqrt( (double) norm );
        return norm;
    }
    
    // 和： v2 = v0 + v1
    public static void add(Vector3D v0, Vector3D v1, Vector3D v2) {
        for ( int i = 0; i < 3; ++i ) v2.crd[i] = v0.crd[i] + v1.crd[i];
    }
    
    // 差： v2 = v0 - v1
    public static void sub(Vector3D v0, Vector3D v1, Vector3D v2) {
        for ( int i = 0; i < 3; ++i ) v2.crd[i] = v0.crd[i] + v1.crd[i];
    }
    
    // 内積： v0 ・ v1
    public static float scprod(Vector3D v0, Vector3D v1) {
        float prod;
        prod = 0.0f;
        for ( int i = 0; i < 3; ++i ) prod += v0.crd[i] * v1.crd[i];
        return prod;
    }
    
    // 外積： v2 = v0 X v1
    public static void veprod(Vector3D v0, Vector3D v1, Vector3D v2) {
        for ( int i = 0; i < 3; ++i ) {
            int j = i + 1;
            if ( j == 3 ) j = 0;
            int k = j + 1; 
            if ( k == 3 ) k = 0;
            v2.crd[i] = v0.crd[j] * v1.crd[k] - v0.crd[k] * v1.crd[j];
        }
    }         
          
}
