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

Mathématiques Discussion :

Problème de géométrie/Trigo


Sujet :

Mathématiques

  1. #1
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut Problème de géométrie/Trigo
    Bonjour.

    Je dispose d'un cercle 'C' repérer par son centre [Xc,Yc].
    J'ai le rayon R de ce cercle.
    Sur le périmètre de ce cercle, 3 points p1, p2, p3, chacun repéré par ses coordonnées [Xp1,Yp1], [Xp2,Yp2] et [Xp3,Yp3].

    Comment classer ces 3 points dans le sens horaire ?
    On sait également que le résultat du classement ne peut être que :
    p1, p2, p3 ou p3, p2, p1


    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 66
    Points
    66
    Par défaut
    pour ordonner deux points, par exemple P1 et P3, tu dois tester le signe du produit vectoriel entre les vecteurs CP1 et CP3 ou C est le centre du cercle.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Ou bien sans produit vectoriel, tu calcules l'angle qu'aurait le point dans un repère polaire centré sur le cercle en question (à l'aide d'Arccos et en ajustant le signe par exemple), après il ne te reste qu'à classer ces angles du plus grand au plus petit

    Petit algorithme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Angles := []
    Pour chaque point (xp, yp):
        angle := Arccos((xp - xc)/R)
        Si yp < yc alors:
            angle := -angle
        Fin Si
        Ajouter angle à Angles
    Fin Pour
     
    Classer les angles dans l'ordre décroissant

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Calculez les coordonnées des vecteurs
    RP1 RP2 RP3
    Normez ces vecteurs en U1 U2 U3
    I désigne le vecteur unitaire de l'axe des abscisses
    Les coordonnées de U1 sont le cosinus et le sinus de l'angle I,RP1, on peut donc trouver cet angle dans l'intervalle [0,2pi]
    Idem pour U2 et U3.
    Il n'y a plus ensuite qu'à comparer les 3 angles.
    Mais on peut raisonner plus rapidement avec la localisation dans les 'quadrants' du repère.
    Il suffit de savoir classer deux vecteurs unitaires dans le même quadrant, ce qui peut se faire avec une seule coordonnée.
    Comme le truc est cyclique on peut commencer par n'importe lequel des 3 vecteurs en décidant que c'est le premier.

  5. #5
    Expert éminent sénior

    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
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Autre solution :

    trouver le point le plus "à droite".
    calculer l'angle formé par les 2 autres points et celui-là.
    Le signe donnera lequel est dans le sens horaire par rapport au point trouvé.
    D'où le troisème.

  6. #6
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Idem souviron34, sauf que je ne vois pas bien l'interet de checher le point le plus a droite.

    si le produit vectoriel (P2P1)^(P2P3) a un Z positif, alors (P1,P2,P3) sont dans le sens horaire.

    C'est a dire si : (P1.x-P2.x)*(P3.y-P2y) > (P1.y-P2y)*(P3.x-P2x)

  7. #7
    Expert éminent sénior

    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
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pseudocode
    Idem souviron34, sauf que je ne vois pas bien l'interet de checher le point le plus a droite.
    L'intérêt est que c'est généralisable à N points (en fait une dérivation de l'algo. du "gift-wrapping" pour trouver l'enveloppe convexe (convex hull) d'un ensemble de points).

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par pseudocode
    si le produit vectoriel (P2P1)^(P2P3) a un Z positif, alors (P1,P2,P3) sont dans le sens horaire.

    C'est a dire si : (P1.x-P2.x)*(P3.y-P2y) > (P1.y-P2y)*(P3.x-P2x)
    salut,
    j'ai esseyé ta formule :
    (P1.x-P2.x)*(P3.y-P2y) > (P1.y-P2y)*(P3.x-P2x)
    mais ça ne fonctionne pas chez moi, celà me donne toujours un sens horaire
    p1,p2,p3 sont 3 points inscrits dans un cercle, et traçés dans l'ordre p1 p2 p3
    ??

  9. #9
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut
    Voilà où j'ai terminé au bout de la discussion :


    3 points P1, P2, P3 et 1 centre.
    Dans mon cas, L'ordre des points est [P1, P2, P3] ou [P3, P2, P1].
    En partant de la 1ère réponse de la discussion et en ajoutant quelques IF, voilà ce que cela donne.
    C'est peut pas optimun, mais pour moi c'est béton !!



    double Angle1 = Math.Acos((P1.X - Centre.X) / Rayon);
    if (P1.Y < Centre.Y) Angle1 = Angle1 * -1;
    //--
    double Angle2 = Math.Acos((P2.X - Centre.X) / Rayon);
    if (P2.Y < Centre.Y) Angle2 = Angle2 * -1;
    //--
    double Angle3 = Math.Acos((P3.X - Centre.X) / Rayon);
    if (P3.Y < Centre.Y) Angle3 = Angle3 * -1;


    //--- Inversion P1 & P3 en fonction ds valeurs
    if ((Angle1 < Angle2) && (Angle3 < Angle2) && (Angle1 < Angle3) )
    {
    // Dans l'ordre, on a P3 , P2 et P1
    }
    else if ((Angle1 > Angle2) && (Angle3 < Angle2))
    {
    // Dans l'ordre, on a P3 , P2 et P1
    }
    else if ((Angle1 > Angle2) && (Angle3 > Angle2) && (Angle1 < Angle3))
    {
    // Dans l'ordre, on a P3 , P2 et P1
    }
    else
    {
    // Dans l'ordre, on a P1 , P2 et P3
    }

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    merci Nico28 de ta réponse

    je viens de trouver plus simple, en calculant la surface du triangle formé par les 3 points :

    surface=0.5*(x1*y2-x2*y1)+0.5*(x2*y3-x3*y2)+0.5*(x3*y1-x1*y3)
    si surface > 0 : sens horaire ( P1 P2 P3 )

    a+

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

Discussions similaires

  1. Problème de compteur géométrie et triangle
    Par AJMont dans le forum Calcul scientifique
    Réponses: 6
    Dernier message: 18/07/2014, 18h00
  2. [bar] Problème d'affichage à géométrie variable
    Par herbert2008 dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/06/2009, 13h00
  3. Petit problème de géométrie vectorielle
    Par miroxyde dans le forum Mathématiques
    Réponses: 2
    Dernier message: 09/06/2008, 16h18
  4. problème de géométrie 3d
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 20/04/2006, 11h39

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