[R] Performances de ma calculatrice
Posté : jeu. 05 mars 2015 19:10
par sozary
Bonjour!!
J'ai décidé de me mettre à la réalisation d'une calculatrice scientifique avec affichage de fonction!
J'ai fait un écran avec Xmax et Ymax valant 10, et Xmin et Ymin valant -10.
Pour tracer la fonction x^2, je mets 165.637 millisecondes.
Est-ce dans les normes? Si non, voici le code, n'hésitez pas à me proposer des améliorations notables!
Merci d'avance!
PS: Ne gère actuellement que les fonctions trigonométriques sauf arc, ainsi que les puissance ou pas, exemple: 2*x | x | 3 | 2*x^2 | x^3 | cos(x) |
J'ai décidé de me mettre à la réalisation d'une calculatrice scientifique avec affichage de fonction!
J'ai fait un écran avec Xmax et Ymax valant 10, et Xmin et Ymin valant -10.
Pour tracer la fonction x^2, je mets 165.637 millisecondes.
Est-ce dans les normes? Si non, voici le code, n'hésitez pas à me proposer des améliorations notables!
Merci d'avance!
PS: Ne gère actuellement que les fonctions trigonométriques sauf arc, ainsi que les puissance ou pas, exemple: 2*x | x | 3 | 2*x^2 | x^3 | cos(x) |
► Afficher le texte
Code : Tout sélectionner
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#include <GDIPlus.au3>
#include <String.au3>
Global $Fen1= 468,$fen2= 416
Global $XMin=-10,$XMax=10,$YMin=-10,$YMax=10,$scale=1,$Xunit=$fen1/($XMax-$XMin),$Yunit=$fen2/($YMax-$YMin)
#Region ### START Koda GUI section ### Form=
Global $Form2 = GUICreate("Calc", $Fen1, $fen2, 1100, 276)
Global $Form1 = GUICreate("Form1", 615, 437, 325, 246)
GUISetFont(12, 400, 0, "Century Gothic")
Global $Input1 = GUICtrlCreateInput("", 144, 88, 121, 29)
Global $Label1 = GUICtrlCreateLabel("Fonction y1:", 32, 88, 97, 25)
Global $Button1 = GUICtrlCreateButton("Génèrer", 48, 120, 75, 25)
Global $Button2 = GUICtrlCreateButton("Effacer", 40, 160, 99, 33)
GUISetState(@SW_SHOW,$Form2)
GUISetState(@SW_SHOW,$Form1)
_GDIPlus_Startup()
$graphHdl = _GDIPlus_GraphicsCreateFromHWND($Form2)
_GDIPlus_GraphicsClear($graphHdl, 0xFFFFFFFF) ; efface le plan et l'affiche de couleur noir
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
case $Button1
; MISE EN PLACE DE LA FENETRE ----------------------------------------------------------------
_DrawFen($graphHdl,$fen1,$fen2)
; ------------------------------------------------------------------------------------------------
$EQUATION=GUICtrlRead($Input1)
StringReplace($EQUATION,"x","x")
If @extended=0 Then
_GDIPlus_GraphicsDrawLine($graphHdl,0,($fen2/2)+(-$EQUATION*$Yunit),$fen1,($fen2/2)+(-$EQUATION*$Yunit))
Else
StringReplace($EQUATION,"^","^") ;Si il y a une puissance
If @extended=0 Then
StringReplace($EQUATION,"cos","cos") ;Si il y a un cos
If @extended=0 Then
StringReplace($EQUATION,"sin","sin") ;Si il y a un sin
If @extended=0 Then
StringReplace($EQUATION,"tan","tant") ;Si il y a un tan
If @extended=0 Then
$scale=1
Else
$scale=.01
EndIf
Else
$scale=.01
EndIf
Else
$scale=.01
EndIf
Else
$scale=.01
EndIf
Local $POINTS[0][2]
$k=0
$j=0
$time=TimerInit()
For $i=$XMin to $XMax step $scale
$exp=Execute(StringRegExpReplace($EQUATION,"[x]",$i))
$2exp=Execute(StringRegExpReplace($EQUATION,"[x]",$i+1))
If $exp<0 Then
$exp=$YMax+Abs($exp)
Else
$exp=$YMax-$exp
EndIf
If $2exp<0 Then
$2exp=$YMax+Abs($2exp)
Else
$2exp=$YMax-$2exp
EndIf
;_GDIPlus_GraphicsDrawLine($graphHdl,$k,$exp*$Yunit,$k+$Xunit,$2exp*$Yunit)
_GDIPlus_GraphicsDrawRect($graphHdl,$k,$exp*$Yunit,1,1)
Local $TOINSER[1][2]
$TOINSER[0][0]=$k
$TOINSER[0][1]=$exp*$Yunit
_ArrayAdd($POINTS,$TOINSER)
$k+=$Xunit*$scale
$j+=$Yunit*$scale
Next
;_ArrayDisplay($POINTS)
For $i=0 to UBound($POINTS)-2
_GDIPlus_GraphicsDrawLine($graphHdl,$POINTS[$i][0],$POINTS[$i][1],$POINTS[$i+1][0],$POINTS[$i+1][1])
Next
MsgBox(0,"",TimerDiff($time))
EndIf
Case $Button2
_GDIPlus_GraphicsClear($graphHdl, 0xFFFFFFFF)
_DrawFen($graphHdl,$fen1,$fen2)
EndSwitch
WEnd
_GDIPlus_GraphicsDispose($graphHdl)
_GDIPlus_Shutdown()
Func _DrawFen($graphHdl,$fen1,$fen2)
_GDIPlus_GraphicsDrawLine($graphHdl,0,$fen2/2,$fen1,$fen2/2)
_GDIPlus_GraphicsDrawLine($graphHdl,$fen1/2,0,$fen1/2,$fen2)
For $i=0 to $fen1 Step $Xunit
_GDIPlus_GraphicsDrawLine($graphHdl,$i,$fen2/2,$i,($fen2/2)+5)
_GDIPlus_GraphicsDrawLine($graphHdl,$i,$fen2/2,$i,($fen2/2)-5)
Next
For $i=0 to $fen2 Step $Yunit
_GDIPlus_GraphicsDrawLine($graphHdl,$fen1/2,$i,($fen1/2)-5,$i)
_GDIPlus_GraphicsDrawLine($graphHdl,$fen1/2,$i,($fen1/2)+5,$i)
Next
EndFunc