Advertisement
AntonioVillanueva

Aterrizaje en Marte

Mar 29th, 2020
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <math.h>       /* asin */
  6.  
  7. using namespace std;
  8.  
  9. struct punto {int X;int Y;}; //un punto marciano
  10. struct limites{int max ; int min ; int altura_aterrizaje;}; //Maximos minimos y altura de aproximacion para aterrizar
  11.  
  12. //pi
  13. # define PI 3.14159265358979323846  
  14.  
  15. //Gravedad MARCIANA
  16. #define GRAVEDAD 3.711
  17.  
  18. //Angulo bueno entrada en Marte , convertido en grados con 180/PI
  19. #define angulOK (acos(GRAVEDAD/4)*(180/PI))
  20.  
  21. //Velocidad horizontal maxima 20 , velocidad vertical maxima 40
  22. #define H_VMAX 20
  23. #define V_VMAX 40
  24.  
  25. int const APROXIMACION_H (200);//Altura de comienzo de aterrizaje
  26. int const TOLERANCIA (5);//Tolerancia velocidades H y V
  27.  
  28. //*******************************************************************************************
  29. double velocidad (int velHorizontal,int velVertical){//Pitagoras con los dos componentes de la velocidad V y H recupera velocidad
  30.     return sqrt( (velHorizontal*velHorizontal)+(velVertical*velVertical) );
  31. }
  32. //*******************************************************************************************
  33. limites objetivo(vector <punto> &marte){//Analiza la zona plana de aterrizaje 1000 metros, retorna max y min 4000 5500 150
  34.     limites zona({-1,-1,-1});//Zona de aterrizaje max,min,altura_aterrizaje
  35.     punto memoria ({-2,-2});//Memoria punto
  36.    
  37.     for (auto p:marte){//Recorre los puntos marcianos
  38.            
  39.         if (memoria.Y == p.Y && zona.max<0){//Esta en una zona plana , no tiene el X comienzo de la zona de aterrriaje
  40.             //Es una zona plana y el inicio no esta asignado
  41.             zona.max=memoria.X;//Si ahora estamos en un punto Y igual al anterior es plano comienza antes la X
  42.             zona.altura_aterrizaje=p.Y;//Recupero la altura de la plataforma de aterrizaje el area de 1000 m.
  43.            
  44.         }else if ( zona.max>0 && zona.min<0){//El MAXimo de la zona de aterrizaje se ha inicializado el MINinmo No y es zona plana
  45.             zona.min=memoria.X;
  46.         }                          
  47.         //Memoriza el punto actual de Marte
  48.         memoria.X=p.X;
  49.         memoria.Y=p.Y;         
  50.     }
  51.    
  52.     return zona;//Retorna los limites de la zona de aterrizaje
  53. }
  54. //*******************************************************************************************
  55. string control(vector <punto> &marte,int X,int Y,int hSpeed,int vSpeed){
  56.    
  57.     int angulo(0),potencia(4);//Angulo y potencia de la nave empieza al MAXIMO potencia 4
  58.    
  59.     //Recupera la zona de aterrizaje  ver  limites{int max ; int min ; int altura_aterrizaje;}
  60.     limites aterrizaje(objetivo(marte));
  61.    
  62.     //Estamos encima de la zona de aterrizaje ? aterrizaje.max <---->aterrizaje.min
  63.  
  64.     if (X>=aterrizaje.max && X<=aterrizaje.min){//Estamos encima de la zona plana de aterrizaje
  65.        
  66.        
  67.         if ((aterrizaje.altura_aterrizaje+APROXIMACION_H) > Y ) {//..y a la buena altura para aterrizar  
  68.            
  69.             potencia=3;
  70.            
  71.         }else if ( abs(hSpeed)<= (H_VMAX -TOLERANCIA)  && abs(vSpeed )<= (V_VMAX -TOLERANCIA) ) { //Velocidad OK
  72.            
  73.             potencia=2;
  74.            
  75.         }else{
  76.            
  77.             angulo=  round (asin (hSpeed/ (velocidad(hSpeed,vSpeed))  )* (180/PI)); //Redondear ....
  78.         }
  79.        
  80.        
  81.        
  82.     } else { //No esta encima de la zona plana  de aterrizaje comprendida entre  (aterrizaje.max <---->aterrizaje.min)
  83.        
  84.         //Nave fuera de la zona de aterrizaje y con hSpeed diferente de 0 o la velocidad horizontal a MATCH 4 ;)
  85.        
  86.         //if ( ((X < aterrizaje.max || X >aterrizaje.min) && (hSpeed !=0)) || abs(hSpeed) > (4 * H_VMAX) ) {
  87.         if ( (X<aterrizaje.max && hSpeed<0 )|| (X>aterrizaje.min && hSpeed>0) || abs(hSpeed)>4*H_VMAX ) {      
  88.            
  89.             //hSpeed  rapida ... o en direccion incorrecta  hay que corregir angulo
  90.             angulo = round (asin( hSpeed/velocidad (hSpeed,vSpeed)) * (180/PI)); //Angulo en grados corregido ..
  91.            
  92.         }else if (abs(hSpeed)<2*H_VMAX) { //hSpeed velocidad Horizontal baja
  93.            
  94.             //Muy despacio en hSpeed
  95.             if (X < aterrizaje.max){//Esta a la izquierda de la zona de aterrizaje <-------
  96.                
  97.                 angulo=-angulOK;//Un angulo de 21.913245 grados
  98.                
  99.             }else if ( X > aterrizaje.min){//Esta a la derecha de la zona de aterrizaje
  100.                
  101.                 angulo=angulOK;//Un angulo de 21.913245 grados             
  102.                
  103.             }else{
  104.                
  105.                 angulo=0;
  106.             }
  107.                        
  108.         } else if (vSpeed >=0 ) { //Si la velocidad Vertical es superior o igual a 0
  109.             potencia=3;
  110.         }
  111.        
  112.     }
  113.    
  114.     return to_string(angulo) + " " +to_string(potencia);//Angulo potencia  
  115. }
  116. //*******************************************************************************************
  117. int main()
  118. {
  119.     vector <punto> marte;//Superficie marciana
  120.    
  121.     int surfaceN; // Numeros de puntos de la superficie marciana
  122.     cin >> surfaceN; cin.ignore();
  123.    
  124.     //Superficie marciana , la recupero en un vector de punto
  125.     for (int i = 0; i < surfaceN; i++) {//Modelizacion de la superficie marciana
  126.        
  127.         int landX; // X coordinate of a surface point. (0 to 6999)
  128.         int landY; // Y coordinate of a surface point. By linking all the points together in a sequential fashion, you form the surface of Mars.
  129.         cin >> landX >> landY; cin.ignore();
  130.         marte.push_back({landX,landY});//Guardo la superficie MARCIANA
  131.     }
  132.    
  133.    
  134.     // Bucle principal del juego
  135.     while (1) {
  136.         int X;
  137.         int Y;
  138.         int hSpeed; // the horizontal speed (in m/s), can be negative.
  139.         int vSpeed; // the vertical speed (in m/s), can be negative.
  140.         int fuel; // the quantity of remaining fuel in liters.
  141.         int rotate; // the rotation angle in degrees (-90 to 90).
  142.         int power; // the thrust power (0 to 4).
  143.         cin >> X >> Y >> hSpeed >> vSpeed >> fuel >> rotate >> power; cin.ignore();
  144.  
  145.         // Write an action using cout. DON'T FORGET THE "<< endl"
  146.         // To debug: cerr << "Debug messages..." << endl;
  147.  
  148.         // rotate power. rotate is the desired rotation angle. power is the desired thrust power.
  149.        // cout << "-20 3" << endl;
  150.        cout <<control(marte,X,Y,hSpeed,vSpeed)<<endl;
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement