Calcul d'un orthodromie et recouvrement d'une sphère.

Calcul d'un orthodromie et recouvrement d'une sphère. - Algo - Programmation

Marsh Posté le 29-09-2013 à 22:55:19    

Bonjour,
Je cherche à savoir si une position sur la terre se trouve à une distance <= à une distance D d'un autre point sur la terre.
J'ai donc vu la fonction orthodromique, mais j'ai un problème a priori, je trouve des objet positionné à une distance supérieur à D.
 
Voici ma fonction, c'est avec Ada, mais c'est pas bien compliqué, à part peut-être le sens des multiplication et des division pas 100000.0 qui ne sont pas moins obscure pour moi.
 
D'abord, je convertie des coordonnée GPS en degré minute seconde en degrés décimaux.
 
Pour la longitude :

Code :
  1. function Longitude (X : in Longitude_Coordonate_Type) return Decimal_Longitude_Type is                        
  2.   begin
  3.      
  4.      if X.Degr_Lon < 0.0 then
  5.         return -Decimal_Longitude_Type(abs(X.Degr_Lon) + (abs(X.Minu_Lon) / 60.0) + (abs(X.Seco_Lon) / 3600.0));
  6.      else
  7.            return Decimal_Longitude_Type(abs(X.Degr_Lon) + (abs(X.Minu_Lon) / 60.0) + (abs(X.Seco_Lon) / 3600.0));
  8.      end if;
  9.   end Longitude;


 
Pour la latitude.

Code :
  1. function latitude (Y : in Latitude_Coordonate_Type) return Decimal_Latitude_Type is
  2.   begin
  3.      
  4.      if Y.Degr_Lat < 0.0 then
  5.         return -Decimal_Latitude_Type(abs(Y.Degr_Lat) + (abs(Y.Minu_Lat) / 60.0) + (abs(Y.Seco_Lat) / 3600.0));
  6.      else
  7.         return Decimal_Latitude_Type(abs(Y.Degr_Lat) + (abs(Y.Minu_Lat) / 60.0) + (abs(Y.Seco_Lat) / 3600.0));
  8.      end if;        
  9.   end Latitude;


 
En suite j'applique la fonction d'orthodromie et je compare les distances.

Code :
  1. function Is_in(Target : in Gps_Coordonates_Type; item : in Gps_Coordonates_Type; Distance : in Float) return Boolean is
  2.            
  3.                              
  4.      --  Formule À Appliquer Pour Calculer Une Orthodromie : Cos P = (Sin LA . Sin LB) + (Cos LA . Cos LB . Cos G)      
  5.      LA, LB, G: Float := 0.0;
  6.      P : Float := 0.0;
  7.      --    LA Correspond À La Latitude Du Point A.
  8.      --    LB Correspond À La Latitude Du Point B.
  9.      --    G Correspond À La Différence De Longitude Entre Le Point A Et Le Point B.      
  10.      Cos_Produit : Float := 0.0;
  11.      sin_Produit : Float := 0.0;
  12.      Sum_Produit : Float := 0.0;
  13.   begin  
  14.      
  15.      La := Float'Rounding(Latitude(Target.Latitude) * 100000.0) / 100000.0;
  16.      
  17.      Lb := Float'Rounding(Latitude(Item.Latitude) * 100000.0) / 100000.0;
  18.      
  19.      G  :=  Float'Rounding(Longitude(item.Longitude) * 100000.0) / 100000.0 - Float'Rounding(Longitude(Target.Longitude) * 100000.0) / 100000.0;
  20.      
  21.      Cos_Produit := (Float'Rounding((Cos(La) * Cos(Lb) * Cos(G)) * 100000.0) /100000.0);
  22.      --Text_Io.Put_Line("cos_produit"  & Float'Image(cos_produit));
  23.      sin_Produit := (Float'Rounding((Sin(La) * Sin(Lb))  * 100000.0) /100000.0);      
  24.      --Text_Io.Put_Line("sin_produit"  & Float'Image(sin_produit));
  25.      Sum_Produit := (Cos_Produit + Sin_produit);      
  26.      --Text_Io.Put_Line("sum_produit"  & Float'Image(sum_produit));
  27.      P := Arccos(Sum_Produit);
  28.      
  29.      P := P * 60.0;
  30.      
  31.      if  P - Distance > 0.0 then
  32.         --Text_Io.Put_Line("False" );
  33.         return False;
  34.      else
  35.         Text_Io.Put_Line("TRUE" );
  36.         Text_Io.Put_Line("P = " & Float'Image(P));      
  37.         return True;
  38.      end if;
  39.   end Is_in;


 
Qui renvoie vrai pour beaucoup et suutout n'importe quoi.
 
Si vous pouviez jeter un oeil si vous avez le temps. S'il vous plaît ?
Merci.


Message édité par Profil supprimé le 30-09-2013 à 20:57:06
Reply

Marsh Posté le 29-09-2013 à 22:55:19   

Reply

Marsh Posté le 29-09-2013 à 23:25:33    

Par exemple,  
 
Pour les coordonnée suivante


Wopr coordonates
Long   1.0° 0.0' 0.0", Lat  85.0° 0.0' 0.0"
Target coordonates
Long -118.0° 0.0' 0.0", Lat -90.0° 0.0' 0.0"


 
La distance P est P =  5.80813E+01
 
A mon avis j'ai soit pas compris un truc soit mal fais un autre.

Reply

Marsh Posté le 30-09-2013 à 08:32:37    

Reply

Marsh Posté le 30-09-2013 à 10:23:26    

http://www.developpez.net/forums/d [...] es-resolu/
http://koti.mbnet.fi/ojalesa/googlepages/circle.htm
http://forum.webrankinfo.com/calcu [...] 74024.html
Ton pb s'apparente à un point qui se trouverait ou pas à l'intérieur d'un cercle connaissant les coordonnées de son centre et son rayon. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-09-2013 à 16:42:07    

Pourquoi, l'orthodromie c'est pas bien ?

Reply

Marsh Posté le 30-09-2013 à 17:00:34    

Toi t'as jamais utilisé de fonctions trigo de ta vie dans un programme informatique, je me trompes ?

Reply

Marsh Posté le 30-09-2013 à 17:10:52    

Presque, c'est la première fois.

Reply

Marsh Posté le 30-09-2013 à 17:13:00    

Les paramètres de toutes les fonctions trigo doivent être exprimées en rad.

Reply

Marsh Posté le 30-09-2013 à 17:23:43    

L'orthodromie retourne des mile nautique.  :jap:

Reply

Marsh Posté le 30-09-2013 à 19:51:59    

En réalité, j'essaie de raccorder deux fonction lié par leurs exploitation.
 
D'un côté je fais du recouvrement de surface dont voici le code, et de l'autre je regarde avec l'orthodromie si une position se trouve dans la distance de recouvrement.
 

Code :
  1. --
  2.      function Solid_List (Side : in Side_Type;
  3.                           Ray : in Float;
  4.                           Distance : in Float) return GPS_Coordonates_Manager.Vector is
  5.  
  6.         Terra : GPS_Coordonates_Manager.Vector;
  7.         Diametre : constant Float := Ray * 2.0;
  8.         Perimetre : constant Float := (Pi * Diametre) / 1.852;
  9.         D : constant Float := (1.0/60.0) * Distance;
  10.  
  11.         Count_Of_Equator : constant Long_Long_integer := Long_Long_integer((Perimetre/Distance));
  12.  
  13.         Y : Decimal_Latitude_Type := -90.0;
  14.         X : Decimal_Longitude_Type := -180.0;
  15.      begin
  16.         Text_Io.Put_Line("D =" & Float'Image(D));
  17.         Text_Io.Put_Line("count_of_equator =" & Long_Long_integer'Image(Count_Of_equator));
  18.         for I in 1..Count_Of_Equator/2 loop
  19.            for J in I..Count_Of_Equator loop
  20.  
  21.               declare
  22.                  Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  23.               begin
  24.                  if Side_Of(GPS) /= Side then
  25.                     Terra := Terra & GPS;
  26.                     Print(Gps);
  27.  
  28.                  end if;
  29.               exception
  30.                  when Constraint_Error =>
  31.                     null;
  32.               end;
  33.                Text_Io.Put_Line("X := " & Float'Image(X));
  34.               exit when X + D > 180.0;
  35.               X := X + D;
  36.  
  37.            end loop;
  38.            Text_Io.Put_Line("Y := " & Float'Image(Y));
  39.  
  40.            X := -180.0;
  41.            exit when Y + D > 90.0;
  42.            Y := Y + D;
  43.  
  44.         end loop;
  45.  
  46.         return Terra;
  47.      end Solid_List;


 
 
Mon problème est qu'avec une même distance je ne trouve pas les même points.


Message édité par Profil supprimé le 30-09-2013 à 19:53:05
Reply

Marsh Posté le 30-09-2013 à 19:51:59   

Reply

Marsh Posté le 30-09-2013 à 22:07:12    

Oups, j'ai dit une bêtise.
 
 
Je donne distance à solid_list et (distance * (1.0/60.0)) à Is_in.

Reply

Marsh Posté le 01-10-2013 à 10:51:12    

Et comme indiquer, faut travailler en radians ;) Or, je vois des 180 et 90 qui me laissent à penser que tu bosses en degrés :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-10-2013 à 11:18:33    

Non non, c'est pas le problème.
 
L'orthodromie exactement ça prend des coordonnées GPS. et ça retourne des mile nautique.|


Message édité par Profil supprimé le 01-10-2013 à 11:21:16
Reply

Marsh Posté le 01-10-2013 à 11:25:06    

rufo a écrit :

Et comme indiquer, faut travailler en radians ;) Or, je vois des 180 et 90 qui me laissent à penser que tu bosses en degrés :/


 
inutile d'insister  :)

Reply

Marsh Posté le 01-10-2013 à 11:54:35    

Surtout que c'est exactement la même chose. des degrés ou radians, c'est que l'unité qui change.
 
Bon après j'ai une explication à l'effet de divergence des proximité, peut-être que mon orthodromie est bonne, mais l'effet sur un plan 2D en tout cas, ça fait bizarre.
Faut voir que sur un plan 2D les bord sont en réalité des proximité.
Puis ça doit être tout défomé.
 
Enfin, ça reste obscure.
 
Alors, si vous savez ce que j'ai fait. Et que vous me comprenez, parce que c'est pas évident. Vous pouvez peut-être me venir en aide.
Je vous en remercie d'avance, merci pour les conseil.

Reply

Marsh Posté le 01-10-2013 à 12:11:12    

Question bête : tu utilises quel système de projection 2D ? Lambert II, WGS84, autre ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-10-2013 à 12:17:08    

J'utilise, la représentation jovasile.
 
Voici ma fonction To_Map coordonates qui applique une converstion GPS  dms en coordonnées 2D
 

Code :
  1. function To_Map_Coordonates(GPS_Coordonates : in Gps_Coordonates_Type) return Map_Coordonates_Type is
  2.  
  3.      Map_Coordonates : Map_Coordonates_Type;
  4.   begin
  5.      if Gps_Coordonates.Longitude.Degr_Lon >= 0.0 then
  6.  
  7.         Map_Coordonates.X :=
  8.           Max_X_Coordonate/2.0 +
  9.           ((GPS_Coordonates.Longitude.Degr_Lon) * (3600.0 * Lon_unit)) +
  10.           ((GPS_Coordonates.Longitude.Minu_Lon) * (60.0 * Lon_Unit)) +
  11.           ((GPS_Coordonates.Longitude.Seco_Lon) * Lon_Unit);
  12.      else
  13.  
  14.         Map_Coordonates.X :=
  15.           Max_X_Coordonate/2.0 -
  16.           ((GPS_Coordonates.Longitude.Degr_Lon) * (3600.0 * Lon_unit)  * (-1.0)) -
  17.           ((GPS_Coordonates.Longitude.Minu_Lon) * (60.0 * Lon_Unit)) -
  18.           ((GPS_Coordonates.Longitude.Seco_Lon) * Lon_Unit);
  19.     end if;
  20.  
  21.     if Gps_Coordonates.Latitude.Degr_Lat >= 0.0 then
  22.  
  23.         Map_Coordonates.Y :=
  24.           Max_Y_Coordonate/2.0 -
  25.           (((Gps_Coordonates.Latitude.Degr_Lat) * (3600.0 * Lat_unit)) +
  26.           ((Gps_Coordonates.Latitude.Minu_Lat) * (60.0 * Lat_Unit)) +
  27.           ((Gps_Coordonates.Latitude.Seco_Lat) * Lat_Unit));
  28.      else
  29.         Map_Coordonates.Y :=
  30.           Max_Y_Coordonate/2.0 +
  31.           ((Gps_Coordonates.Latitude.Degr_Lat) * (3600.0 * Lat_unit) * (-1.0)) +
  32.           ((Gps_Coordonates.Latitude.Minu_Lat) * (60.0 * Lat_Unit)) +
  33.           ((Gps_Coordonates.Latitude.Seco_Lat) * Lat_Unit);
  34.  
  35.      end if;
  36.  
  37.  
  38.      return Map_Coordonates;
  39.   end To_Map_Coordonates;


 
 
Je ne lui reproche que son manque d'arithmétique. En effet, j'aimerais bien assumer les négatif pour les minutes et les seconde également.

Reply

Marsh Posté le 01-10-2013 à 12:24:09    

Je pourrait mieux faire en représentant en 3D ma map sur un plan 2D.
C'est à dire qu'au delà 90° ou -90° longitudinal, je retourne au centre.

Reply

Marsh Posté le 01-10-2013 à 12:35:02    


 
Tout à fait, c'est juste une mesure d'angle  ;)  

Reply

Marsh Posté le 02-10-2013 à 22:14:48    

Si non, je cherche à améliorer ma procédure solid_list.
 
Dans l'état actuel, je me trouve avec un horizon de 360 dégrés aux pôles.
 
J'ai entrepris de faire une troisième boucle pour itérer du nord au sud l'index longitudinal, mais je me suis embrouillé plus qu'autre chose.
 
Des idées ?

Reply

Marsh Posté le 03-10-2013 à 00:42:41    


 
Bon, j'ai trouvé quoi faire, :
 

Code :
  1. function Solid_List (Side : in Side_Type;
  2.                Ray : in Float;
  3.                Distance : in Float) return GPS_Coordonates_Manager.Vector is
  4.     
  5.      Terra : GPS_Coordonates_Manager.Vector;
  6.      Diametre : constant Float := Ray * 2.0;  
  7.      Perimetre : constant Float := ((Pi * Diametre) / 1.852);
  8.      D : constant Float := (1.0/60.0) * Distance;
  9.     
  10.      Count_Of_Equator : constant Long_Long_integer := Long_Long_integer((Perimetre/Distance));
  11.          
  12.      Y : Decimal_Latitude_Type := -90.0 + D/2.0;
  13.      X : Decimal_Longitude_Type := 0.0+ D/ 2.0;            
  14.      begin
  15.      Text_Io.Put_Line("D =" & Float'Image(D));
  16.      Text_Io.Put_Line("count_of_equator =" & Long_Long_integer'Image(Count_Of_equator));                                
  17.     
  18.      case Side is    
  19.         when Ouest =>
  20.        North_est :
  21.            for I in 1..Count_Of_Equator/2 loop
  22.           for J in 1..I loop
  23.              for K in 1..Count_Of_Equator loop
  24.             for L in  J..K loop                
  25.               
  26.                declare
  27.                   Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  28.                begin                     
  29.                   if Side_Of(GPS) /= Side then
  30.                  Terra := Terra & GPS;
  31.                  Print(Gps);
  32.                 
  33.                   end if;
  34.                exception
  35.                   when Constraint_Error =>
  36.                  null;            
  37.                end;        
  38.                --Text_Io.Put_Line("X := " & Float'Image(X));                   
  39.                exit when X + D > 180.0;
  40.                X := X + D;
  41.               
  42.             end loop;         
  43.             --Text_Io.Put_Line("Y := " & Float'Image(Y));
  44.             
  45.             X := 0.0 + D/2.0;           
  46.             exit North_est when Y + D > 0.0;
  47.             Y := Y + D;                        
  48.              end loop;
  49.           end loop;      
  50.            end loop North_est;
  51.           
  52.            Y := 90.0;
  53.        South_Est :
  54.            for I in 1..Count_Of_Equator/2 loop
  55.           for J in 1..I loop
  56.              for K in 1..Count_Of_Equator loop
  57.             for L in  J..K loop                
  58.               
  59.                declare
  60.                   Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  61.                begin                     
  62.                   if Side_Of(GPS) /= Side then
  63.                  Terra := Terra & GPS;
  64.                  Print(Gps);
  65.                 
  66.                   end if;
  67.                exception
  68.                   when Constraint_Error =>
  69.                  null;            
  70.                end;        
  71.                --Text_Io.Put_Line("X := " & Float'Image(X));                   
  72.                exit when X + D > 180.0;
  73.                X := X + D;
  74.               
  75.             end loop;         
  76.             --Text_Io.Put_Line("Y := " & Float'Image(Y));
  77.             
  78.             X := 0.0 + D/2.0;           
  79.             exit South_est when Y - D < 0.0;
  80.             Y := Y - D;                        
  81.              end loop;
  82.           end loop;      
  83.            end loop South_Est;
  84.           
  85.           
  86.           
  87.           
  88.           
  89.         when Est =>                
  90.            X := -180.0 + D/ 2.0;            
  91.        North_West :
  92.            for I in 1..Count_Of_Equator/2 loop
  93.           for J in 1..I loop
  94.              for K in 1..Count_Of_Equator loop
  95.             for L in  J..K loop                
  96.               
  97.                declare
  98.                   Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  99.                begin                     
  100.                   if Side_Of(GPS) /= Side then
  101.                  Terra := Terra & GPS;
  102.                  Print(Gps);
  103.                 
  104.                   end if;
  105.                exception
  106.                   when Constraint_Error =>
  107.                  null;            
  108.                end;        
  109.                --Text_Io.Put_Line("X := " & Float'Image(X));                   
  110.                exit when X + D > 180.0;
  111.                X := X + D;
  112.               
  113.             end loop;         
  114.             --Text_Io.Put_Line("Y := " & Float'Image(Y));
  115.             
  116.             X := -180.0 + D/2.0;           
  117.             exit North_west when Y + D > 0.0;
  118.             Y := Y + D;                        
  119.              end loop;
  120.           end loop;      
  121.            end loop North_west;          
  122.           
  123.            Y := 90.0;
  124.        South_west:
  125.            for I in 1..Count_Of_Equator/2 loop
  126.           for J in 1..I loop
  127.              for K in 1..Count_Of_Equator loop
  128.             for L in  J..K loop                
  129.               
  130.                declare
  131.                   Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  132.                begin                     
  133.                   if Side_Of(GPS) /= Side then
  134.                  Terra := Terra & GPS;
  135.                  Print(Gps);
  136.                 
  137.                   end if;
  138.                exception
  139.                   when Constraint_Error =>
  140.                  null;            
  141.                end;        
  142.                --Text_Io.Put_Line("X := " & Float'Image(X));                   
  143.                exit when X + D > 180.0;
  144.                X := X + D;
  145.               
  146.             end loop;         
  147.             --Text_Io.Put_Line("Y := " & Float'Image(Y));
  148.             
  149.             X := -180.0 + D/2.0;           
  150.             exit South_west when Y - D < 0.0;
  151.             Y := Y - D;                        
  152.              end loop;
  153.           end loop;      
  154.            end loop South_west;          
  155.  
  156.           
  157.      end case;
  158.           
  159.           
  160.      return Terra;    
  161.   end Solid_List;


 
Ce qui fait 8281 surface de 1° de côté. Les coordonnées obtenue son les centres de ces surface.

Reply

Marsh Posté le 03-10-2013 à 22:57:08    

La revoici corrigée.
 

Code :
  1. --
  2.    function Solid_List (Side : in Side_Type;
  3.             Ray : in Float;
  4.             Distance : in Float) return GPS_Coordonates_Manager.Vector is
  5.      
  6.      Terra : GPS_Coordonates_Manager.Vector;
  7.      Diametre : constant Float := Ray * 2.0;  
  8.      Perimetre : constant Float := ((Pi * Diametre) / 1.852);
  9.      D : constant Float := (1.0/60.0) * Distance * 2.0;
  10.      
  11.      Count_Of_Equator : constant Long_Long_integer := Long_Long_integer((Perimetre/Distance));
  12.      
  13.      Y : Decimal_Latitude_Type := -90.0 + D /2.0;
  14.      X : Decimal_Longitude_Type := 0.0+ D / 2.0;            
  15.   begin
  16.      Text_Io.Put_Line("D =" & Float'Image(D));
  17.      Text_Io.Put_Line("count_of_equator =" & Long_Long_integer'Image(Count_Of_equator));                                
  18.      
  19.      case Side is    
  20.      when Ouest =>
  21.     North_est :
  22.         for I in 1..Count_Of_Equator/2 loop
  23.            for J in 1..Count_Of_Equator/2 loop
  24.           for K in 1..I loop
  25.              for L in  1..J*2 loop                
  26.             
  27.             declare
  28.                Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  29.             begin                     
  30.                if Side_Of(GPS) /= Side then
  31.                   Terra := Terra & GPS;
  32.                   Print(Gps);
  33.                   
  34.                end if;
  35.             exception
  36.                when Constraint_Error =>
  37.                   null;            
  38.             end;        
  39.             --Text_Io.Put_Line("X := " & Float'Image(X));                   
  40.             exit North_Est when X + D > 180.0;
  41.             X := X + D;
  42.             
  43.              end loop;         
  44.  
  45.              --Text_Io.Put_Line("Y := " & Float'Image(Y));
  46.              X := 0.0 + D/2.0;           
  47.              exit when Y + D > 0.0;
  48.              Y := Y + D;                        
  49.  
  50.             
  51.           end loop;
  52.            end loop;      
  53.         end loop North_est;
  54.         X := 0.0 + D/2.0;           
  55.         Y := 90.0 - D/2.0;
  56.     South_Est :
  57.         for I in 1..Count_Of_Equator/2 loop
  58.            for J in 1..Count_Of_Equator/2 loop
  59.           for K in 1..I loop
  60.              for L in  1..J*2 loop                
  61.             
  62.             declare
  63.                Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  64.             begin                     
  65.                if Side_Of(GPS) /= Side then
  66.                   Terra := Terra & GPS;
  67.                   Print(Gps);
  68.                   
  69.                end if;
  70.             exception
  71.                when Constraint_Error =>
  72.                   null;            
  73.             end;        
  74.             --Text_Io.Put_Line("X := " & Float'Image(X));                   
  75.             exit South_Est when X + D > 180.0;
  76.             X := X + D;
  77.             
  78.              end loop;         
  79.              --Text_Io.Put_Line("Y := " & Float'Image(Y));
  80.           X := 0.0 + D/2.0;           
  81.           exit when Y - D < 0.0;
  82.           Y := Y - D;                        
  83.           
  84.  
  85.             
  86.           end loop;
  87.                     
  88.            end loop;      
  89.         end loop South_Est;
  90.         
  91.         
  92.         
  93.         
  94.         
  95.      when Est =>                
  96.         X := 0.0 - D/ 2.0;            
  97.     North_West :
  98.         for I in 1..Count_Of_Equator/2 loop
  99.            for J in 1..Count_Of_Equator/2 loop
  100.           for K in 1..I loop
  101.              for L in  1..J*2 loop                
  102.             
  103.             declare
  104.                Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  105.             begin                     
  106.                if Side_Of(GPS) /= Side then
  107.                   Terra := Terra & GPS;
  108.                   Print(Gps);
  109.                   
  110.                end if;
  111.             exception
  112.                when Constraint_Error =>
  113.                   null;            
  114.             end;        
  115.             --Text_Io.Put_Line("X := " & Float'Image(X));                   
  116.             exit when X - D < -180.0;
  117.             X := X - D;
  118.             
  119.              end loop;         
  120.             
  121.              --Text_Io.Put_Line("Y := " & Float'Image(Y));
  122.             
  123.              X := 0.0 - D/2.0;           
  124.              exit North_west when Y + D > 0.0;
  125.              Y := Y + D;        
  126.             
  127.           end loop;
  128.           
  129.            end loop;      
  130.         end loop North_west;          
  131.         X := -0.0 + D/ 2.0;            
  132.         Y := 90.0 - D/2.0;
  133.     South_west:
  134.         for I in 1..Count_Of_Equator/2 loop
  135.            for J in 1..Count_Of_Equator/2 loop
  136.           for K in 1..I loop
  137.              for L in  1..J*2 loop                
  138.             
  139.             
  140.             declare
  141.                Gps : constant Gps_Coordonates_Type := To_Gps(X, Y);
  142.             begin                     
  143.                if Side_Of(GPS) /= Side then
  144.                   Terra := Terra & GPS;
  145.                   Print(Gps);
  146.                   
  147.                end if;
  148.             exception
  149.                when Constraint_Error =>
  150.                   null;            
  151.             end;        
  152.             --Text_Io.Put_Line("X := " & Float'Image(X));                   
  153.             exit South_West when X - D < -180.0;
  154.             X := X - D;
  155.             
  156.              end loop;         
  157.              --Text_Io.Put_Line("Y := " & Float'Image(Y));
  158.              X := 0.0 - D/2.0;           
  159.              exit when Y - D < 0.0;
  160.              Y := Y - D;                        
  161.  
  162.           end loop;
  163.  
  164.            end loop;      
  165.         end loop South_west;          
  166.  
  167.         
  168.      end case;
  169.      
  170.      
  171.      return Terra;    
  172.   end Solid_List;

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed