/*********************************************************************
*	Soubor matematických funkcí
*	SOURCE FILE
*	Autor:	Michal Jirouš
*	Datum: 31.7.2008
*	Soubor:	mathematic.cpp
*	Popis:	Obsahuje ruzné matematické funkce - sinus, cosinus, které pracuj se stupni
*			funkce pro porovnávání datových typů float, převody řetězců na čísla
**********************************************************************/


#include "mathematic.h"

float mycos( float angle )
{
	return ( cos( angleToRad( angle ) ) );
}

float mysin( float angle )
{
	return ( sin( angleToRad( angle ) ) );
}

float myasin( float angle )
{
	return radToAngle( asin( getFromRange( angle, -1.0f, 1.0f) ) );
}

float myacos( float angle )
{
	return radToAngle( acos( getFromRange( angle, -1.0f, 1.0f ) ) ) ;
}

float mytan( float angle )
{
	return ( tan( angleToRad( angle ) ) );
}
float myatan( float value )
{
	return radToAngle( atan( value ) );
}


float angleToRad( float angle )
{
	return angle * M_PI / 180;
}

float radToAngle( float rad )
{
	return rad * 180.0f / M_PI;
}


/* Prevadi retezec na cele cislo */
int stringToInt( std::string sValue )
{
	return atoi(sValue.c_str());
}

/* Prevadi retezec na cislo s pohyblivou radovou carkou */
float stringToFloat( std::string sValue)
{
	return (float)(atof(sValue.c_str()));
}

/* Prevadi retezec na pole cisel s pohyblivou radovou carkou */
float *stringToFloat4( std::string sValue)
{
	float *values = new float[4];
	size_t blankChar = sValue.find_first_of(' ');
	if( blankChar == std::string::npos )
	{
		delete [] values;
		return NULL;
	}
	
	std::string first = sValue.substr(0, blankChar);
	values[0] = stringToFloat( first );
	sValue = sValue.substr( blankChar + 1 );

	blankChar = sValue.find_first_of(' ');
	if( blankChar == std::string::npos )
	{
		delete [] values;
		return NULL;
	}

	first = sValue.substr(0, blankChar);
	values[1] = stringToFloat( first );
	sValue = sValue.substr( blankChar + 1 );
	
	blankChar = sValue.find_first_of(' ');
	if( blankChar == std::string::npos )
	{
		delete [] values;
		return NULL;
	}

	first = sValue.substr(0, blankChar);
	values[2] = stringToFloat( first );
	sValue = sValue.substr( blankChar + 1 );
	
	
	values[3] = stringToFloat( sValue );

	return NULL;

}

//funkce pro porovnani float typu
int compareFloats(float a, float b,float res)
{
	if(a < (b - res) )
		return -1;
	else if( a > (b + res))
		return 1;
	return 0;
}

float roundUp( float x )
{
	float value = (float)((int)x);
	if( value < x )
		return value + 1.0f;
	return value;
}


float roundDown( float x )
{
	return (float)((int)x);
}

float round( float x )
{
	float lowerRound = roundDown(x);
	if( lowerRound + 0.5f < x )
		return lowerRound + 1.0f;
	else
		return lowerRound;
}

int getMaximumPowerOf( int iValue )
{
	int rval = 1;
	while( rval < iValue ) rval <<= 1;
	return rval;

}

float round( float x, int positions )
{
	int i = 0;
	for( ; i < positions; i++)
		x *= 10;
	x = round( x );
	for( i = 0; i < positions; i++)
		x /= 10;
	return x;
}





#include <fstream>
using namespace std;
bool getFileSum( const char * filename, int &sum, unsigned int &size )
{
	ifstream fin( filename );
	if( !fin.is_open() )
		return false;

	sum = size = 0;

	int c = 0;
	unsigned int i = 0;
	while( (c = fin.get()) != -1 )
	{
		sum += c * SUM_MULTIPLICATOR * i++;
	}

	size = i;

	return true;
}




