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 :

rotation d'un cercle


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut rotation d'un cercle
    bonsoir tout le monde! je suis confronté à un problème qui me trouble depuis un moment.

    voilà : j'ai tracé un cercle, je fais déplacer mon cercle en coordonnées X et Y. jusque-là tout va bien. maintenant je voudrai que mon objet (le cercle que j'ai tracé par exemple) tourne sur lui même avec un angle que j'introduis. vous comprendrez trés vite que c'est irrationnel de vouloir faire tourner le cercle. en fait, je voudrai que ça soit un triangle à la place du cercle. est-ce cela est possible?

    question 1 : comment afficher un triangle à la place du cercle.
    question 2 : comment faire tourner le triangle sur lui même avec un angle alpha.

    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int x,y; 
    x= StrToInt(Edit3->Text) ;
    y= StrToInt(Edit4->Text) ;
    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
    TCanvas *pCanvas = Image1->Canvas;
    pCanvas->Brush->Color = clAqua;
    pCanvas->Ellipse(x, y, x+20, y+20);
    mes cordiaux remerciements.

  2. #2
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 341
    Par défaut
    Salut

    A vue de nez, cela ressemble à un problème de trigonométrie:
    si l'on prend le cas le plus simple d'un triangle équilatéral ( je prends simple parce que je suis nul en math ), on peut dire que ses 3 sommets se trouvent sur un cercle.
    Soit 3 sommets A, B, C. En ce qui concerne le sommet A, on peut le faire tourner sur le cercle en calculant ses coordonnées à l'aide de sinus et cosinus. Ensuite pour les sommets B et C, on sait qu'il sont décalés de +120° et -120° par rapport au sommet A. On peut donc calculer leurs positions dans l'espace, par rapport à la position du sommet A.
    En résumé, on fait varier l'angle du sommet A, on calcul sa position, on en déduit les positions des autres sommets.
    Ensuite, il suffit de relier les 3 points grâce à la procédure Je décline toutes responsabilité quant à la véracité de ce que je viens d'écrire, vu que moi les maths...

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    bonjour!! merci pour ta réponse, je dois avouer que tes phrases sont agréables à lire

    je ne pense pas que tu t'es trompé, c'est ce qui me semble logique à priori. ton niveau en math n'est pas si faible que ça je trouve cependant, le tout est de trouver la bonne combine pour programmer ça. et oui, moi en revanche c'est mon niveau en programmation qui est faible!

    alors voilà, oublions l'histoire du triangle, du cercle...etc. raisonons avec un polygone. je veux que ce polygone puisse tourner sur lui-même en introduisant une valeur d'angle. (effectuer une rotation). bien entendu, à première vue, ça nous semble évident: une simple fonction de "sin" et de "cos" peut résoudre ce problème. mais je débute en programmation, et je ne sais pas comment dois-je programmer ça?

    merci beaucoup.

  4. #4
    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 !

    Par exemple :

    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
    30
    class DPoint
    {
    public :
    DPoint *ref;
    double x;
    double y;
    TPoint at;
    double dist;
    double angle;
     
        void __fastcall ReInit();
        void __fastcall Init(TPoint P, DPoint *R);
        void __fastcall Rotation(double Angle);
    };
     
    enum{trDegree=0, trRadian};
     
    class jTriangle : public TComponent
    {
    public :
    DPoint R;
    DPoint S1;
    DPoint S2;
    DPoint S3;
        __fastcall jTriangle(TComponent *Owner, TPoint P1, TPoint P2, TPoint P3);
        __fastcall ~jTriangle();
        void __fastcall Draw(TCanvas *C);
        void __fastcall Rotation(double Angle, int Type);
        void __fastcall ChangeRef(TPoint P);
    };
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #define pi 3.1415926535897932384626433832795
    #define Pi 6.28318530717958647692528676655901
     
    void __fastcall DPoint::Init(TPoint P, DPoint *R)
    {
    ref = R;
    x = P.x;
    y = P.y;
    at = P;
    ReInit();
    }
     
    void __fastcall DPoint::ReInit()
    {
    double dx = x - ref->x;
    double dy = ref->y - y;
    dist = hypot(dx, dy);
    double sina = dy/dist;
    double cosa = dx/dist;
    angle = asin(sina);
    if(sina >= 0.0)
        {
        if(cosa < 0.0) angle = pi - angle;
        }
    else
        {
        if(cosa < 0.0) angle = pi - angle;
        else angle = Pi + angle;
        }
    }
     
    void __fastcall DPoint::Rotation(double Angle)
    {
    double xr = ref->x + (cos(Angle + angle) * dist);
    double yr = ref->y - (sin(Angle + angle) * dist);
    at = Point(xr,yr);
    }
     
     
    __fastcall jTriangle::jTriangle(TComponent *Owner, TPoint P1, TPoint P2, TPoint P3)
        : TComponent(Owner)
    {
    R.x = (P1.x + P2.x + P3.x) / 3.0;
    R.y = (P1.y + P2.y + P3.y) / 3.0;
    S1.Init(P1, &R);
    S2.Init(P2, &R);
    S3.Init(P3, &R);
    }
    __fastcall jTriangle::~jTriangle()
    {
    }
    void __fastcall jTriangle::Draw(TCanvas *C)
    {
    C->MoveTo(S1.at.x, S1.at.y);
    C->LineTo(S2.at.x, S2.at.y);
    C->LineTo(S3.at.x, S3.at.y);
    C->LineTo(S1.at.x, S1.at.y);
    }
     
    void __fastcall jTriangle::Rotation(double Angle, int Type)
    {
    double a = Angle;
    if(Type == trDegree) a = Pi * Angle / 360.0;
    if(a < 0.0) a = Pi + a;
    else a = fmod(a, Pi);
    S1.Rotation(a);
    S2.Rotation(a);
    S3.Rotation(a);
    }
     
    void __fastcall jTriangle::ChangeRef(TPoint P)
    {
    R.x = P.x;
    R.y = P.y;
    S1.ReInit();
    S2.ReInit();
    S3.ReInit();
    }
    J'ai utilisé à l'aide d'une simple form, donc pour info :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
     
    //Ici en degrés
    int AngleRotation1 = 0;
    int AngleRotation2 = 0;
    //Mes deux triangles
    jTriangle *Triangle1;
    jTriangle *Triangle2;
     
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Triangle1 = new jTriangle(this, Point(100,100), Point(150, 180), Point(10,150));
    Triangle2 = new jTriangle(this, Point(150,120), Point(100, 200), Point(50,200));
    /*
    Pour le Triangle2, je modifie son référentiel qui est normalement fixé sur son centre de gravité. 
    Ici je mets n'importe quoi en fait... 
    */
    Triangle2->ChangeRef(Point(ClientWidth/2, ClientHeight/2));
    }
     
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    DrawBitmap();
    }
     
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    DrawBitmap();
    }
     
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    delete Bitmap;
    Bitmap = NULL;
    }
     
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if(Key == VK_RIGHT)
        {
        AngleRotation1--;
        Triangle1->Rotation(AngleRotation1, trDegree);
     
        AngleRotation2++;
        Triangle2->Rotation(AngleRotation2, trDegree);
     
        DrawBitmap();
        Key = 0;
        }
    else
        {
        if(Key == VK_LEFT)
            {
            AngleRotation1++;
            Triangle1->Rotation(AngleRotation1, trDegree);
     
            AngleRotation2--;
            Triangle2->Rotation(AngleRotation2, trDegree);
     
            DrawBitmap();
            Key = 0;
            }
        }
    }
     
    //Méthode à déclarer dans la classe de TForm1, en public :
     
    void __fastcall TForm1::DrawBitmap()
    {
    if(Bitmap != NULL)
        {
        int we = ClientWidth;
        int he = ClientHeight;
        if(Bitmap->Width != we) Bitmap->Width = we;
        if(Bitmap->Height != he) Bitmap->Height = he;
     
        Bitmap->Canvas->Brush->Style = bsSolid;
        Bitmap->Canvas->Brush->Color = Color;
        Bitmap->Canvas->FillRect(Rect(0,0,we,he));
     
        Bitmap->Canvas->Pen->Style =psSolid;
        Bitmap->Canvas->Pen->Mode = pmCopy;
        //Le premier triangle
        Bitmap->Canvas->Pen->Color = clYellow;
        Triangle1->Draw(Bitmap->Canvas);
        //Le deuxième triangle
        Bitmap->Canvas->Pen->Color = clRed;
        Triangle2->Draw(Bitmap->Canvas);
        //On dessine le bitmap sur la form
        Canvas->Draw(0,0,Bitmap);
        }
    }
    En espérant que celà puisse t'aider !

    A plus !

Discussions similaires

  1. Rotation d'un cercle sur ses 3 axes
    Par neon29200 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 07/04/2014, 04h44
  2. Réponses: 4
    Dernier message: 16/05/2011, 17h06
  3. rotation d'un cercle
    Par mendezino dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/04/2009, 17h16
  4. Rotation autour d'un cercle?
    Par SoBaKa dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 13/03/2008, 09h17
  5. rotation rectangle cercle
    Par demss dans le forum Mathématiques
    Réponses: 9
    Dernier message: 11/02/2008, 03h58

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