/***************************************************************/
//
//
//		DirectX	[ game_equation.h ]
//
//										Author	kazuki tanaka
//										Date	2016 06/19
/*---------------------------------------------------------------
■Update : 2016/06/19
			config.hの作成

■Update : 2016/07/10
			hファイルの中身を一新
			game_equation.h に名称の変更

■Update : 2016/07/10
			矩形と矩形の判定の追加
			円と円の判定の追加

■Update : 2016/07/20
			球と球の当たり判定の追加
			( 3D用 )

■Update : 2016/08/11
			オブジェクトの画面外を
			判定する処理を追加
			( 2D用 );

/*---------------------------------------------------------------
	インクルードファイル
---------------------------------------------------------------*/
#ifndef _GAME_EQUATION_H_

#define _GAME_EQUATION_H_

#include "main.h"
#include <stdlib.h>

/*---------------------------------------------------------------
	マクロ定義
---------------------------------------------------------------*/

#define ONEHUNDRED_EIGTEEN ( 0.0055555555f )		// 1/180の計算値

#define RADIAN(arc) (((arc) * D3DX_PI ) / 180)		// ラジアンの計算に必要

#define LIMIT_MAX(a,b) ( a>b ? b : a )				// 最大値の設定( 低い値を返す )
#define LIMIT_MIM(a,b) ( a>b ? a : b )				// 最小値の設定( 高い値を返す )

/*---------------------------------------------------------------
	サブルーチン( インライン関数 )
---------------------------------------------------------------*/

// 矩形と矩形のあたり判定
inline bool __CollisionObjectSquare( const LPD3DXVECTOR2 objectA_s ,const LPD3DXVECTOR2 objectA_e, const LPD3DXVECTOR2 objectB_s, const LPD3DXVECTOR2 objectB_e )
{

	// 判定
	if( ( objectA_s->x < objectB_e->x ) && ( objectA_e->x < objectB_s->x ) && ( objectA_s->y < objectB_e->y ) && ( objectA_e->y < objectB_s->y ) ){
		
		// contact 
		return true;

	}

	// not contact
	return false;

	
	/*
	//←
	for( int inc=vec.prevX ; inc < vec.sx ;inc++ ){
		if( objVec.sx < vec.prevX && vec.prevX < objVec.ex ){
			vec.sx = objVec.sx+1;
			vec.ex = objVec.ex+1;
			break;
		}
	}

	//→
	for( int inc=vec.prevX ; inc < vec.ex ;inc++ ){
		if( objVec.sx < vec.prevX && vec.prevX < objVec.ex ){
			vec.sx = objVec.sx-1;
			vec.ex = objVec.ex-1;
			break;
		}
	}

	//↓
	for( int inc=vec.prevY ; inc < vec.sy ;inc++ ){
		if( objVec.sy < vec.prevX && vec.prevY < objVec.ey ){
			vec.sy = objVec.sy-1;
			vec.ey = objVec.ey-1;
			break;
		}
	}

	//↑
	for( int inc=vec.prevY ; inc < vec.ey ;inc++ ){
		if( objVec.sy < vec.prevX && vec.prevY < objVec.ey ){
			vec.sy = objVec.sy-1;
			vec.ey = objVec.ey-1;
			break;
		}
	}
	*/
	

}

// CollisionDetection

// 円と円のあたり判定
inline bool __CollisionObjectCircle( const LPD3DXVECTOR2 object_centerA, const LPD3DXVECTOR2 object_centerB,const LPD3DXVECTOR2 object_radiusA, const LPD3DXVECTOR2 object_radiusB )
{


	D3DXVECTOR2 difference;					//XYの差
	float       distance;					//距離



	// オブジェクトA,BのX,Yの差の計算
	difference.x = ( object_centerA->x - object_centerB->x ) * ( object_centerA->x - object_centerB->x );	//x2
	difference.y = ( object_centerA->y - object_centerB->y ) * ( object_centerA->y - object_centerB->y );	//y2


	// オブジェクトAとオブジェクトBの距離測定
	distance = ( ( difference.x ) + ( difference.y ) );			// rの２乗 : r2 = x2 + y2 ;

	// 判定
	if( distance < ( object_radiusA->x + object_radiusB->x ) * ( object_radiusA->x + object_radiusB->x ) ){
	
		return true;	//接している
	
	}

	return false;	//接していない

}

// 球と球のあたり判定
inline bool __CollisionObjectSphere( const LPD3DXVECTOR3 object_centerA, const LPD3DXVECTOR3 object_centerB,const float radiusA, const float radiusB )
{

	D3DXVECTOR3 difference;					//XYの差
	float       distance;					//距離


	// オブジェクトA,BのX,Yの差の計算
	difference.x = ( object_centerA->x - object_centerB->x ) * ( object_centerA->x - object_centerB->x );	//x2
	difference.y = ( object_centerA->y - object_centerB->y ) * ( object_centerA->y - object_centerB->y );	//y2
	difference.y = ( object_centerA->z - object_centerB->z ) * ( object_centerA->z - object_centerB->z );	//z2

	// オブジェクトAとオブジェクトBの距離測定
	distance = ( ( difference.x ) + ( difference.y ) + ( difference.z ) );			// rの２乗 : r2 = x2 + y2 + z2 ;

	// 判定
	if( distance < ( radiusA + radiusB ) * ( radiusA + radiusB ) ){
	
		return true;	//接している
	
	}
	return false;	//接していない

}

// 画面外を判定( 2Dゲーム用 )
inline bool __ObjectScreenOut(  const LPD3DXVECTOR2 object_center, const LPD3DXVECTOR2 radius )
{

	// 画面外計算
	if( !( object_center->y + radius->y > 0 &&
		object_center->x + radius->x > 0 &&
		object_center->y - radius->y < SCREEN_HEIGHT &&
		object_center->x - radius->x < SCREEN_WIDTH ) ){

		// 画面外
		return true;

	}


	// 画面内
	return false;

}

// 画面外を判定( 2Dゲーム用 ) -> よりシンプルに改良( プレイヤーとかはこっちかな... )
inline bool __ObjectScreenOutSimple( const LPD3DXVECTOR2 object_center )
{

	// 画面外計算
	if( !( object_center->y > 0 &&
		object_center->x > 0 &&
		object_center->y < SCREEN_HEIGHT &&
		object_center->x < SCREEN_WIDTH ) ){

		// 画面外
		return true;

	}


	// 画面内
	return false;

}

// 点と円のあたり判定( 2D用 )
inline bool __ObjectTouchSphere( const LPD3DXVECTOR2 objectCenter, const float objectRadius, const LPD3DXVECTOR2 pos )
{

	float       distance;					//距離

	distance = ( objectCenter->x - pos->x ) * ( objectCenter->x - pos->x ) + ( objectCenter->y - pos->y ) * ( objectCenter->y - pos->y );


	// あたり判定
	if( distance < objectRadius * objectRadius ){
	
		// 当たっている
		return true;
	
	}

	// 当たっていない
	return false;

}

// 点と矩形のあたり判定( 2D用 )
inline bool __ObjectTouchSquare( const LPD3DXVECTOR2 object_start, const LPD3DXVECTOR2 object_end, const LPD3DXVECTOR2 point )
{

	// 当たり判定
	if( object_start->x < point->x && object_start->y < point->y 
		&& object_end->x > point->x && object_end->y > point ->y ){
	
		// 当たっている
		return true;
	
	}

	// 当たっていない
	return false;


}


#endif	//_GAME_EQUATION_H_



