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

 Delphi Discussion :

Dessin d'ellipse inclinée


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Dessin d'ellipse inclinée
    Bonjour à tous,

    Je dois tracer sur un bmp le périmètre d'une ellipse dont je connais les coordonnées en X et Y du centre, les deux longueurs des diagonales et son angle d'inclinaison. La rotation se fait par rapport au cente de l'ellipse

    j'ai déjà testé la méthode Arc en utilisant la matrice de rotation pour déterminer la position des points après rotation mais il semblerai que cette méthode ne permet de tracer que des ellipses horizontales. Même soucis avec la méthode ellipse qui en plus remplie l'intérieur de l'ellipse (après j'ai pas cherché à supprimer le remplissage vu que l'ellipse n'était pas bonne).

    Si vous avez une solution ou un début de piste n'hésitez pas, je suis preneur.

    Edit : Peut-on tracer une courbe conique sous delphi à partir de l'équation?

    Merci d'avance.

    Nyio

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Pour commencer avec le cas d'une ellipse horizontale centrée en x=0 et y=0 on sait que dans ce cas on a :
    x = a.cosinus(t)
    y = b.sinus(t)
    avec a = (largeur/2) >= b = (Hauteur/2)

    Donc pour une Ellipse centrée en xo,yo et inclinée de Incli Radians les coordonnées d'un point du contour sont de la forme :

    x = xo + a.cosinus(t + Incli)
    y = yo + b.sinus(t + Incli)

    Y'a plus qu'à tracer cela par exemple en 360 points par exemple reliés par LineTo(x,y) ou bien mémorisés dans un array of tPoint nommé MonEllipse et comme un array de tPoint c'est rien d'autre qu'un polygone ça peut se tracer en une seule ligne avec MonCanvas.Polygon(MonEllipse).

    MonCanvas désigne ici soit le canvas de la Form soit le canvas de n'importe quoi comme celui d'un BitMap par exemple.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2004
    Messages : 4 517
    Points : 10 150
    Points
    10 150
    Par défaut
    Citation Envoyé par Nyio- Voir le message
    Edit : Peut-on tracer une courbe conique sous delphi à partir de l'équation?
    Eh bien si tu as une fonction paramétrique du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function CurveFunc(T: Extended): TPoint;
    begin
      // Ici tu mets ce que tu veux, genre :
      Result.X := Round(Cos(T));
      Result.Y := Round(Sin(T));
    end;
    Tu peux toujours dessiner la courbe qui correspond en faisant :
    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
    type
      TCurveFunc = function(T: Extended): TPoint;
     
    procedure DrawCurve(Canvas: TCanvas; CurveFunc: TCurveFunc;
      Min: Extended = 0.0; Max: Extended = 1.0; Step: Extended = 1.0e-3);
    var
      T: Extended;
    begin
      T := Min;
      Canvas.MoveTo(CurveFunc(T));
     
      while T <= Max do
      begin
        T := T + Step;
        Canvas.LineTo(CurveFunc(T));
      end;
    end;
    Enfin quelque chose comme ça.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    mai 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2010
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Merci Gilbert pour ton aide, avec tes explications j'ai réussi à obtenir la bonne forme de mon ellipse (il manquait la rotation par rapport au centre donc je l'ai ajoutée) et merci aussi à sjrd même si je ne me suis pas servi de ta méthode.

    Voila comment j'ai fait pour obtenir ce que je voulais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Rx et Ry sont les longueurs de mes demi-diagonales
    // phi mon angle de rotation
    for i:= 0 to 360 do begin
    //-- Calcul du vecteur 
        Rxx := Rx * sin(i*PI/180+phi);
        Ryy := Ry * cos(i*PI/180+phi);
    //-- On applique la matrice de rotation par rapport au centre de coordonnées Cx,Cy au vecteur
        xx :=  Cx + (Rxx*cos(Phi) -  Ryy*sin(phi));
        yy :=  Cy + (Rxx*sin(Phi) +  Ryy*cos(phi));
    //-- On mémorise les coordonnées du point
        MonEllipse[i].x := xx;
        MonEllipse[i].y := yy;
    end;
    Polygon(MonEllipse); // On trace notre ellipse

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    A Nyio- Concernant la méthode de Sjrd : il faut savoir que l'utilisitation du type TCurveFunc = function(T: Extended): TPoint;

    permet de déclarer toute une série de fonctions, par exemple : une pour le tracé d'une ellipse, une pour le tracé d'un coeur, une pour le tracé d'une rosace, et ainsi de suite et que l'on passe ensuite en tant que paramètre à la
    procedure DrawCurve(Canvas: TCanvas; CurveFunc: TCurveFunc; ...); qui serait utilisée quelle que soit la courbe.

    Mais si tu n'as besoin que d'un seul type de courbe le coup du Polygon(MonEllipse); est largemant suffisant.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    décembre 2004
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : décembre 2004
    Messages : 438
    Points : 128
    Points
    128
    Par défaut
    Salut Nyio,
    Quand j'utilise ton code, je remarque que la pente de l'éllipse est trop forte par rapport à la pente renseignée.
    Cela se remarque immédiatement quand tu dessines une éllipse de pente 1 (45°) et de petit rayon = 0
    La droite dessinée ne respecte pas la pente!
    Je ne trouve pas le bug?!?
    Tu as une idée?
    Merci,
    PhilLu

  7. #7
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 2 033
    Points : 2 854
    Points
    2 854
    Par défaut
    @PhilLu :

    Bonjour,

    je pense que c'est parce que tu ne mets pas l'angle en radians ?

    A+

    Charly

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Je pense que Charly910 a raison, car j'ai testé avec le code suivant où Ry= Petit rayon = 0 et Phi:=DegToRad(45) et ça me sort bien un droite inclinée à 45° :

    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
    procedure TfrmGen.Button1Click(Sender: TObject);
    // Rx et Ry sont les longueurs de mes demi-diagonales
    // phi mon angle de rotation
    var
      Rx, Ry, Rxx, Ryy, Phi,si,co: Extended;
      i: integer;
      MonEllipse: array of tPoint;
      Cx, Cy: integer;
    begin
      Rx := 150; Ry := 0; Cx := 200; Cy := 200;
      SetLength(MonEllipse, 360); Phi:=DegToRad(45);
      for i := 0 to 359 do begin
        //-- Calcul du vecteur
        SinCos(i * PI / 180 + phi, si,co);
        Rxx := Rx * si;
        Ryy := Ry * co;
        //-- On applique la matrice de rotation par rapport au centre de coordonnées Cx,Cy
        SinCos(Phi, si,co);
        MonEllipse[i].x := round(Cx + (Rxx * co - Ryy * si));
        MonEllipse[i].y := round(Cy + (Rxx * si + Ryy * co));
      end;
      with ImageFond.Picture.bitmap.canvas do begin
        pen.color := clNavy; pen.width := 1;
        Polygon(MonEllipse); // On trace notre ellipse
      end;
      ImageFond.rePaint;
    end;
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    décembre 2004
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : décembre 2004
    Messages : 438
    Points : 128
    Points
    128
    Par défaut
    En fait ma pente est de 1 (par exemple) càd 100% car calculée via y=ax+b
    (a = pente)
    Donc je dois convertir des % en radians? (x100)

  10. #10
    Membre émérite
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    décembre 2006
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : décembre 2006
    Messages : 2 033
    Points : 2 854
    Points
    2 854
    Par défaut
    Bonjour,

    la pente a de ta droite d'équation y = ax + b est la tangente de l'angle Phi (angle d'inclinaison sur l'axe des x)

    avec Phi en radians - par exemple si Phi = 45 ° = Pi/4 radians ==> a = 1

    si tu veux Phi en fonction de a, il faut faire :

    ce qui donne Phi en radian - pour le convertir en degrés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       PhiDegre := Phi * 180 / PI
    donc Phi = PI/4 rd ==> 45 °

    A+

    Charly

  11. #11
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    décembre 2004
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : décembre 2004
    Messages : 438
    Points : 128
    Points
    128
    Par défaut
    Toujours ce problème d'inclinaison...
    dans la formule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Rxx := Rx * sin(i*PI/180+phi); 
     Ryy := Ry * cos(i*PI/180+phi);
    j'ai bien utilisé
    cad
    a étant la pente selon y=ax+b
    Je continue à voir des ellipses qui ont une pente négative et qui me semblent positive
    Je ne suis pas convaincu du résultat!
    voici mon code:
    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
     
    //-- Calcul du vecteur
    //If sommexmx2<>0 then Rxx := grandrayon * sin(i*PI/180+(sommexmxymy/sommexmx2));
    // If sommexmx2<>0 then  Ryy := petitrayon * cos(i*PI/180+(sommexmxymy/sommexmx2));
    //-- On applique la matrice de rotation par rapport au centre de coordonnées Cx,Cy au vecteur
    // If sommexmx2<>0 then   xx :=  mx + Rxx*cos(ARCTAN(sommexmxymy/sommexmx2)) -  Ryy*sin(ARCTAN(sommexmxymy/sommexmx2));
    // If sommexmx2<>0 then   yy :=  my + Rxx*sin(ARCTAN(sommexmxymy/sommexmx2)) +  Ryy*cos(ARCTAN(sommexmxymy/sommexmx2));
     
    for i:= 0 to 360 do begin
    //-- Calcul du vecteur
    If StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])<>0 then
    begin
    Rxx := grandrayon * sin(i*PI/180+ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])));
    Ryy := petitrayon * cos(i*PI/180+ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])));
     
    //-- On applique la matrice de rotation par rapport au centre de coordonnées Cx,Cy au vecteur
     xx :=StrToFloat( EllipsesCalc.Cells[1,ellipsescalc.rowcount-1])
     + Rxx*cos(ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])))
     -  Ryy*sin(ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])));
     
     yy :=  StrToFloat(EllipsesCalc.Cells[2,ellipsescalc.rowcount-1])
     + Rxx*sin(ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])))
     +  Ryy*cos(ARCTAN(StrToFloat(ellipsescalc.cells[10,ellipsescalc.rowcount-2])/StrToFloat(ellipsescalc.cells[8,ellipsescalc.rowcount-2])));
    //-- On mémorise les coordonnées du point
        ellipsesGrid.cells[1,i+1] :=FloatToStr(xx);
        ellipsesGrid.Cells[2,i+1] :=FloatToStr(yy);
    ellipsescalc.cells[10,ellipsescalc.rowcount-2] est égal à 6.0923
    ellipsescalc.cells[8,ellipsescalc.rowcount-2] est égal à 11.5440
    le grand rayon est de 0.928
    le petit rayon est de 0.516
    au vu de l'ellipse tracée je ne suis pas convaincu de la pente de l'ellipse par rapport au nuage de point que j'observe
    voir ce-dessous:
    Nom : ellipse_problème_pente.jpg
Affichages : 1236
Taille : 4,7 Ko

    J'ai tenté des tas de variantes mais rien n'y fait


    Merci d'avance

  12. #12
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    PhilLU : Toujours ce problème d'inclinaison...j'ai bien utilisé Phi := Arctan(a)
    C'est peut-être ça la cause.
    Pour obtenir un angle dans le quadrant correct il faut utiliser la fonction ArcTan2(Y/X) qui renvoie un angle compris entre -Pi et Pi radians.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. Dessiner une ellipse en JS
    Par akrogames dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/10/2009, 11h54
  2. [Débutant] Dessiner une ellipse
    Par miss_angel dans le forum MATLAB
    Réponses: 9
    Dernier message: 11/09/2009, 08h33
  3. Dessiner une ellipse et une fléche
    Par Viscapon dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 17/06/2008, 22h55
  4. Dessiner plusieur Ellipses
    Par stfanny31 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/05/2008, 17h39
  5. Réponses: 3
    Dernier message: 29/06/2005, 14h29

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