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 :

Récupération des coordonnées lors d'une rotation


Sujet :

Algorithmes et structures de données

  1. #41
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Algorithme de récupération des coordonnées lors d'une rotation
    Citation Envoyé par Péhelji Voir le message
    ... Une dernière petite chose : l'algorithme actuel permet à partir des valeurs x[i], y[i] de calculer la nouvelle position u[i], v[i] à partir d'un angle déterminé. Si je souhaite effectuer la rotation non plus à l'aide d'une glissière mais à la souris, comment puis-je récupérer la valeur de l'angle de rotation, sachant que la position u[i], v[i] représentera désormais la position du curseur de la souris, dont la distance du centre de rotation sera aléatoire ?
    Les coordonnées relatives du curseur par rapport au centre:
    Xcu = Xs - Xc ; Ycu = Ys - Yc
    permettent d'accéder à l'angle orienté As = (Ux , CS).
    Il doit y avoir une fonction appropriée AnglePol(x, y) dont je ne connais pas le nom exact ([I]ArcTan2(x, y)[/I ]? ); sinon, on la programme facilement à l'aide de la fonction ArcTan(.)

    # Un calcul encore plus simple est envisageable, en faisant intervenir la longueur fixe de la demi-diagonale (indépendante de l'indice):
    D = CCi = ((u[i] - Xc)2 + (v[i] - Yc)2)1/2 ,
    et en utilisant les rapports de similitude:
    (u[i] - Xc)/Xcu = (v[i] - Yc)/Ycu = D/(Xcu2 + Ycu2)1/2
    d'où:
    u[i] = Xc + Xcu*D/(Xcu2 + Ycu2)1/2 et v[i] = Yc + Ycu*D/(Xcu2 + Ycu2)1/2 .

    Éviter la coïncidence du curseur avec le centre (Xcu = Ycu = 0) qui provoquerait le plantage du programme, en imposant par exemple la condition d'exécution du calcul:
    (Xcu2 + Ycu2) > 100 (en nombre de pixels).

    Calculs à vérifier, parce que faits rapidement à la volée.

  2. #42
    Nouveau membre du Club
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Janvier 2018
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur occasionnel
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2018
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Bonsoir wiwaxia,

    Citation Envoyé par wiwaxia Voir le message
    Les coordonnées relatives du curseur par rapport au centre:
    Xcu = Xs - Xc ; Ycu = Ys - Yc
    permettent d'accéder à l'angle orienté As = (Ux , CS).
    Il doit y avoir une fonction appropriée AnglePol(x, y) dont je ne connais pas le nom exact ([I]ArcTan2(x, y)[/I ]? ); sinon, on la programme facilement à l'aide de la fonction ArcTan(.)
    Tout à fait et j'ai trouvé ce lien qui propose la fonction suivante pour récupérer l'angle désiré avec ArcTan2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TForm1.AngleOfLine(const P1, P2: TPoint): Double;
    begin
      Result := RadToDeg(ArcTan2((P2.Y - P1.Y),(P2.X - P1.X)));
      if Result < 0 then
        Result := Result + 360;
    end;
    Toutefois la fonction par du principe que le vecteur de base est invariablement l'axe X (en noir), l'angle étant calculé à partir du vecteur symbolisé par les points P1 et P2 (en rouge). Or je voudrais pouvoir faire la même chose par exemple en prenant comme vecteur de base non pas l'axe X ou l'axe Y, mais le vecteur en rouge sur le schéma.

    Nom : TwoVectorsAngle.png
Affichages : 187
Taille : 4,9 Ko

    Citation Envoyé par wiwaxia Voir le message
    # Un calcul encore plus simple est envisageable, en faisant intervenir la longueur fixe de la demi-diagonale (indépendante de l'indice):
    D = CCi = ((u[i] - Xc)2 + (v[i] - Yc)2)1/2 ,
    et en utilisant les rapports de similitude:
    (u[i] - Xc)/Xcu = (v[i] - Yc)/Ycu = D/(Xcu2 + Ycu2)1/2
    d'où:
    u[i] = Xc + Xcu*D/(Xcu2 + Ycu2)1/2 et v[i] = Yc + Ycu*D/(Xcu2 + Ycu2)1/2.
    Je ne te le fais pas dire ! D'autant que u[i] et v[i] représentent les coordonnées du curseur de la souris directement accessibles via l'évenement OnMouseMove des composants.

Discussions similaires

  1. Récupération des coordonnées d'une session Oracle
    Par azouzmenai24 dans le forum Forms
    Réponses: 4
    Dernier message: 16/03/2015, 13h18
  2. Récupération des coordonnées de la souris
    Par kabil.cpp dans le forum MFC
    Réponses: 11
    Dernier message: 23/05/2008, 06h43
  3. Réponses: 0
    Dernier message: 13/11/2007, 11h39
  4. Réponses: 2
    Dernier message: 15/06/2007, 10h08
  5. Réponses: 8
    Dernier message: 04/06/2007, 11h51

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