#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <math.h>

/* functions */
double InnerProduct(double *, double *);
double LenSegOnSeparateAxis( double *, double *, double *, double *);


/* main */
int main(void) {
    double rb;
    double NAe1 = 5.0;
    double Be1 = 10.0;
    double Be2 = 10.0;
    double Be3 = 10.0;


///  	rb = LenSegOnSeparateAxis(NAe1,Be1,Be2,Be3);
    printf("投影線分長: %.2lf\n", rb);
    return EXIT_SUCCESS;
}



/**
 * ベクトルの内積を計算する
 * @param[in] vec1 ベクトル1
 * @param[in] vec2 ベクトル2
 * @param[in] n ベクトルの次元数
 * @return vec1 と vec2 の内積
 */
double InnerProduct(double vec1, double vec2)
{
    double s = 0.0;
    s += vec1 * vec2;
    return s;
}


// 分離軸に投影された軸成分から投影線分長を算出
double LenSegOnSeparateAxis( double *Sep, double *e1, double *e2, double *e3)
{
   // 3つの内積の絶対値の和で投影線分長を計算
   // 分離軸Sepは標準化されていること
   e3 =0;
   
   double r1 = fabs(InnerProduct( Sep, e1 ));
   printf("内積r1: %.2f\n", r1);

   double r2 = fabs(InnerProduct( Sep, e2 ));
   printf("内積r2: %.2f\n", r2);

   double r3 = e3 ? (fabs(InnerProduct( Sep, e3 ))) : 0;
   printf("内積r3: %.2f\n", r3);

   return r1 + r2 + r3;
}














/*
int CollisionJudge(P1[],P2[]);





main()
{
// OBB v.s. OBB
bool ColOBBs( OBB &obb1, OBB &obb2 )
{
   // 各方向ベクトルの確保
   // （N***:標準化方向ベクトル）
   D3DXVECTOR3 NAe1 = obb1.GetDirect(0), Ae1 = NAe1 * obb1.GetLen_W(0);
   D3DXVECTOR3 NAe2 = obb1.GetDirect(1), Ae2 = NAe2 * obb1.GetLen_W(1);
   D3DXVECTOR3 NAe3 = obb1.GetDirect(2), Ae3 = NAe3 * obb1.GetLen_W(2);
   D3DXVECTOR3 NBe1 = obb2.GetDirect(0), Be1 = NBe1 * obb2.GetLen_W(0);
   D3DXVECTOR3 NBe2 = obb2.GetDirect(1), Be2 = NBe2 * obb2.GetLen_W(1);
   D3DXVECTOR3 NBe3 = obb2.GetDirect(2), Be3 = NBe3 * obb2.GetLen_W(2);
   D3DXVECTOR3 Interval = obb1.GetPos_W() - obb2.GetPos_W();

   // 分離軸 : Ae1
   FLOAT rA = D3DXVec3Length( &Ae1 );
   FLOAT rB = LenSegOnSeparateAxis( &NAe1, &Be1, &Be2, &Be3 );
   FLOAT L = fabs(D3DXVec3Dot( &Interval, &NAe1 ));
   if( L > rA + rB )
      return false; // 衝突していない

   // 分離軸 : Ae2
   rA = D3DXVec3Length( &Ae2 );
   rB = LenSegOnSeparateAxis( &NAe2, &Be1, &Be2, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &NAe2 ));
   if( L > rA + rB )
   return false;

   // 分離軸 : Ae3
   rA = D3DXVec3Length( &Ae3 );
   rB = LenSegOnSeparateAxis( &NAe3, &Be1, &Be2, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &NAe3 ));
   if( L > rA + rB )
      return false;

   // 分離軸 : Be1
   rA = LenSegOnSeparateAxis( &NBe1, &Ae1, &Ae2, &Ae3 );
   rB = D3DXVec3Length( &Be1 );
   L = fabs(D3DXVec3Dot( &Interval, &NBe1 ));
   if( L > rA + rB )
      return false;

   // 分離軸 : Be2
   rA = LenSegOnSeparateAxis( &NBe2, &Ae1, &Ae2, &Ae3 );
   rB = D3DXVec3Length( &Be2 );
   L = fabs(D3DXVec3Dot( &Interval, &NBe2 ));
   if( L > rA + rB )
      return false;

   // 分離軸 : Be3
   rA = LenSegOnSeparateAxis( &NBe3, &Ae1, &Ae2, &Ae3 );
   rB = D3DXVec3Length( &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &NBe3 ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C11
   D3DXVECTOR3 Cross;
   D3DXVec3Cross( &Cross, &NAe1, &NBe1 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae2, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be2, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C12
   D3DXVec3Cross( &Cross, &NAe1, &NBe2 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae2, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
      if( L > rA + rB )
   return false;

   // 分離軸 : C13
   D3DXVec3Cross( &Cross, &NAe1, &NBe3 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae2, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be2 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C21
   D3DXVec3Cross( &Cross, &NAe2, &NBe1 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be2, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C22
   D3DXVec3Cross( &Cross, &NAe2, &NBe2 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C23
   D3DXVec3Cross( &Cross, &NAe2, &NBe3 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae3 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be2 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C31
   D3DXVec3Cross( &Cross, &NAe3, &NBe1 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae2 );
   rB = LenSegOnSeparateAxis( &Cross, &Be2, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C32
   D3DXVec3Cross( &Cross, &NAe3, &NBe2 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae2 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be3 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離軸 : C33
   D3DXVec3Cross( &Cross, &NAe3, &NBe3 );
   rA = LenSegOnSeparateAxis( &Cross, &Ae1, &Ae2 );
   rB = LenSegOnSeparateAxis( &Cross, &Be1, &Be2 );
   L = fabs(D3DXVec3Dot( &Interval, &Cross ));
   if( L > rA + rB )
      return false;

   // 分離平面が存在しないので「衝突している」
   return true;
}


// 分離軸に投影された軸成分から投影線分長を算出
FLOAT LenSegOnSeparateAxis( D3DXVECTOR3 *Sep, D3DXVECTOR3 *e1, D3DXVECTOR3 *e2, D3DXVECTOR3 *e3 = 0 )
{
   // 3つの内積の絶対値の和で投影線分長を計算
   // 分離軸Sepは標準化されていること
   FLOAT r1 = fabs(D3DXVec3Dot( Sep, e1 ));
   FLOAT r2 = fabs(D3DXVec3Dot( Sep, e2 ));
   FLOAT r3 = e3 ? (fabs(D3DXVec3Dot( Sep, e3 ))) : 0;
   return r1 + r2 + r3;
}
}

























main ()
{
	double inner_product;
	double vec1[] = {1.0, 2.0, 3.0};
	double vec2[] = {2.0, 1.0, 3.0};

    inner_product = InnerProduct(vec1, vec2, 3);
    printf;

}



int CollisionJudge(P1[],P2[])
{
	//中間座標を計算
	double xMax;
	double xMin;
	double yMax;
	double yMin;
	double zMax;
	double zMin;
	
	int ctA = count
	int ctB = 
	


	衝突判定
		if(Judge == true)
		{
			//衝突した
			return ture;
		}
		else
		{
			//衝突してない
			return false;
		}
}

*/