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

C++Builder Discussion :

[C++ Builder 6]Faire pivoter un rectangle


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut [C++ Builder 6]Faire pivoter un rectangle
    Bonjour à tous,
    Je souhaiterais faire pivoter un rectangle sur un TCanvas.
    Je m'explique... J'ai donc défini un TRect, que je dessine avec la Méthode Rectangle(P1.x, P1.y, P2.x, P2.y) du TCanvas.
    Aujourd'hui je le fait pivoter à 90° en échangeant P1 et P2... jusque là ça va....
    Mais maintenant j'aimerais pouvoir le faire pivoter à 45° et vu mon niveau de math j'aurais apprécié l'aide de quelqu'un...
    Voilà.
    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Tu peux utiliser la méthode Polygon, tu pourras tracer autre chose que des rectangle horizontaux/verticaux. Tu as juste à calculer les coordonnées des points du rectangle, cf wikipedia.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    On suppose avoir déclaré :

    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
     
    #include <math.h>
    double dtr = 3.14159265358979 / 180.0;
    int Angle = 0; // en degrés
    TRect Re = Rect(100,100, 150, 200); // notre rectangle
    int Cx;
    int Cy;
    double radians;
    double sina;
    double cosa;
    double cosb;
    double sinb;
    double x;
    double y;
    double h;
    TPoint Points[5];
    Un fonction pour effectuer la rotation :

    On va y calculer l'angle d'un point par rapport au centre d'un référentiel.
    Si le centre du référentiel est le centre de gravité du rectangle,dans ce cas le rectangle va tourner sur lui-même.
    On se contente ici d'additionner deux angles : l'angle initial + angle de rotation et d'en déduire les nouvelles coordonnées du point.

    REM :
    sin (a + b) = (sin a * cos b) + (cos a * sin b)
    cos (a + b) = (cos a * cos b) - (sin a * sin b)

    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
     
    TPoint Rotation(int X, int Y)
    {
    TPoint D;
     
    x = X - Cx;
    y = Y - Cy;
    h = hypot(x,y);
     
    cosb = 0.0;
    sinb = 0.0;
     
    if(h != 0.0)
        {
        cosb = x / h;
        sinb = y / h;
        }
     
    x = ((sina * cosb) + (cosa * sinb)) * h;
    y = ((cosa * cosb) - (sina * sinb)) * h;
     
    D = Point(Cx + x, Cy - y);
    return D;
    }

    J'ai testé comme ceci :

    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
     
    void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
    {
    Angle = ScrollBar1->Position;
    //Ici la form sert de plan pour le dessin, donc on efface
    Canvas->Brush->Color = Color;
    Canvas->FillRect(Rect(0,0, 250, 250));
     
     
    //On pré calcule ce qui vaut pour les 4 sommets
    //REM : Angle en degrés
    radians = dtr * Angle;
    sina = sin(radians);
    cosa = cos(radians);
    //On suppose que les sommets de Re sont agencés correctement
    //On en déduit le centre de gravité du rectangle
    Cx = (Re.Right + Re.Left) / 2;
    Cy = (Re.Bottom + Re.Top) / 2;
     
    //Rotation des 4 sommets
    Points[0] = Rotation(Re.Left, Re.Top);
    Points[1] = Rotation(Re.Right, Re.Top);
    Points[2] = Rotation(Re.Right, Re.Bottom);
    Points[3] = Rotation(Re.Left, Re.Bottom);
    Points[4] = Points[0];
     
    //On dessine
    Canvas->Polyline(Points, 4);
    }
    A plus !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 22
    Par défaut
    Grand grand merci...
    Tout "tourne" à la perfection...
    j'en aurais presque les larmes aux yeux tellement ça fonctionne
    Merci

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Sauf que j'ai fait une grosse erreur (même si ça semblait fonctionner !) !
    Il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    y = ((sina * cosb) + (cosa * sinb)) * h; // et non x puisque c'est sin(a+b) !!!
    x = ((cosa * cosb) - (sina * sinb)) * h; // et non y puisque c'est cos(a+b) !!!
    D = Point(Cx + x, Cy + y);
    Ca se vérifie maintenant avec un triangle !

    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
     
    //On suppose TPoint Tr[3] pour les 3 sommets du triangle
    Cx = (Tr[0].x + Tr[1].x + Tr[2].x) / 3;
    Cy = (Tr[0].y + Tr[1].y + Tr[2].y) / 3;
     
    //Rotation des 3 points
    Points[0] = Rotation(Tr[0].x, Tr[0].y);
    Points[1] = Rotation(Tr[1].x, Tr[1].y);
    Points[2] = Rotation(Tr[2].x, Tr[2].y);
    Points[3] = Points[0];
     
    Canvas->Pen->Color = clBlack;
    //On dessine la rotation
    Canvas->Polyline(Points, 3);
     
    //On dessine l'original
    Canvas->Pen->Color = clBlue;
    Points[0] = Tr[0];
    Points[1] = Tr[1];
    Points[2] = Tr[2];
    Points[3] = Points[0];
    Canvas->Polyline(Points, 3);
    Il y a des jours comme ça... !!!

    A plus !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481

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

Discussions similaires

  1. [Tkinter] Est-il possible de faire pivoter des PhotoImage ?
    Par sigmar_avenger dans le forum Tkinter
    Réponses: 9
    Dernier message: 06/01/2007, 15h18
  2. Faire pivoter une image dans TImage
    Par Bourak dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2006, 08h51
  3. Faire pivoter une zone de texte dans un état
    Par YLL dans le forum Access
    Réponses: 3
    Dernier message: 20/02/2006, 20h05
  4. [JLabel] faire pivoter
    Par Casp dans le forum Composants
    Réponses: 3
    Dernier message: 17/06/2005, 10h05
  5. Réponses: 10
    Dernier message: 06/05/2005, 19h02

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