/*	
 *	clipmath.h
 *
 *	ユーティリティ：数学関数
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Thu Dec 31 09:54:58 JST 2015 Naoyuki Sawa
 *	- 作成開始。
 *	- math.hには含まれない非標準の、数学関数をまとめるためのモジュールです。
 *	  今後、非標準の数学関数を追加する場合は、当モジュールに追加して下さい。
 *	* Sat Mar 19 21:19:21 JST 2016 Naoyuki Sawa
 *	- determinant(),cofactor(),solve()を追加しました。
 */
#ifndef __CLIP_MATH_H__
#define __CLIP_MATH_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	線形補間
 *****************************************************************************/
//Performs a Linear intERPolation.
//[in]
//	x		The first-floating point value.							┬xとyの大小は不問です。(x<y)でも(x=y)でも(x>y)でも構いません。
//	y		The second-floating point value.						┘
//	s		A value that Linearly intERPolates between the x parameter and the y parameter.	─原則的には(0<=s<=1)ですが、(s<0)や(s>1)でも正しく動作します。
//[out]
//	return value	The result of the Linear intERPolation.
//[note]
//	- 単純な線形補間関数です。
//	  標準C関数ではありませんが、多くのゲーム用ライブラリに備わっているので、実装しておく事にしました。
//	- 一般的には'x+(s*(y-x))'で計算しますが、当実装は'x-(s*(x-y))'で計算しました。
//	  'x+(s*(y-x))'より'x-(s*(x-y))'の方が、Asm化した時にレジスタの移動回数が減って効率が良いからです。
double lerp(double x, double y, double s);
/*****************************************************************************
 *	連立方程式
 *****************************************************************************/
//m[n行][n列]の行列式(determinant)を求めます。
//[note]
//	- 既存のmatnf_determinant()を、単制度⇒倍制度に変更した関数です。
//	  使い方やアルゴリズムは、matnf_determinant()と同じです。
//	  詳細は、clipflt1.cのmatnf_determinant()の実装を参照して下さい。
//	- 関数名を短くしても衝突しなさそうだったので、思い切って短くしました。
//	  もし今後関数名が衝突した場合は、変更して下さい。
double determinant(const double* m/*[n][n]*/, int n);
//m[n行][n列]からi行j列を除いた、余因子(cofactor)を求めます。
//[note]
//	- 既存のmatnf_cofactor()を、単制度⇒倍制度に変更した関数です。
//	  使い方やアルゴリズムは、matnf_cofactor()と同じです。
//	  詳細は、clipflt1.cのmatnf_cofactor()の実装を参照して下さい。
//	- 関数名を短くしても衝突しなさそうだったので、思い切って短くしました。
//	  もし今後関数名が衝突した場合は、変更して下さい。
double cofactor(const double* m/*[n][n]*/, int n, int i, int j);
//n次連立方程式の解を求めます。
//[note]
//	- 既存のsolve_simultaneous_equations()を、単制度⇒倍制度に変更した関数です。
//	  使い方やアルゴリズムは、solve_simultaneous_equations()と同じです。
//	  詳細は、clipflt1.cのsolve_simultaneous_equations()の実装を参照して下さい。
//	- ただし、solve_simultaneous_equations()と較べて、一つだけ変更した点が有ります。
//	  solve_simultaneous_equations()は戻り値無しでしたが、当関数は処理の途中で求めた行列式の値を返すようにしました。
//	  連立方程式の解が有効かを行列式の値を見て判断するために、別途determinant()を呼び出すよりも効率が良いからです。
//	  solve_simultaneous_equations()では、有効な解が無い連立方程式は指定されない前提で戻り値無しにしていましたが、
//	  実際には、有効な解が無い連立方程式も指定される可能性が有ると考えて上記の戻り値の仕様変更を行う事にしました。
//	  あくまでも処理の途中で求めた行列式の値を返すようにしただけの変更であり、処理内容自体は一切変更していません。
//	  また、当関数が返した値を参照するかどうかも、呼び出し側次第です。
//	  有効な解が無い連立方程式を指定しない前提ならば、戻り値を無視しても構いません。
//	- 関数名を短くしても衝突しなさそうだったので、思い切って短くしました。
//	  もし今後関数名が衝突した場合は、変更して下さい。
//	  ちなみにMATLABにも、連立方程式を解く関数としてsolve()という名前の関数があるそうです。
//	  用途は似ていますが、引数仕様等は互換ではありません。たまたま名前が一致しただけです。
double solve(const double* A/*[n][n]*/, const double* b/*[n]*/, double* x/*[n]*/, int n);
/*****************************************************************************
 *	
 *****************************************************************************/
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_MATH_H__
