////////////////////////////////////////////////////////////////////////////////
//	点(x,y)から角度angleで引かれる線分と壁との交点、反射角を返す
//	
//	@param x 指定点のx座標
//	@param y 指定点のy座標
//	@param angle 線分を引く角度
//	@return 壁との交点、反射角[rx,ry,rangle] 
//	
////////////////////////////////////////////////////////////////////////////////
function GetReflectData(let x,let y,let angle){
	let rx = 0;
	let ry = 0;
	let rangle = 0;
	
	// 線分にするための終点を設定
	let tox = x + cos(angle) * 800;	// 適当に大きい数値で終点を作成
	let toy = y + sin(angle) * 800;	// 適当に大きい数値で終点を作成
	
	// 簡略化のため。同様の変数を宣言している場合には消してもOK
	let MinX = GetClipMinX();
	let MaxX = GetClipMaxX();
	let MinY = GetClipMinY();
	let MaxY = GetClipMaxY();
	
	// 上下左右に対して判定を行う
	let PosU = Collision_Line_Line(x,y,tox,toy,MinX,MinY,MaxX,MinY);
	let PosL = Collision_Line_Line(x,y,tox,toy,MinX,MinY,MinX,MaxY);
	let PosR = Collision_Line_Line(x,y,tox,toy,MaxX,MinY,MaxX,MaxY);
	let PosB = Collision_Line_Line(x,y,tox,toy,MinX,MaxY,MaxX,MaxY);
	
	// 結果によってどの壁で反射するかを選択 上下左右の順で判定されます
	if( PosU[0] != NULL ){
		// 上だった
		rx = PosU[0];
		ry = PosU[1];
		rangle = -angle;
	}else if( PosB[0] != NULL ){
		// 下だった
		rx = PosB[0];
		ry = PosB[1];
		rangle = -angle;
	}else if( PosL[0] != NULL ){
		// 左だった
		rx = PosL[0];
		ry = PosL[1];
		rangle = 180 - angle;
	}else if( PosR[0] != NULL ){
		// 右だった
		rx = PosR[0];
		ry = PosR[1];
		rangle = 180 - angle;
	}else{
		// どこにも反射してない場合、ダミーとして元の値をセット
		rx = x;
		ry = y;
		rangle = angle;
	}
	
	return [rx,ry,rangle];
}

////////////////////////////////////////////////////////////////////////////////
//	線分(x1,y1)-(x2,y2)と線分(x3,y3)-(x4,y4)の交点を返す
//	
//	@param x1 線分1の始点x座標
//	@param y1 線分1の始点y座標
//	@param x2 線分1の終点x座標
//	@param y2 線分1の終点y座標
//	@param x3 線分2の始点x座標
//	@param y3 線分2の始点y座標
//	@param x4 線分2の終点x座標
//	@param y4 線分2の終点y座標
//	@return 2線分の交点[x,y]　交差しなかった場合には[NULL,NULL]が返る
//	
////////////////////////////////////////////////////////////////////////////////
function Collision_Line_Line(let x1,let y1,let x2,let y2,let x3,let y3,let x4,let y4){
	let f1 = x2 - x1;
	let g1 = y2 - y1;
	let f2 = x4 - x3;
	let g2 = y4 - y3;
	
	let det = (f2 * g1) - (f1 * g2);
	
	// detの値が0(2線分が水平)の場合交点が存在しないので戻る
	if(det == 0){
		return [NULL,NULL];
	}else{
		// それ以外の場合、交点を計算
		let dx = x3 - x1;
		let dy = y3 - y1;
		let t1 = (f2 * dy - g2 * dx) / det;
		let t2 = (f1 * dy - g1 * dx) / det;
		
		// 交点が線分の中に存在するなら数値を計算
		if( (0 <= t1 && t1 <= 1) && (0 <= t2 && t2 <= 1) ){
			let rx = x1 + t1 * f1;
			let ry = y1 + t1 * g1;
			
			return [rx,ry];
		}else{
			// もし交点が線分の延長線にある場合、交点なしとする
			return [NULL,NULL];
		}
	}
}