IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

dessin de courbe othodromique


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut dessin de courbe othodromique
    Bonjour

    Sur une projection de mecator representant un planisfere terrestre, je positionne deux points et je donne la distance orthodromique entre ces points

    J'aimerais aussi tracer la courbe representant l'arc de grand cercle entre ces points

    Une idée comment faire
    J'avais pensé calculer quelques points intermédiaires et profiter d'une methode de tracé de Bezier entre ces points

    Je ne sais pas si l'idée vaut quelque chose mais le cas échéant je devrais aussi trouver une formule pour calculer les coordonées de ces points intermédiaires

    Merci de votre aide

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    J'avais pensé calculer quelques points intermédiaires
    C'est bien la bonne methode. (avec un point tous les 100 ou 200 km environ, "beziers" n'est pas vraiment indispensable).

    Pour déterminer les coordonnées des points intermédiaire, on calcule l'azimuth Az de Pt1 à Pt2, puis on détermine les points intermédiaires Pti en foncton de Pt1, Az et la distance désirée entre Pt1 et Pti.
    Remarque : Azimuth(Pt2,Pt1) est différent de -Azimuth(Pt2,Pt1)

    Comme il me semble que tu travailles en C#, ces bouts de codes devraient t'aider:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
      internal struct SxGeoPt
        {
            internal float lat, lon; // in radians, North Positive, West positive
        }
     
      internal class SxGeoCalc
        {
            internal const float DegPerRad = (float)(180F / Math.PI);
            internal const float RadPerDeg = (float)(Math.PI / 180F);
     
            internal static SxGeoPt GEO_CoorPA(SxGeoPt p1, float az, float raddist)
            //---GEO_CoorPA------------------------------------------------------------
            // This procedure provides coordinates of the point p2 located
            // - at a distance raddist of a point p1
            // - in the direction of azimuth az
            // input   p1        <SxGeoPt> coordinates of reference point
            //         raddist   <float>   distance in radian between p1 and p2
            //         az        <float>   azimut of p2 from p1,
            //                             (az=0, if p1 and p2 on same longitude)
            // output  p2        <SxGeoPt> coordinates of resulting point
            {
                SxGeoPt result;
                if (p1.lat > SxMath.PIDiv2 - SxMath.RadPerMin)
                { if (az <= SxMath.PI) result.lon = az; else result.lon = az - SxMath.PI; result.lat = SxMath.PIDiv2 - raddist; }
                else if (p1.lat < -SxMath.PIDiv2 + SxMath.RadPerMin)
                { if (az <= SxMath.PI) result.lon = -az; else result.lon = -az + SxMath.PI; result.lat = -SxMath.PIDiv2 + raddist; }
                else
                {
                    result.lat = (float)Math.Asin((Math.Sin(p1.lat) * Math.Cos(raddist)) +
                                              (Math.Cos(p1.lat) * Math.Sin(raddist) * Math.Cos(az)));
                    float dlon = (float)Math.Atan2(Math.Sin(az) * Math.Sin(raddist) * Math.Cos(p1.lat),
                                                    Math.Cos(raddist) - Math.Sin(p1.lat) * Math.Sin(result.lat));
                    result.lon = SxMath.RealMod(p1.lon - dlon + SxMath.PI, SxMath.x2PI) - SxMath.PI;
                }
                return result;
            }
     
            internal static float GEO_AzimPtPt(SxGeoPt p1, SxGeoPt p2)
            // This function provides the direction of the segment joinning 2 points
            // p1 and p2 defined by their geographic coordinates.
            // p2 is in azimut GEO_AZIMPP(p1,p2) of p1
            // input   p1,p2   <SxGeoPt> coordinates of the 2 points
            // result          <single>  angle in radians with North direction (clockwize) : azimuth of p2 from p1
            {
                float coslat1 = (float)Math.Cos(p1.lat);
                if (coslat1 > 0.000001)
                    return SxMath.RealMod((float)Math.Atan2
                      (Math.Sin(p1.lon - p2.lon) * Math.Cos(p2.lat),
                       coslat1 * Math.Sin(p2.lat) - Math.Sin(p1.lat) * Math.Cos(p2.lat) * Math.Cos(p1.lon - p2.lon)),
                       SxMath.x2PI);
                else if (p1.lat > 0) return SxMath.PI;
                else return 0;
            }
        }
     
    internal class SxMath
      {
        internal const  float      PI                 = (float)Math.PI;
        internal const  float      x2PI               = PI * 2;
        internal const  float      PIDiv2             = PI/2;
     
        // Example : RealMod(3,2*PI)=3 / RealMod(2*PI+3,2*PI)=3 / RealMod(-3,2*PI)=2*PI-3 
        internal static float RealMod(float val,float modval)
        {
          float result = (float)Math.IEEERemainder(val,modval);
          if (result<0) result = result + modval;
          return result;
        }
    }

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Magnifique Graffito

    Merci de ton aide et des formules
    Je vais essayer cela ce dimanche !

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Graffito

    Apres avoir pu faire la moité des choses que je n'avais pas prévu de faire ce Week-End j'entame enfin le petit bout de ce que j'espèrais faire !

    Dans ton exemple, il manque la constante RadPerMin

    Je suppose que voici ce qu'il faut déclarer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          internal const float RadPerMin = (float)(Math.PI / 10800F);

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Je suppose que voici ce qu'il faut déclarer 
    internal const float RadPerMin = (float)(Math.PI / 10800F); 
    Exact

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Graffito

    Je tiens a te remercier car tu m'a bien aidé sur ce coup ci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. dessiner une courbe à partir d'un tableau de valeur
    Par bob75018 dans le forum C++Builder
    Réponses: 8
    Dernier message: 15/06/2007, 04h29
  2. dessiner une courbe composant chart
    Par tarekcom dans le forum Composants VCL
    Réponses: 7
    Dernier message: 09/05/2006, 22h01
  3. Dessin de Courbe
    Par ilhamita dans le forum 2D
    Réponses: 4
    Dernier message: 23/04/2006, 15h05
  4. comment dessiner des courbes en c++builder?
    Par bob75018 dans le forum C++Builder
    Réponses: 8
    Dernier message: 17/01/2006, 20h19
  5. Dessiner des courbes
    Par LE NEINDRE dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 23/06/2005, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo