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.
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.
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.
Salut !
Voir l'aide TCanvas::Polyline
Autre solution en utilisant TCanvas::MoveTo et TCanvas::LineTo :
A plus !
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]); }
les les points sont trop rapprochés, c une courbe ki a une forme ki ressemble a un sinusoide.
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 !
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.
Bien que l'on puisse dessiner un signal triangulaire d'une façon beaucoup plus simple,
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)); }
on le génère ici comme on le fait pour le sinus.
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 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)); }
Il faut utiliser les événments de la form, puisque Canvas dessine sur l'écran
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++; } }
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(); }En espérant que cela puisse t'aider !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void __fastcall TForm1::FormResize(TObject *Sender) //OnResize { Dessine(); }
A plus !
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.
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 :
Il faudra donc pour le graphisme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3TPoint S1; TPoint S2; TPoint PC; //Poignée unique
A l'avenir, ce serait bien de ne pas surcharger un sujet de discussion existant, avec tes propres questions !
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 plus !
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 :
Bref ca a l'air de marcher mais je trouve ça bizarre.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);
Merci pour l'astuce en tout cas!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager