import Vector3D;

public class Intersection {

    public static void main(String args[]) {
        float sp0[] = new float[2];  // 線分#0 始点 
        float ep0[] = new float[2];  //        終点
        float sp1[] = new float[2];  // 線分#1 始点
        float ep1[] = new float[2];  //        終点
        
        // 座標値の設定
        sp0[0] = -4.0f; sp0[1] = -2.5f;
        ep0[0] = 3.0f;  ep0[1] = 3.0f;
        sp1[0] = 2.5f;  sp1[1] = -3.0f;
        ep1[0] = -3.5f; ep1[1] = 4.5f;
                
        // ベクトルの生成
        float crd[] = new float[3];
        Vector3D v0, v1, v2;
        for ( int i = 0; i < 2; ++i ) crd[i] = ep0[i] - sp0[i];
        crd[2] = 0.0f;
        v0 = new Vector3D( crd );
        for ( int i = 0; i < 2; ++i ) crd[i] = sp1[i] - sp0[i];
        v1 = new Vector3D( crd );
        for ( int i = 0; i < 2; ++i ) crd[i] = 0.0f;
        crd[2] = 1.0f;
        v2 = new Vector3D( crd );
        
        // ( v0 X v1 )・v2
        Vector3D v3 = new Vector3D();
        Vector3D.veprod( v0, v1, v3 );  // 外積
        float r0 = Vector3D.scprod( v3, v2 );  // 内積
        
        // ベクトルv1の変更
        for ( int i = 0; i < 2; ++i ) crd[i] = ep1[i] - sp0[i];
        v1.set( crd );
        
        // ( v0 X v1 )・v2
        Vector3D.veprod( v0, v1, v3 );  // 外積
        float r1 = Vector3D.scprod( v3, v2 );  // 内積

        if ( r0 * r1 > 0.0f ) {
            System.out.println( "Not intersected found at 1st step." );
            System.exit(0);
        }
        
        // ベクトルv0, v1の変更
        for ( int i = 0; i < 2; ++i ) crd[i] = ep1[i] - sp1[i];
        crd[2] = 0.0f;
        v0.set( crd );
        for ( int i = 0; i < 2; ++i ) crd[i] = sp0[i] - sp1[i];
        v1.set( crd );
        
        // ( v0 X v1 )・v2
        Vector3D.veprod( v0, v1, v3 );  // 外積
        r0 = Vector3D.scprod( v3, v2 );  // 内積
        
        // ベクトルv1の変更
        for ( int i = 0; i < 2; ++i ) crd[i] = ep0[i] - sp1[i];
        v1.set( crd );
        
        // ( v0 X v1 )・v2
        Vector3D.veprod( v0, v1, v3 );  // 外積
        r1 = Vector3D.scprod( v3, v2 );  // 内積

        if ( r0 * r1 > 0.0f ) {
            System.out.println( "Not intersected found at 2nd step." );
            System.exit(0);
        }
        
        // パラメータの計算
        for ( int i = 0; i < 2; ++i ) crd[i] = ep0[i] - sp0[i];
        v1.set( crd );
        
        // ( v1 X v0 )・v2 
        Vector3D.veprod( v1, v0, v3 );  // 外積
        r1 = Vector3D.scprod( v3, v2 );
        
        float t0 = r0 / r1;  // t0: パラメータ
        
        float pnt[] = new float[2];
        // 交点の算出
        for ( int i = 0; i < 2; ++i ) pnt[i] = ( 1.0f - t0 ) * sp0[i] + 
                                                          t0 * ep0[i];
        System.out.println( "Intersection point = ("+pnt[0]+", "+pnt[1]+")");
    }
          
}
