/* conique.c
Tracer une conique avec l'equation en coordonnées polaires
	+ comment tracer une courbe avec gnuplot directement depuis le programme en C

   auteurs :
   groupe : 
   date :
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void usage(char *argv0);
void tracer_courbe_avec_gnuplot(char *nom_fichier_donnees,char *nom_fichier_commande,double exc, double p, double theta0);
void generer_donnees_courbe(char *nom_fichier_donnees,double exc, double p, double theta0);

/* ajouter déclaration/ definition de polaire_vers_cartesien() */



int main(int argc,char* argv[]) 
  {
  double exc,p=1.0,theta0=0.0;
  char nom_fichier_donnees[]="points_conique.txt";
  char nom_fichier_commande[]="tracer_conique.gplot";


  if (argc<2 || argc>4)
	{
	usage(argv[0]);
	return 1;
	}

  exc=atof(argv[1]);

  if (argc>=3)
	{
	p=atof(argv[2]);
  	}
  if (argc>=4)
	{
	theta0=atof(argv[3])*M_PI/180;
  	}
  
  generer_donnees_courbe(nom_fichier_donnees,exc,p,theta0);
  tracer_courbe_avec_gnuplot(nom_fichier_donnees, nom_fichier_commande,exc,p,theta0);

  return 0;
  }

void usage(char *argv0)
  {
  printf("usage :    %s <excentricite> [<parametre> [<theta0>]] \n",	argv0);
  }



void generer_donnees_courbe(char *nom_fichier_donnees,double exc, double p, double theta0)
{

  FILE *fichier_donnees;
  double rho,theta;
  double x,y;

  fichier_donnees=fopen(nom_fichier_donnees,"w");
  if (fichier_donnees==NULL)
	{
	printf("impossible d'ouvrir %s\n",nom_fichier_donnees);
	exit(2);
	}
  
  for (theta=0;theta<= 2*M_PI; theta += 0.01)
	{
	rho=p/(1+exc*cos(theta-theta0)); /* equation polaire d'une conique */	

	polaire_vers_cartesien(rho,theta, x,y );/* A MODIFIER */

	if (fabs(rho)<= 10*fabs(p)) /* pour limiter le tracé à la zone centrale */
	        fprintf(fichier_donnees,"%lg %lg\n",x,y);
	else
		fprintf(fichier_donnees,"\n"); /* ligne vide pour interrompre la courbe */
	}

  fclose(fichier_donnees);

}




void tracer_courbe_avec_gnuplot(char *nom_fichier_donnees,char *nom_fichier_commande,double exc, double p, double theta0)
  {
  FILE *fichier_commande;
  char commande_system[100];
  char *type_conique[]={"Cercle","Ellipse","Parabole","Hyperbole"}; /* tableau de (pointeurs vers des) chaines de caractères */
  int n_type_conique;
  double r_foyer2,xf2,yf2;

  fichier_commande=fopen(nom_fichier_commande,"w");
  if (fichier_commande==NULL)
	{
	printf("impossible d'ouvrir %s\n",nom_fichier_commande);
	exit(3);
	}


/* commandes pour la "décoration" */
  fprintf(fichier_commande,"set xlabel 'x'\nset ylabel 'y'\n");


  if (exc==0)
	n_type_conique=0;
  else   if (fabs(exc)<1.0)
	n_type_conique=1;
  else  if (fabs(exc)==1.0)
	n_type_conique=2;
  else  
	n_type_conique=3;
  fprintf(fichier_commande,"set title '%s exc=%lg  p=%lg \\theta_0=%lg°'\n",type_conique[n_type_conique], exc,p,theta0*180/M_PI);


  fprintf(fichier_commande,"unset key\n");
  fprintf(fichier_commande,"set xzeroaxis\nset yzeroaxis\n");
  fprintf(fichier_commande,"set label 'o' at 0,0 center\n");

  if (fabs(exc)!=1.0)
	{
	 /* calcul du second foyer */
	r_foyer2= - 2*exc*p/(1-exc*exc);
	polaire_vers_cartesien(r_foyer2,theta0, xf2, yf2 );/* A MODIFIER */ 
  	fprintf(fichier_commande,"set label 'x' at %lg,%lg center\n",xf2,yf2);
	}

 

/* commandes essentielles */
  fprintf(fichier_commande,"set size ratio -1\n");  /* système orthonormé */
  fprintf(fichier_commande,"plot '%s' with lines\n",nom_fichier_donnees);

  fclose(fichier_commande);

      /* sprintf est comme fprintf mais écrit dans une chaine de caractere */
  sprintf(commande_system,"gnuplot --persist -c %s",nom_fichier_commande);

  /* fonction pour lancer la commande comme depuis un terminal */
  system(commande_system);

  }


