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 :

dessiner une courbe à partir d'un tableau de valeur [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 21
    Points
    21
    Par défaut dessiner une courbe à partir d'un tableau de valeur
    je cherche un programme qui permet de dessiner une courbe ds builder a partir d'un tableau de valeurs avec la méthodes TCanvas de preférable.

  2. #2
    Membre confirmé Avatar de kurul1
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    933
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 933
    Points : 466
    Points
    466
    Par défaut
    Tu as poster 2 fois le même message !

    Sinon, tes points sont assez proches l'un de l'autre ou il sont assez éloigné ?

    Car si'ils sont relativement proche, tu peut dessiner des lignes entre chaque points de ton tableau de valeur et tu auras l'illusion d'une courbe.

  3. #3
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Voir l'aide TCanvas::Polyline

    Autre solution en utilisant TCanvas::MoveTo et TCanvas::LineTo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int Points[nbPoints][2];//on suppose 0 pour X et 1 pour Y
     
    Canvas->MoveTo(Points[0][0], Points[0][1]);
    for(int j = 1; j < nbPoints; j++)
        {
        Canvas->LineTo(Points[j][0], Points[j][1]);
        }
    A plus !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    les les points sont trop rapprochés, c une courbe ki a une forme ki ressemble a un sinusoide.

  5. #5
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Le fait que les points soient rapprochés n'a aucune importance dans ce
    que j'ai donné. On peut dessiner un cercle de cette manière (par segments).

    Tu peux aussi utiliser TCanvas::Pixels pour fixer la couleur d'un point mais le
    résultat final peut être désastreux (peu visible par endroits).

    Sinon, il existe d'autres primitives (Arc, Ellipse, et les courbes de Bézier,
    avec PolyBezier et PolyBezierTo).

    A titre perso, je trace mes courbes avec MoveTo et LineTo, sans qu'il y ait de problèmes !

    A plus !

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Voici un exemple plus concret.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <math.h> //sin, fmod
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define pi 3.14159265358979
    #define Pi 6.28318530717958 // 2 * pi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double Frequence;
    double Sample;
    double Amplification = 100.0;

    Les deux fonctions qui suivent calculent et renvoient la valeur d'un signal dans
    l'intervalle [-1, 1]. Ces deux signaux sont calculés à l'aide de leur fréquence,
    à l'instant (t) exprimé en terme d'échantillons (Sample) et pour une fréquence
    d'échantillonnage fixée ici à 44.1 KHz.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double Sinus()
    {
    return sin(fmod(Sample * Frequence * Pi / 44100.0, Pi));
    }
    Bien que l'on puisse dessiner un signal triangulaire d'une façon beaucoup plus simple,
    on le génère ici comme on le fait pour le sinus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double Triangle()
    {
    double d = fmod(Sample * Frequence * Pi / 44100.0, Pi);
    d = (pi - d) / pi;
    if(d < 0.0) d = -d;
    return (1.0 - (d * 2.0));
    }
    Si on utilise cette méthode, il faudra la déclarer en public dans la class de TForm1

    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
    void __fastcall TForm1::Dessine()
    {
    double s;
    int axe = ClientHeight / 2;
     
    //Effacer la form
     
    Canvas->Brush->Color = Color; //pour éviter le scintillement
    Canvas->FillRect(Rect(0,0, ClientWidth, ClientHeight));
    //On dessine l'axe horizontal
    Canvas->Pen->Color = clGray;
    Canvas->MoveTo(0,axe); Canvas->LineTo(Width, axe);
     
    //Ici on va représenter deux courbes
    //Si l'on veut modifier (zoom) l'échelle du temps (x), il suffit de le faire à l'aide
    //de la variable Sample  : Sample = Sample + Zoom; (Zoom = [1,2,4,8,16...]) 
    //A note que la courbe est dessinée avec inversion des y avec axe - s
     
    //On dessine la courbe générée par Sinus
    Canvas->Pen->Color = clBlue;
    //On positionne le premier point
    Sample = 0;
    Frequence = 200.0;
    s = Sinus() * Amplification;
    Canvas->MoveTo(0, axe - s); 
    Sample++; //ou travailler avec un zoom
    for(int j = 1; j < Width; j++)
        {
        //On trace les autres points
        s =  Sinus() * Amplification;
        Canvas->LineTo(j, axe - s); Sample++;
        }
     
    //On dessine la courbe générée par Triangle
    Canvas->Pen->Color = clGreen;
    //On positionne le premier point
    Sample = 0;
    s =  Triangle() * Amplification;
    Canvas->MoveTo(0, axe - s); 
    Sample++; //ou travailler avec un zoom
    for(int j = 1; j < Width; j++)
        {
        //On trace les autres points
        s = Triangle() * Amplification;
        Canvas->LineTo(j, axe - s); Sample++;
        }
    }
    Il faut utiliser les événments de la form, puisque Canvas dessine sur l'écran
    dans la zone client de l'objet, ici il s'agit de la form.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormPaint(TObject *Sender) //OnPaint
    {
    Dessine();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormResize(TObject *Sender) //OnResize
    {
    Dessine();
    }
    En espérant que cela puisse t'aider !

    A plus !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Je me permets d'intervenir sur ce topic.

    Je cherche en vain a dessiner des arcs de cercles.

    J'utilise pour cela (enfin j'essaye) la fonction PolyBezier, avec comme parametres les 3 points de l'arc de cercle et le nombre de points (3).

    Les 1er et 3eme points (début et arrivée) sont corrects, cependant le 2nd point ne correspond pas (y'a t'il une astuce?).

    Je vous demande car je commence a m'arracher les cheveux a ce sujet, et je n'ai rien trouvé en utilisant la fonction Rechercher.

  8. #8
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Pour la méthode TCanvas::PolyBezier il te faut 4 points pour dessiner la courbe.
    On peut se limiter à travailler avec 3 points, en confondant les deux poignées de la courbe de Bézier.
    On a donc :
    - deux points pour limiter la courbe
    - 1 point pour lui donner la courbure

    Donc pour l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TPoint S1;
    TPoint S2;
    TPoint PC; //Poignée unique
    Il faudra donc pour le graphisme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TPoint Point = new TPoint[4];
    Points[0] = S1;
    Points[1] = PC; 
    Points[2] = PC; // <<< Les deux poignées sont confondues
    Points[3] = S2;
    Canvas->PolyBezier(Points, 4);
    delete [] Points;
    A l'avenir, ce serait bien de ne pas surcharger un sujet de discussion existant, avec tes propres questions !

    A plus !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Désolé de l'avoir surchargé, enfin il a 6mois d'âge.

    Je reste assez circonspect, l'arc a l'air de se dessiner à peu prés correctement, cependant j'ai un tableau de 4 TPoint, et si je mets 4 en parametre dans la fonction PolyBezier il m'envoie valser, je dois mettre 3, tout en ayant mon tableau de 4 TPoint :

    TPoint points[4];
    points[0] = Point(100,100);
    points[1] = Point(150,200);
    points[2] = Point(150,200);
    points[3] = Point(200,100);

    PaintBox1->Canvas->PolyBezier(points,3);
    Bref ca a l'air de marcher mais je trouve ça bizarre.

    Merci pour l'astuce en tout cas!

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/09/2014, 00h08
  2. tracer une courbe à partir d'un tableau
    Par Antoineba dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 29/04/2010, 17h34
  3. dessiner une courbe à partir d'un fichier
    Par olfasupcom dans le forum Langage
    Réponses: 5
    Dernier message: 30/05/2007, 13h15
  4. Dessiner une courbe à partir d'un nuage de points
    Par Bil-Prog dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 26/01/2007, 04h06
  5. [JGraph]dessiner une courbe à partir de données
    Par marwaza22 dans le forum 2D
    Réponses: 1
    Dernier message: 16/11/2006, 17h16

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