Traceur de courbes représentatives des fonctions y = f(x)
Page 1 sur 1
Traceur de courbes représentatives des fonctions y = f(x)
Traceur de courbes représentatives des fonctions y = f(x)
Le programme utilise EVAL.DLL, développée par Jean_Debord pour évaluer une expression mathématique.
Vous pouvez télécharger cette DLL à partir de la page de Jean_debord :
http://www.unilim.fr/pages_perso/jean.debord/panoramic/panoramic.htm
Le programme utilise EVAL.DLL, développée par Jean_Debord pour évaluer une expression mathématique.
Vous pouvez télécharger cette DLL à partir de la page de Jean_debord :
http://www.unilim.fr/pages_perso/jean.debord/panoramic/panoramic.htm
- Code:
rem ============================================================================
rem Traceur de courbes réprésentatives des fonctions
rem Par papydall
rem ============================================================================
rem Utilise "EVAL.DLL", bibliothèque développée par Jean Debord pour évaluer une
rem expression mathématique.
rem Vous pouvez télécharger EVAL.DLL à partir du site de son auteur :
rem ______________________________________________________________________
rem | |
rem | http://www.unilim.fr/pages_perso/jean.debord/panoramic/panoramic.htm |
rem |______________________________________________________________________|
rem ============================================================================
' Opérateurs reconnus par la DLL :
rem + addition
rem - soustraction
rem * multiplication
rem / division
rem \ division entière
rem % modulo
rem ^ exponentiation
rem > décalage à droite
rem < décalage à gauche
rem & AND logique
rem | OR logique
rem $ XOR logique
rem ! NOT logique
rem @ IMP logique
rem = EQV logique
rem ============================================================================
' Ordre de priorité :
rem ! , & , | , $ , = , @ , ^ , +- (plus et moins unaires) , */ , \ , % , < > , +- (addition et soustraction)
rem L utilisation des parenthèses modifie l ordre de priorité : les parenthèses sont prioritaires.
rem ============================================================================
' Variables
rem la DLL peut utiliser jusqu à 26 variables de A à Z.
rem ============================================================================
' Fonctions disponibles dans la DLL
rem abs : valeur absolue
rem sgn : signe
rem int : partie entière
rem sqrt : racine carrée
rem exp : exponentielle
rem ln : logarithme naturel (néperien)
rem log10 : logarithme décimal
rem fact : factorielle
rem rnd : nombre aléatoire appartenant à [0,1)
rem deg : degré ---> radian
rem rad : radian ---> degré
rem sin : sinus
rem cos : cosinus
rem tan : tangente
rem asin : arc sinus
rem acos : arc cosinus
rem atan : arc tangente
rem atan2 : atan2(y,x) = atan(y/x) dans les 4 quadrants
rem sinh : sinus hyperbolique
rem cosh : cosinus hyperboloique
rem tanh : tangente hyperboloique
rem asinh : sinus hyperbolique inverse
rem acosh : cosinus hyperbolique inverse
rem atanh : tangente hyperbolique inverse
rem gamma : fonction gamma (factorielle généralisée)
rem erf : error function (distrinution normale)
rem ============================================================================
' Fonctions exportées par la DLL
rem EVAL.DLL exporte 3 fonctions :
rem 1) InitFunc : initialise les fonctions intégrées dans la DLL et rétourne leur nombre
rem Appellez cette fonction avant d utiliser toute fonction intégrée.
rem 2) SetVariable : Cette fonction affecte une valeur à une variable et rend le
rem numéro d ordre de la variable (1 pour A, 2 pour B etc)
rem 3) Eval : Cette fonction évalue une expression passée comme chaîne de caractères
rem et retourne l un des codes d erreur suivant:
rem 0 : aucune erreur
rem 1 : signe inattendu
rem 2 : parenthèses non équilibrées
rem 3 : variable non définie
rem 4 : fonction non définie
rem ============================================================================
' Exemple d'utilisation de la DLL
rem dim x,i%,var$,exp$,result
rem dll_on "eval.dll"
rem i% = dll_call0("InitFunc") : ' initialiser les fonctions de la DLL
rem var$ = "x" : ' définir X comme variable
rem x = 123 : ' affecter une valeur à la variable X
rem i% = dll_call2("SetVariable",adr(var$),adr(x)) : ' affecter la valeur à la variable
rem exp$ = "cos(x)^2 + sin(x)^2" : ' définir une expression mathématique sous forme de chaine de caractères
rem i% = dll_call2("Eval", adr(exp$), adr(result)) : ' Evaluer l'expression et affecter le résultat à la variable result
rem i% contient le code erreur (0 si aucune erreur)
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================
Init()
GUI()
end
rem ============================================================================
SUB Init()
label Clic
dim x,y,y$,g$,h$,i$,ret%,var$,exp$,err
dim xe,ye,xmin,xmax,ymin,ymax,largeur,hauteur
var$ = "x"
dll_on "eval.dll" : ' Indiquez le chemin d'accès à EVAL.DLL
ret% = dll_call0("InitFunc")
width 0,1200: height 0,700
top 0,(screen_y - height(0))/2 : left 0,(screen_x - width(0))/2
caption 0,"Traceur de courbes répresentatives des fonctions"
application_title "Traceur de courbes répresentatives des fonctions"
END_SUB
rem ============================================================================
SUB GUI()
Container_Fonctions()
Container_Axes()
Container_Intervalle()
Container_Dim_Grafic()
button 90 : top 90, 600 : left 90, 50 : font_bold 90 : font_size 90,16
width 90,100 : caption 90,"Exécuter" : on_click 90,Clic
button 91 : top 91, 600 : left 91, 200 : font_bold 91 : font_size 91,16
width 91,100 : caption 91,"Quitter" : on_click 91,Clic
button 92 : top 92,600 : left 92,350 : font_bold 92 : font_size 92,16
width 92,100 : caption 92,"Aide" : on_click 92,Clic
picture 100 : top 100,20 : left 100,560 : 2d_target_is 100 : print_target_is 100 : hide 100
END_SUB
rem ============================================================================
Clic:
select number_click
case 90 : Executer()
case 91 : Quitter()
case 92 : Aide()
end_select
return
rem ============================================================================
SUB Container_Fonctions()
container 10 : top 10,50 : left 10,20 : width 10,500 : height 10,200
color 10, 150,150,150 : font_color 10,255,255,255 : font_bold 10
font_size 10,16 : caption 10,"Fonctions"
check 11 : parent 11,10 : top 11,40 : left 11,10 : font_color 11,0,0,255
color 11, 150,150,150 : caption 11," f(x) = " : mark_on 11
edit 12 : parent 12,10 : top 12,30 : left 12,20 + width(11) : width 12,370
font_color 12,0,0,0 : text 12,"cos(x) + sin(sqrt(abs(x)))"
check 13 : parent 13,10 : top 13,80 : left 13,10 : font_color 13,255,0,0
color 13,150,150,150 : caption 13," g(x) = " : mark_on 13
edit 14 : parent 14,10 : top 14,70 : left 14,20 + width(13) : width 14,370
font_color 14,0,0,0 : text 14,"sin(x)/x"
check 15 : parent 15,10 : top 15,120 : left 15,10 : font_color 15,0,255,0
color 15,150,150,150 : caption 15," h(x) = " : mark_on 15
edit 16 : parent 16,10 : top 16,110 : left 16,20 + width(15) : width 16,370
font_color 16,0,0,0 : text 16,"1/x"
check 17 : parent 17,10 : top 17,160 : left 17,10 : font_color 17,255,255,0
color 17,150,150,150 : caption 17," i(x) = " : mark_on 17
edit 18 : parent 18,10 : top 18,150 : left 18,20 + width(17) : width 18,370
font_color 18,0,0,0 : text 18,"1 - 2*sin(x)/sinh(x)"
END_SUB
rem ============================================================================
SUB Container_Axes()
container 20 : top 20,70 + height(10) : left 20,20 : width 20,200 : height 20,100
color 20, 150,150,150: font_color 20,255,255,255 : font_bold 20
font_size 20,16 : caption 20,"Axes"
check 21 : parent 21,20 : top 21,40 : left 21,10 : font_color 21,0,0,0 : mark_on 21
color 21, 150,150,150 : caption 21," Abscisse (X) " : width 21,150
check 22 : parent 22,20 : top 22,60 : left 22,10 : font_color 22,0,0,0 : mark_on 22
color 22, 150,150,150 : caption 22," Ordonnée (Y) " : width 22,170
END_SUB
rem ============================================================================
SUB Container_Intervalle()
container 40 : top 40,90 + height(10) + height(20) : left 40,20 : width 40,500 : height 40,150
color 40, 150,150,150 : font_color 40,255,255,255 : font_bold 40
font_size 40,16 : caption 40,"A tracer sur l'intervalle"
alpha 41 : parent 41,40 : top 41,40 : left 41,25 : font_bold 41 : font_color 41,0,0,0
caption 41, "X minimum : "
edit 42 : parent 42,40 : top 42,30 : left 42,25 + width(41) : font_bold 42
width 42,60 : font_color 42,0,0,0 : text 42,"-10"
alpha 43 : parent 43,40 : top 43,70 : left 43,25 : font_bold 43 : font_color 43,0,0,0
caption 43,"Y minimum : "
edit 44 : parent 44,40 : top 44,70 : left 44,25 + width(43) : font_bold 44
width 44,60 : font_color 44,0,0,0 : text 44,"-2"
alpha 45 : parent 45,40 : top 45,40 : left 45,250 : font_bold 45 : font_color 45,0,0,0
caption 45, "X maximum : "
edit 46 : parent 46,40 : top 46,35 : left 46,250 + width(45) : font_bold 46
width 46,60 : font_color 46,0,0,0 : text 46,"10"
alpha 47 : parent 47,40 : top 47,70 : left 47,250 : font_bold 47 : font_color 47,0,0,0
caption 47, "Y maximum : "
edit 48 : parent 48,40 : top 48,70 : left 48,250 + width(47) : font_bold 48
width 48,60 : font_color 48,0,0,0 : text 48,"2"
END_SUB
rem ============================================================================
SUB Container_Dim_Grafic()
container 50 : top 50,70 + height(10) : left 50,45 + width(20) : width 50,275 : height 50,200-50-50
color 50, 150,150,150 : font_color 50,255,255,255 : font_bold 50
font_size 50,16 : caption 50,"Dimensions du graphique"
alpha 51 : parent 51,50 : top 51,30 : left 51,5 : font_bold 51 : font_color 51,0,0,0
caption 51, "Largeur (en pixels) : "
edit 52 : parent 52,50 : top 52,25 : left 52,5+width(51) : font_bold 52
width 52,50 : font_color 52,0,0,0 : text 52,"600"
alpha 53 : parent 53,50 : top 53,70: left 53,5 : font_bold 53 : font_color 53,0,0,0
caption 53, "Hauteur (en pixels) : "
edit 54 : parent 54,50 : top 54,65 : left 54,5+width(53) : font_bold 54
width 54,50 : font_color 54,0,0,0 : text 54,"600"
END_SUB
rem ============================================================================
SUB Executer()
Verification()
if checked(21) = 1 then Axe_X()
if checked(22) = 1 then Axe_Y()
if checked(11) = 1 then y$ = text$(12) : 2d_pen_color 0,0,255 : Tracer(y$)
if checked(13) = 1 then g$ = text$(14) : 2d_pen_color 255,0,0 : Tracer(g$)
if checked(15) = 1 then h$ = text$(16) : 2d_pen_color 0,255,0 : Tracer(h$)
if checked(17) = 1 then i$ = text$(18) : 2d_pen_color 255,255,0 : Tracer(i$)
END_SUB
rem ============================================================================
SUB Verification()
if (numeric(text$(42)) = 0) or (numeric(text$(44)) = 0)
message "!!! ERREUR !!!" + chr$(13) + "Vérifiez X-minimum et/ou Y-minimum"
exit_sub
end_if
if val(text$(42)) >= val(text$(46))
message "!!! ERREUR !!!" + chr$(13) + "X-minimum doit être inférieure à X-maximum"
exit_sub
end_if
if (numeric(text$(46)) = 0) or (numeric(text$(48)) = 0)
message "!!! ERREUR !!!" + chr$(13) + "Vérifiez X-maximum et/ou Y-maximum"
exit_sub
end_if
if val(text$(44)) >= val(text$(48))
message "!!! ERREUR !!!" + chr$(13) + "Y-minimum doit être inférieure à Y-maximum"
exit_sub
end_if
if (numeric(text$(52)) = 0) or (numeric(text$(54)) = 0)
message "ERREUR !!!" + chr$(13) + "Vérifiez la largeur et/ou la hauteur"
exit_sub
end_if
width 100,val(text$(52))+5 : height 100,val(text$(54))+5 : show 100
' xc = width(100)/2 : yc = height(100)/2
xmin = val(text$(42)) : xmax = val(text$(46))
ymin = val(text$(44)) : ymax = val(text$(48))
largeur = val(text$(52)) : hauteur = val(text$(54))
color 100,100,50,20
END_SUB
rem ============================================================================
SUB Quitter()
if message_warning_yes_no("Vous voulez vraiment quitter ?") = 1 then terminate
END_SUB
rem ============================================================================
SUB Axe_X()
dim_local p1,y0,i,pas
pas = largeur / (xmax-xmin)
y0 = hauteur / (ymax-ymin) : p1 = hauteur + y0 * ymin
2d_pen_color 200,200,200 : font_color 100,255,255,255 : 2d_fill_color 100,50,20
2d_line 0,p1,largeur,p1
for i = 0 to largeur step pas
2d_line i,p1-5,i,p1+5
if (xmin+i/pas) <> 0 then print_locate i,p1+10 : print int(0.5+xmin+i/pas)
next i
END_SUB
rem ============================================================================
SUB Axe_Y()
dim_local q1,x0 ,i,pas
pas = hauteur / (ymax-ymin)
x0 = largeur / (xmax-xmin) : q1 = 0-x0*xmin
2d_pen_color 200,200,200 : : font_color 100,255,255,255 : 2d_fill_color 100,50,20
2d_line q1,0,q1,hauteur
for i = 0 to hauteur step pas
2d_line q1-5,i,q1+5,i
if (ymax-i/pas) <> 0 then print_locate q1-15,i-5 : print int(0.5+ymax - i/pas)
next i
END_SUB
rem ============================================================================
' Passage de coordonnées utilisateur aux coordonnées écran
SUB CU2CE(xr,yr)
dim_local a1,b1,a2,b2
a1 = largeur/(xmax-xmin) : b1 = (0-largeur*xmin)/(xmax-xmin)
a2 = 0 - hauteur/(ymax-ymin) : b2 = (0-hauteur*ymin)/(ymax-ymin)
xe = a1 * xr + b1 : ye = a2 * yr + b2
END_SUB
rem ============================================================================
SUB Fonction(y$,x)
dim_local erreur$
ret% = dll_call2("SetVariable",adr(var$),adr(x))
ret% = dll_call2("Eval", adr(y$), adr(y))
select ret%
case 0 : ' Aucune erreur
case 1 : erreur$ = "Signe inattendu"
case 2 : erreur$ = "Parenthèses non équilibrées"
case 3 : erreur$ = "Division par zéro"
case 4 : erreur$ = "Variable non définie"
case 5 : erreur$ = "Fonction non définie"
end_select
if ret% <> 0
message "!!! ERREUR !!!" + chr$(13) + erreur$ + chr$(13) + "dans la fonction" + chr$(13) + y$
err = 1
end_if
END_SUB
rem ============================================================================
SUB Tracer(y$)
err = 0
Fonction(y$,xmin)
if err > 0 then end
CU2CE(xmin,y) : 2d_poly_from xe,ye
for x = xmin to xmax step pi/180
Fonction(y$,x) : y = y-(ymin+ymax)
CU2CE(x,y) : 2d_poly_to xe,ye : display
next x
END_SUB
rem ============================================================================
SUB Aide()
dim_local t$,l$
l$ = chr$(13)
t$ = " Le programme utilise EVAL.DLL, bibliothèque développée par Jean Debord" + l$
t$ = t$ + "pour évaluer une expression mathématique." + l$
t$ = t$ + "Le programme permet de tracer sur le même graphique jusqu'à 4 courbes" + l$
t$ = t$ + "de couleurs différentes." + l$
t$ = t$ + "Vous pouvez saisir le texte de vos fonctions dans Fonctions" + l$
t$ = t$ + "Pour que le programme trace la (ou les) courbe(s) vous devez cocher" + l$
t$ = t$ + "les CHECKs correspondants." + l$
t$ = t$ + "Si vous désirez tracer les axes, cocher leur CHECK." + l$
t$ = t$ + "Vous pouvez modifier les dimensions du graphique ainsi que" + l$
t$ = t$ + "l'intervalle du tracé dans les EDITs" + l$ + l$
t$ = t$ + "Les Fonctions disponibles dans la DLL et que vous pouvez utiliser dans ce programme" +l$
t$ = t$ + " abs : valeur absolue " + l$
t$ = t$ + " sgn : signe " + l$
t$ = t$ + " int : partie entière" + l$
t$ = t$ + " sqrt : racine carrée" + l$
t$ = t$ + " exp : exponentielle " + l$
t$ = t$ + " ln : logarithme naturel (néperien)" + l$
t$ = t$ + " log10 : logarithme décimal" + l$
t$ = t$ + " fact : factorielle " + l$
t$ = t$ + " rnd : nombre aléatoire appartenant à [0,1)" + l$
t$ = t$ + " deg : degré ---> radian " + l$
t$ = t$ + " rad : radian ---> degré " + l$
t$ = t$ + " sin : sinus" + l$
t$ = t$ + " cos : cosinus" + l$
t$ = t$ + " tan : tangente" + l$
t$ = t$ + " asin : arc sinus " + l$
t$ = t$ + " acos : arc cosinus" + l$
t$ = t$ + " atan : arc tangente" + l$
t$ = t$ + " atan2 : atan2(y,x) = atan(y/x) dans les 4 quadrants" + l$
t$ = t$ + " sinh : sinus hyperbolique" + l$
t$ = t$ + " cosh : cosinus hyperboloique " + l$
t$ = t$ + " tanh : tangente hyperboloique" + l$
t$ = t$ + " asinh : sinus hyperbolique inverse" + l$
t$ = t$ + " acosh : cosinus hyperbolique inverse" + l$
t$ = t$ + " atanh : tangente hyperbolique inverse " + l$
t$ = t$ + " gamma : fonction gamma (factorielle généralisée)" + l$
t$ = t$ + " erf : error function (distrinution normale)" + l$
message t$
END_SUB
rem ============================================================================
Sujets similaires
» Courbes polaires
» Courbes en coordonnées polaires
» Courbes de Bézier cubiques
» Les Courbes de Bézier cubiques
» DES MATHS POUR L'ESTHETIQUE DES COURBES
» Courbes en coordonnées polaires
» Courbes de Bézier cubiques
» Les Courbes de Bézier cubiques
» DES MATHS POUR L'ESTHETIQUE DES COURBES
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Lun 1 Jan - 0:25 par Papydall-Admin
» A ceux qui célèbre Noël, bonnes fêtes
Dim 24 Déc - 10:49 par Papydall-Admin
» Joyeux Noël et Bonne Année
Ven 8 Déc - 1:34 par Papydall-Admin
» Planets of the Solar System : Tilts and Spins
Lun 20 Mar - 15:43 par Papydall-Admin
» Bonne Année 2023
Sam 31 Déc - 1:39 par Papydall-Admin
» Fractals - Mandelbrot
Ven 21 Aoû - 22:51 par Papydall-Admin
» Convertisseur Décimal ---> Binaire, Octal, Hexadécimal, ...
Mer 21 Nov - 1:08 par Papydall-Admin
» Balises {USER...}
Lun 19 Nov - 22:12 par Papydall-Admin
» Useful Dog
Ven 6 Avr - 14:25 par Papydall-Admin