/**
 * int main()
 * 
 * Descricao:
 * 	Funcao principal do programa que contem um loop (do-while) contendo a chamada
 * 	das funcoes que calculam as variaveis utilizadas pelo algoritmo Gauss-Legendre
 * 	a cada iteracao. 
 * 
 * Parametros de entrada:
 * 	-
 * 
 * Parametros de retorno:
 *	-
 *	
 */
int main(){
  
  /* Variaveis utilizadas para calcular o tempo de execucao do programa */
  time_t begin, end;
  double time_spent;
  time(&begin);

  /* Inicialicazao das variaveis globais utilizadas no algoritmo */
  initAttributes();  
  
  /* Loop principal que calcula o valor do "pi" */
  do{    
    //printf("Iteracao: %ld\n", n_count);    
    
    calculate_a();
    calculate_b();
    calculate_t();
    calculate_p();
    calculate_pi();    
    filePrint();
    
    n_count++;  
  } while(mpf_cmp(pi[n_count-2], pi[n_count-1])!=0); /* Condicao de parada: o "pi" recem calculado deve 
							 ser igual ao seu antecessor, garantindo assim a sua 
							 convergencia com 10 milhoes de casas decimais */

  
  time(&end);
  time_spent = difftime(end, begin);	

  printf("Tempo de execucao: %lf segundos\nIteracoes: %ld\n", time_spent, n_count);
  
  return 0;
}
bool detect_collision_point(const int aircraft[], const int obstacle[], const int aircraft_vel[], const int obtacle_vel[], int collision_point[], bool *ray){
  bool valid_t;
  int  collision_2d[3];
  t = calculate_t(aircraft,obstacle,aircraft_vel,obstacle_vel,&valid_t);
  if ( valid_t == false ){
    if ( ray_tracing(aircraft,obstacle,aircraft[3]+obstacle[3],collision_2d) ){
      *ray = true;
      return true;
    }
    else {
      return false;
    }
  }
  else {
    collision_point[0] = aircraft[0] + aircraft_vel[0]*t;
    collision_point[1] = aircraft[1] + aircraft_vel[1]*t;
    collision_point[2] = aircraft[2] + aircraft_vel[2]*t;
    *ray = false;
    return true;
  }
}