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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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