#include "Matrice.cpp"

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef Matrice<double> Mat;
typedef Vecteur<double> Vect;

Mat L(2,2);

int max(int y, int x)
{
	return (x>y?x:y);
};

void main()
{
	// Initialisations

	// Définition des paramètres:
	// a=0.15, classiquement;
	// m=0.15, par défaut;
	// omega=0.81, classiquement, est la pulsation.
	int precision;
	double a,m,omega,delta_t,temps;
	float a_,m_,omega_,delta_t_,temps_;
	char* nom_fichier=new char[255];
	double pt0[2]={0.1,0};
	float pt1=0, pt2=0;
	Vect temp(2), k1(2), pt(2,pt0);
	double coefficients0[4]={1/4.,1/3.,1/2.,1.};
	Vect coefficients(4,coefficients0);

    printf("    Programme issu du site http://www.multimania/vmallet.\n\n");
	printf("Ce programme permet de generer des points de l'attracteur de Moon.\n\n");
	printf("Entrez 0 pour prendre les valeurs par defaut.\n\n");
	printf("Masse (.15 par defaut): ");
	scanf("%f",&m_);
	printf("Coefficient a (.15 par defaut): ");
	scanf("%f",&a_);
	printf("Pulsation (.81 par defaut): ");
	scanf("%f",&omega_);
	printf("Condition initiale sous la forme X X'\n    (0 0 est remplace par 0.1 0): ");
	scanf("%f %f",&pt1, &pt2);
	printf("Pas de temps (0.005 par defaut): ");
	scanf("%f",&delta_t_);
	printf("Duree de l'integration (100 par defaut): ");
	scanf("%f",&temps_);
	printf("\nPrecision des donnees (5 par defaut): ");
	scanf("%d",&precision);
	printf("Nom du fichier cible: ");
	scanf("%s",nom_fichier);

	a=a_;
	omega=omega_;
	m=m_;
	delta_t=delta_t_;
	temps=temps_;

	if (a==0) a=0.15;
	if (m==0) m=0.15;
	if (omega==0) omega=0.81;
	if (delta_t==0) delta_t=0.005;
	if (temps==0) temps=100;
	if (precision==0) precision=5;
	if ((pt1!=0) || (pt2!=0))
	{
		pt(1)=pt1;
		pt(2)=pt2;
	};

	int nb=(int)(temps/delta_t);

	printf("\nGeneration des points...\n");

	L(2,1)=1.;
	L(2,2)=0.;


	k1=pt;
	
	// Génération des points

	FILE *f;
	f=fopen(nom_fichier,"wb");
	char* res=new char[precision+5];
	
	for (int i=0; i<nb; i++)
	{

		if (pt(2)!=0)
		{
			L(1,1)=-m;
			L(1,2)=1./2.*(1.-pt(2)*pt(2))+a*cos(omega*i*delta_t)/pt(2);
		}
		else
		{
			L(1,1)=-m+a*cos(omega*i*delta_t)/pt(1);
			L(1,2)=0.;
		};


		// Runge-Kutta

		for(int j=1; j<5; j++)
		{
			k1=pt+coefficients(j)*delta_t*L*k1;
		};

		pt=k1;

		_gcvt(pt(1),precision,res);
		fwrite(res,1,strlen(res),f);
		fwrite(" ",1,1,f);

		_gcvt(pt(2),precision,res);
		fwrite(res,1,strlen(res),f);

		fwrite("\n",1,1,f);

		if (i==nb/2) printf("    Moitie des points generee...\n");
	};
}

