#include <cmath>

#include "globale.h"
#include "Temps.h"

/*
#define NORMAL
#define AVECCONTRAINTES  //optionnel
*/


#define SIN  // soit alterne, soit 0, 1 ou 2 des autres
//#define ALTERNE
#define STOP
#define DIFFRACTION


/*
#define TEMPERATURE // Doit modifier le fichier action.cpp
*/


/////////NORMAL (AVECCONTRAINTES)////////////
#ifdef NORMAL

const float ALPHA2 =		1.0f;
const float DT =			0.003f;
const int CALCULPARFRAME =	30;
const float HAUTEURAMP =	10.0f;

void InitHauteur(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
		{
			Hauteurs[i][j] = 0.5f - fabs((float) i / (float) DIV_X - 0.5f);//HO;
		}
}

void InitVitesse(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
		{
			Vitesses[i][j] = 0;
		}
}

void Contraintes(void)
{
#ifdef AVECCONTRAINTES
	for (int j = 0; j < DIV_Y; j++)
	{
		Vitesses[0][j] = 0;
		Vitesses[DIV_X-1][j] = 0;
		Hauteurs[0][j] = 0;
		Hauteurs[DIV_X-1][j] = 0;
	}
#endif
}
#endif /////////NORMAL (AVECCONTRAINTES)////////////






/////////SIN (ALTERNE) (STOP) (DIFFRACTION)////////////
#ifdef SIN
void InitHauteur(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
			Hauteurs[i][j] = 0.0f;
}

void InitVitesse(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
		{
			Vitesses[i][j] = 0;
		}
}


#ifdef ALTERNE

// Paramètres
const float ALPHA2 =		1.0f;
const float DT =			0.003f;
const int CALCULPARFRAME =	30;
const float HAUTEURAMP =	1.0f;

void Contraintes(void)
{
	static long Temps0 = GetTemps();

	float Hauteur = sin((GetTemps() - Temps0) / 100.0f);

	for (int j = 0; j < DIV_Y; j++)
	{
		Hauteurs[0][j] = Hauteur*(j - (DIV_Y >> 1)) / DIV_Y;
		Vitesses[0][j] = 0;
	}
	Hauteurs[DIV_X-1][0] = 0;
	Hauteurs[DIV_X-1][DIV_Y-1] = 0;


}

#else


// Paramètres
const float ALPHA2 =		0.3f;
const float DT =			0.003f;
const int CALCULPARFRAME =	30;
const float HAUTEURAMP =	1.0f;

void Contraintes(void)
{
	static long Temps0 = GetTemps();
	int j;

#ifndef DIFFRACTION
#ifdef STOP
	float Argument = (GetTemps() - Temps0) / 1000.0f;
#else
	float Argument = (GetTemps() - Temps0) / 500.0f;
#endif
#else
	float Argument = (GetTemps() - Temps0) / 100.0f;
#endif


	float Hauteur;

#ifdef STOP
	if (Argument < atan(1) * 4)
#endif
		Hauteur = sin(Argument);
#ifdef STOP
	else
		Hauteur = 0;
#endif


	for (j = 0; j < DIV_Y; j++)
	{
		Hauteurs[0][j] = Hauteur;
		Vitesses[0][j] = 0;
	}

#ifdef DIFFRACTION
	for (j = 0; j < DIV_Y * 0.45; j++)
	{
		Hauteurs[DIV_X >> 1][j] = 0;
		Hauteurs[DIV_X >> 1][DIV_Y - 1 - j] = 0;
	}
#endif
}
#endif //#else du ALTERNE
#endif /////////SIN (ALTERNE) (STOP) (DIFFRACTION)////////////



////////////TEMPERATURE/////////////////
#ifdef TEMPERATURE

// Paramètres
const float ALPHA2 =		0.3f;
const float DT =			0.003f;
const int CALCULPARFRAME =	30;
const float HAUTEURAMP =	1.0f;

void InitHauteur(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
			Hauteurs[i][j] = 0.0f;
}

void InitVitesse(void)
{
	for (int i = 0; i < DIV_X; i++)
		for (int j = 0; j < DIV_Y; j++)
		{
			Vitesses[i][j] = 0;
		}
}

void Contraintes(void)
{
	Hauteurs[DIV_X>>1][DIV_Y>>1] = 10.0f;
}

#endif



#ifdef TEST

// Paramètres
const float ALPHA2 =		0.3f;
const float DT =			0.003f;
const int CALCULPARFRAME =	30;
const float HAUTEURAMP =	1.0f;

#endif