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 :

Rotation rectangle => déformation


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut Rotation rectangle => déformation
    Bonjour,

    Alors voilà, je dispose d'un point avec des coordonnées GPS (donc couple latitude/longitude x0,y0) et d'un angle ($angle).
    A partir du point je dessine un rectangle en calculant les coordonnées des 4 sommets. Puis j'applique une rotation pour chaque sommet avec l'angle et autour de mon point de départ qui se trouve être le centre du rectangle. Donc en clair je fais pivoter le rectangle sur lui même. Mon souci c'est qu'il se déforme durant la rotation (les coins ne sont plus à angle droit). Si j'applique une rotation de 90° il retrouve ses angles droits.

    Voici les formules que j'utilise pour appliquer la rotation sur les coordonnées des sommets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $new_x = $x0 + ($x - $x0) * cos($angle) - ($y - $y0) * sin($angle)
    $new_y = $y0 + ($x - $x0) * sin($angle) + ($y - $y0) * cos($angle)
    J'ai fait une boulette dans ces formules ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par spin0us Voir le message
    Voici les formules que j'utilise pour appliquer la rotation sur les coordonnées des sommets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $new_x = $x0 + ($x - $x0) * cos($angle) - ($y - $y0) * sin($angle)
    $new_y = $y0 + ($x - $x0) * sin($angle) + ($y - $y0) * cos($angle)
    J'ai fait une boulette dans ces formules ?
    Ne serait-ce pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $new_x = $x0 + d_coin * cos($angle + $angle_coin)
    $new_y = $y0 + d_coin * sin($angle+ $angle_coin)
    ou d_coint et angle_coin sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d_coin = sqrt(($x_coin-$x)²+($y_coin-$y)²)
    angle_coin = arctan(($x_coin-$x) / ($y_coin-$y))

  3. #3
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Je t'avouerai que ce genre de manip date un peu pour moi. Donc c'est possible, je vais tester de suite.

    EDIT: semblerait que ce soit pire. Ce coup ci mon rectangle n'est plus qu'une simple ligne

    Avant modification


    Après modification


    La pin représente le centre du rectangle d'origine qui sert de centre de rotation.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Bonjour,

    a priori les formules de ton premier post sont correctes. Es-tu sur que ton rectangle initial est bien un rectangle? que le centre que tu prends en compte est précisément au centre de ton rectangle?

    L'affichage, tu le fais avec un repère cartésien classique?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par spin0us Voir le message
    J'ai fait une boulette dans ces formules ?
    La formule me semble bonne. Par contre, le concept de faire une rotation sur des coordonnées Latitude/Longitude me parait curieux. Ce n'est pas vraiment un repère cartésien orthonormé.


    Edit: croisement de post avec magelan. désolé.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  6. #6
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Pour créer le rectangle je pars du point central et j'ajoute/retranche une certaine valeur fixe pour déterminé les 4 coins du rectangle.
    Après pour l'histoire du repère cartésien orthonormé, sur une si petite distance (200m) en général tu peux considérer la terre comme plate, donc les coordonnées (2 nombres à virgules) c'est tout comme.

  7. #7
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Pour créer le rectangle je pars du point central et j'ajoute/retranche une certaine valeur fixe pour déterminé les 4 coins du rectangle.
    Après pour l'histoire du repère cartésien orthonormé, sur une si petite distance (200m) en général tu peux considérer la terre comme plate, donc les coordonnées (2 nombres à virgules) c'est tout comme.
    Bon, bah il ya de la magie quelque part parce que visiblement tu n'as pas une isométrie.

    Essayes avec un angle de 45°, et donne nous les valeurs que tu obtiens (x,y,x0,y0,new_x,new_y)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Essayes avec un angle de 45°, et donne nous les valeurs que tu obtiens (x,y,x0,y0,new_x,new_y)
    x=45.81441
    y=5.9971
    x0=45.81699
    y0=5.99751
    new_x=45.8154555783
    new_y=5.99539575072

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Quels sont les coordonnées des 3 autres sommets de ton rectangle initial? as-tu fais des arrondis?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par spin0us Voir le message
    x=45.81441
    y=5.9971
    x0=45.81699
    y0=5.99751
    new_x=45.8154555783
    new_y=5.99539575072
    visiblement les coins et le centre sont très proches l'un de l'autre. Les valeurs x/new_x ne diffèrent que de 0.001. Je me demande s'il n'y a pas des erreurs d'arrondis lors du calcul.

    Essaye d'éloigner les coins d'un facteur 1000, puis de rediviser par 1000 une fois le calcul effectué. Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $factor = 1000
    $rx  = $factor*($x - $x0)
    $ry  = $factor*($y - $y0)
     
    $new_x = $x0 + ( $rx * cos($angle) - $ry * sin($angle) ) / $factor
    $new_y = $y0 + ( $rx * sin($angle) + $ry * cos($angle) ) / $factor
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Ca n'a pas l'air de beaucoup influencer le résultat

    x=45.81441
    y=5.9971
    x0=45.81699
    y0=5.99751
    new_x=45.8154555783
    new_y=5.99539575072

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par spin0us Voir le message
    Ca n'a pas l'air de beaucoup influencer le résultat
    Bon, bah c'est pas une erreur d'arrondie

    Ca nous laisse pas grand chose comme erreur possible.
    - soit c'est l'affichage qui est faux
    - soit c'est le principe d'utiliser les long/lat comme coordonnées cartésiennes
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Membre confirmé Avatar de spin0us
    Profil pro
    Inscrit en
    Février 2003
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 87
    Par défaut
    Je vais voir du côté des lat/long pour trouver un moyen de les convertir en coordonnées cartésiennes, faire mes transformations, puis revenir au coordonnées GPS standard.

  14. #14
    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
    Bonjour,


    Pour faire pivoter le rectangle, il suffit de 3 fonctions de base:
    • Dist : calcul de distance D entre 2 points O et P,
    • Azim : calcul de l'azimuth A d'un point P par rapport à un point O,
    • PtInAzim :calcul du pt situé à une distance d et dans un azimuth A d'un point O.
    Si O est le centre du rectangle, le sommet A' = position de A après rotation sera obtenu ainsi : A'=PtInAzim(O,Dist(A,O),Azim(A,O)+Angle_de_Rotation).

    Cette méthode permet de gérer correctement des rectangles de grande taille (cotés de plusieurs centaines de kilomètres).


    Pour ton appli qui me semble concerner des distances plus courtes, on peut travailler sur une rotation classique dans le plan. Mais, il faut :
    • avant la rotation, faire une projection mercator corrigée par la latitude: x'=x*cos(yo_en_radians), yo étant la latitude du centre.
    • après la rotation, faire la transformation inverse : x=x'/cos(yo_en_radians)

  15. #15
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Oserai-je répéter pour la N + M ième fois que TOUS les calculs à base de lat/Lon doivent être basés sur les conversions des projections correspondantes, puis re-transformés en lat/lon ?

    D'une part ce sont des cercles, et d'autre part ils ne tiennent pas compte des manières de représenter la Terre. Donc à part faire les calculs en coordonnées sphériques (un tantinet complexe), la seule manière de faire des calculs exacts est de se servir des formules de transformation en mètres, pour la projection utilisée, et disponibles ds tout bon ouvrage, dont celui considéré comme la Bible et déjà multi-cité...





    PS: @Graffito : je ne sais pas si les plans Google de la France sont en Mercator, vu que les cartes sont en Lambert 2..

  16. #16
    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
    PS: @Graffito : je ne sais pas si les plans Google de la France sont en Mercator, vu que les cartes sont en Lambert 2..
    L'initiateur de la discussion a ses coordonées en GPS (lat,lon) et veut des résultats en (lat,lon). Le calcul est indépendant de la projection utilisée pour l'affichage.

    En fait, peu importe la projection choisie pour les calculs avant/après la rotation, l'essentiel est que cette projection respecte les distances. J'ai proposé Mercator corrigée car c'est la plus simple qui réponde à ce critère.

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Graffito Voir le message
    L'initiateur de la discussion a ses coordonées en GPS (lat,lon) et veut des résultats en (lat,lon). Le calcul est indépendant de la projection utilisée pour l'affichage.
    Sauf qu'un rectangle en lat-lon n'est jamais représenté comme un rectangle, sauf effectivement en Mercator (mais avec une déformation)..

    Comme je le disais, la manière correcte et absolue est de faire le calcul en coordonées sphériques..

    SAUF QUE, le but étant de représenter un rectangle sur GoogleMaps, et GoogleMaps étant par définition une projection, il faut de toutes façons passer par une équation de transformation...



    'fin bref, sinon je suis d'accord avec toi



    Mais il semble qu'énormément de gens (programeurs et/ou boîtes) voulant faire ce type de calculs "oublient" simplement ces faits de base....


    PS: un petit exemple simple est de regarder avec StreetView, ou de donner une adresse exacte et de zoomer sur le plan... Plus de 2 fois sur 3 on tombe au milieu de la rue.... Et une "petite" imprécision est révélatrice des approximations faites dans le calcul...

Discussions similaires

  1. rotation rectangle cercle
    Par demss dans le forum Mathématiques
    Réponses: 9
    Dernier message: 11/02/2008, 03h58
  2. [vb6] Rotation d'un rectangle
    Par Asdorve dans le forum Vos contributions VB6
    Réponses: 106
    Dernier message: 05/07/2006, 11h06
  3. Rotation rectangle
    Par bonjour69 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 25/04/2006, 19h21
  4. Rotation d'un rectangle
    Par erwan.bodere dans le forum SDL
    Réponses: 4
    Dernier message: 02/12/2005, 21h19
  5. Rotation d'un rectangle autour du centre de gravité
    Par bucheron dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 22/06/2004, 11h01

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