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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 343
    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 343
    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 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

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