Gambas France BETA


Pas de compte ? Incription

Tracer des fonctions en math??

12
AuteurMessages
Invité#1 Posté le 22/2/2010 à 16:54:00
Bonjour

je ne ssais comment faire
Comment faut il s'y prendre pour tracer une fonction math avec gambas
par ex si je veux qu'un graphe de la fonction ax²+bx+c
par ou dois je commencer, ya t'il un composant pour cela?

A+
jeanyvon#2 Posté le 22/2/2010 à 17:42:00
Gambas? Ma! Et gustoSalut,
Je ne crois pas qu'il y ait besoin d'un composant
Tu sais résoudre cet équation.
Tu sais donc dire à la machine de calculer toutes les valeur de y en faisant varier x. Pour s'amuser un peu on fait aussi varier les valeurs de a, b, c
Quoi de plus simple après pour tracer une courbe qui suit ces points.
Un fois que tu as ces coordonnées la méthode draw est parfaite. Il y a des exemples dans les exemples.

A+
JY
PS si tu ne sais pas résoudre une équation du second degrés ben là je sais pas....... :lol!:
Vieillir? On peut retarder mais pas y échapper!
Invité#3 Posté le 22/2/2010 à 17:58:00
merci
je vais voir si je m'en sors avec draw

a plus
spheris#4 Posté le 23/2/2010 à 11:26:00
Ternais,

si tu trouves la solution, met nous un morceau de code sur le forum !
A+
;)
Invité#5 Posté le 23/2/2010 à 11:31:00
ok pas de prob

je devrais commencer a y travailler cette après midi

a+
spheris#6 Posté le 23/2/2010 à 11:34:00
OK bon coding !
;)
jeanyvon#7 Posté le 23/2/2010 à 15:04:00
Gambas? Ma! Et gustoDésolé hier je n'avais pas le temps...
Si ça te plait je te donne le code:


bon c'est à l'envers mais il faut juste inverser les valeurs
A+
JY
Vieillir? On peut retarder mais pas y échapper!
Invité#8 Posté le 23/2/2010 à 17:10:00
salut jeanyvon

oui c'est super

je veux bien ton code

merci d'avance

tu le fais passer comment le code : ici sur le forum ou par mail?

JL
jeanyvon#9 Posté le 23/2/2010 à 17:22:00
Gambas? Ma! Et gustoBen voilà
dans ta forme il faut une listbox, une picturebox avec une drawarea collée dedans
ici la drawaera s'appelle aire (aire de dessin). elle fait 400 x 400
si tu veux modifier a,b,c ou des inputbox ou des entrées plus conventionnelles.

1
PUBLIC SUB dessin() DIM incoy1 AS FLOAT, incox1 AS FLOAT, a AS FLOAT = 2, b AS FLOAT = 5, c AS FLOAT = 3 DIM incoy2 AS FLOAT, incox2 AS FLOAT DIM unit AS FLOAT = aire.w / 100000 'pour faire varier la courbe entre x et y autrement on voit rien aire.Cleardraw.Begin(aire) FOR incox1 = 0 TO 400 STEP 10 incoy1 = (a * (incox1 ^ 2)) + (b * incox1) + c ListBox1.Add("y= " & incoy1 & " pour une valeur de x de " & incox1) ' incoy1 = incoy1 / 100 PRINT incoy1 draw.ForeColor = Color.red draw.Line(incox1, incoy1 * unit, incox2, incoy2 * unit) 'y croit tellement vite que ce n'est pas sa valeur qui sert..... incox2 = incox1 incoy2 = incoy1 NEXTdraw.EndEND
Vieillir? On peut retarder mais pas y échapper!
Invité#10 Posté le 23/2/2010 à 19:05:00
merci JeanYvon

je vais tester ton code et l'adapté pour mon prog
A+
spheris#11 Posté le 24/2/2010 à 10:21:00
Sans oublier de passer la propriété Cached à TRUE de la drawarea sinon on ne voit rien du tout !
;)



ton exemple nécessite un tuto.
Le voici en ligne.
http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=566

Merci JY
;)
jeanyvon#12 Posté le 24/2/2010 à 11:37:00
Gambas? Ma! Et gusto
Sans oublier de passer la propriété Cached à TRUE de la drawarea sinon on ne voit rien du tout !
;)
;)

Oui, j'avais oublié de la dire. :drunken:
merci
Le code n'est valable que pour : Y = AX²+BX+C
Si on change d'équation il faut changer la ligne qui génère Y
ça m'amuse des trucs comme ça :lol!:
JY
Vieillir? On peut retarder mais pas y échapper!
Invité#13 Posté le 24/2/2010 à 23:33:00
Bonjour ou Soir
Voilà , j'ai fait un bout de code, en partant de celui de JeanYvon

Mais j'ai décalé sur la droite de façon à avoir la courbe entière sur la Draw : partie positive et négative de x.
Donc mon centre de départ du dessin à été décalé au centre de la Draw

Mais j'ai un prob avec l'échelle que je n'arrive pas à adapter pour avoir une vision claire , et que les graduations coïncident avec les points

J'ai bien essayé le composant Chart, mais j'ai pas réussi du tout

Quelles critiques pour améliorées ?

A terme, les entrées de a b et c se feront sur une texte box bien sûr

Merci
JL

Il ya Deux boutons : un pour m'entrainer à l'écriture dans une drawing-Area, l'autre qui sert à déclencher l'écriture de la fonction dans la draw
un label qui reçoit les coordonnées du sommet



1
' Gambas class filePUBLIC SUB _new()'******************************************************************************************************************' c'est une sub routine constructeur de drawing process invocant la methode draw.begin et ajustant les parametres du programme'******************************************************************************************************************Draw.Begin(DrawingArea1)Draw.LineWidth = 2 ' set une ligne par default de 2 pixelsEND'*********************************************************************************************************************************'*********************************************************************************************************************************PUBLIC SUB Form_Open()' titre de la fenetre form a changé en drawing exemplesFMain.Text = " drawing exemples"END'*********************************************************************************************************************************'**********************************************************************************************************************************PUBLIC SUB DrawingArea1_Draw()END'**********************************************************************************************************************************'***************************************************Bouton QUITTER******************************************************************PUBLIC SUB QuitBtn_Click() Draw.End ' fermeture des drawing opérations ME.Close ' fermeture de la formEND'***********************************************************************************************************************************'***************************************************Bouton ECRIRE********************************************************************PUBLIC SUB TextBtn_Click()DIM counter AS Integer DrawingArea1.Refresh ' on nettoie la draw des anciennes ecritureDraw.ForeColor = Color.BlackDraw.Font.name = "Arial"Draw.Font.Bold = TRUEDraw.Font.Italic = FALSEDraw.Font.Size = "16" FOR counter = 0 TO 9 Draw.Text("exemple text", 10, 10 + 40 * counter, 100, 60) NEXTDraw.Font.size = "24" ' on change la taille de police et la couleurDraw.ForeColor = Color.Blue ' et on décale vers la droiteFOR counter = 0 TO 9Draw.Text("exemple text", 200, 10 + 40 * counter, 100, 60)NEXT END'************************************************************************************************************************************'***************************************************Bouton Equation******************************************************************PUBLIC SUB EquationBtn_Click()'****En partant du Code de JeanYvon sur: http: / / gambaslinux.forumactif.net / code - gambas - f1 / tracer - des - fonctions - en - math - t104.htm #967***** DIM y AS Float, x AS Float, a AS Float = -3, b AS Float = 100, c AS Float = -10 DIM y1 AS Float, x1 AS Float DIM unity AS Float = DrawingArea1.w / 10000 'pour faire varier la courbe entre x et y autrement on voit rien DIM unitx AS Float = DrawingArea1.H / 10000 DIM verif AS Integer ' pour la dérivée DIM xd AS Float, yd AS Float, xd1 AS Float, yd1 AS Float DIM Sommety AS Float ' pour graduation repère DIM graduationx AS Integer DIM graduationy AS Integer DrawingArea1.Refresh 'on rafraichit les dessins FOR x = -100 TO 100 'STEP 10 ' on met les valeurs de y dans la liste Box verif = verif + 1 y = (a * (x ^ 2)) + (b * x) + c ListBox1.Add("y= " & y & " pour une valeur de x de " & x) draw.ForeColor = Color.red IF verif = 1 THEN ' on sort de la boucle au premier passage, sinon y1=x1=0, donc la premiere ligne aura les coordonnées x1 = x ' (x,y, 0,0) et là vu que l'axe a été décalé on aurait une ligne partant de (0,0) allant à (x,y) le y1 = y ' le premier point draw.Line(x + 360, - (y * unity) + 300, x1 + 360, - (y1 * unity) + 300) GOTO etiquette END IF draw.Line(x + 360, - (y * unity) + 300, x1 + 360, - (y1 * unity) + 300) ' croit tellement vite que ce n'est pas sa valeur qui sert..... ' Draw.Point((x + DrawingArea1.W / 2), (- y + DrawingArea1.H / 2)) x1 = x y1 = y etiquette: NEXT '************************************************ Tracer la Tangente*************************************************************** ' On sait que : - En (0,-b/2a) la dérivée f'(x) = 2ax + b coupe l'axe des ordonnées ' - Equation Tangente : y = f'(a) ( x - a ) + f(a) = x * ( 2*a² + b ) + ( c - a^3 ) ' - avec f(x) = ax² + bx +c FOR xd = -100 TO 100 'STEP 10 ' on met les valeurs de y dans la liste Box draw.ForeColor = Color.Cyan Draw.LineWidth = 1 'yd = 118 * xd + 127 yd = xd * (2 * a ^ 2 + b) + (c - a ^ 3) draw.Line(xd + 360, (- yd * unity) + 300, xd1 + 360, (- yd1 * unity) + 300) NEXT '********************************************Tracer la tangente au sommet ********************************************************* ' Donc f'(x) = 0 en ( -b/2a ) ' coordonnées sommet :( (-b/2a), ((b² - 4 ac)/ 4a) ) ' Tracage d'un axe parallele aux abscisses ou tangente au sommet ( 0 , delta / 4a) draw.ForeColor = Color.Orange Draw.LineWidth = 2 Sommety = (b ^ 2 - (4 * a * c)) / (4 * a) Label1.Caption = "SOMMET : " & "x =" & Round((- b / (2 * a)), -2) & " " & "y =" & Round(Sommety, -2) draw.Line(0, (Sommety * unity + DrawingArea1.H / 2), 720, (Sommety * unity + DrawingArea1.H / 2)) '**************************************Ligne avant hors champ****************************************************************** draw.Line(0, 590, 720, 590) ' total H= 600 =>/2= 300 = axe abscisse '******************************************tracer le repère Orthonormé************************************************************ draw.ForeColor = Color.DarkBlue '*******tracer l'axe des Ordonnées************ draw.Line(DrawingArea1.W / 2, 10000, DrawingArea1.W / 2, 100000) '*******tracer l'axe des abscisses************* draw.Line(100000, DrawingArea1.H / 2, 10000, DrawingArea1.H / 2) '**************************************Graduer le repère orthonormé*********************************************************** draw.ForeColor = Color.Violet Draw.LineWidth = 1 'draw.Line(xd + 360, (- yd * unity) + 300, xd1 + 360, (- yd1 * unity) + 300) ' draw.Line(50 + 360, (- 1000 * unity) + 300, 50 + 360, (- 1000 * unity) + 300) ' Axe des abscisses FOR graduationx = -360 TO 360 STEP 10 draw.Line(graduationx + DrawingArea1.W / 2, (DrawingArea1.H / 2 - 5), graduationx + DrawingArea1.W / 2, (DrawingArea1.H / 2 + 5)) NEXT ' Axe des ordonnées FOR graduationy = -300 TO 300 STEP 10 draw.Line(DrawingArea1.W / 2 - 5, graduationy + (DrawingArea1.H / 2), DrawingArea1.W / 2 + 5, graduationy + (DrawingArea1.H / 2)) NEXT ' Croix jaune pour le centre Draw.LineWidth = 1 Draw.ForeColor = Color.Yellow Draw.Line(DrawingArea1.W / 2, DrawingArea1.H / 2 - 5, DrawingArea1.W / 2, DrawingArea1.H / 2 + 5) Draw.Line(DrawingArea1.W / 2 - 5, DrawingArea1.H / 2, DrawingArea1.W / 2 + 5, DrawingArea1.H / 2) draw.End END'**************************************************************************************************************************************
jeanyvon#14 Posté le 25/2/2010 à 07:48:00
Gambas? Ma! Et gustoSalut,
C'est une bidouille!
à moins d'avoir le talent d'un Benoit ou d'un Gambix qui pousse le code à fond. Moi je fais des essais en plus il faudrait adapter ton code en fonction de ta résolution d'écran.... Je ne peux pas t'aider, essaye, bidouille..... :geek: :scratch:
JY
Vieillir? On peut retarder mais pas y échapper!
manu#15 Posté le 25/2/2010 à 08:36:00
Avec Gambas ca roule !gb.chart est la solution car il fait tous ca très biens même beaucoup plus, car beaucoup de types de graphe sont pris en charge par le composant.

Ici, tu as des explications sur les rudiments de son utilisation. N'hesites pas à poser des questions si tu ne t'en sort pas..Wiki Gambas
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
12