3 votes

Conversion d'une chaîne de caractères en fonction

Je souhaite intégrer dans mon application la possibilité de dessiner des fonctions mathématiques. La bibliothèque de traçage que j'utilise (OxyPlot) offre une aide précieuse à cet égard. Voir cet exemple :

y = ax³ + bx² + cx + d = 0

est tracée de cette manière :

new FunctionSeries( x => a*x*x*x + b*x*x + c*x + d, /* other stuff, spacing, number of points, etc */ )

Les fonctions trigonométriques sont traitées de la même manière :

   y = sin(3x) + 5cos(x)

es

   new FunctionSeries(x => Math.Sin(3*x) + 5*Math.Cos(x) , ....);

Je serais très heureux si quelqu'un pouvait me guider dans la conversion entre un chaîne de caractères (écrit dans une boîte de texte par exemple) et l'appel d'une fonction méthode qui a à l'intérieur la syntaxe indiquée.

EDIT : le premier paramètre du FunctionSeries(a, ....) a es Func<double, double>

EDIT2 : Existe-t-il un moyen de dire au compilateur, hé, croyez-moi "x => 5*x*x" est un Func, prenez-le au pied de la lettre

quelque chose comme :

Func<double, double> f = (Func<double, double>)myString;

0voto

Sturm Points 1579

J'ai ici une solution partielle :

        var expresionData = new List<DataPoint>();
        Regex pattern = new Regex("[x]");

        for (int i = 0; i < 100; i++)
        {
            string a = pattern.Replace(ExpresionString, i.ToString());
            NCalc.Expression exp = new NCalc.Expression(a);
            expresionData.Add(new DataPoint(i,Double.Parse(exp.Evaluate().ToString())));
        }

Je fais un petit tour de passe-passe : Je transforme chaque 'x' de la chaîne tapée en i, puis j'évalue l'expression et j'ajoute le point. C'est assez lent. Je suis toujours très intéressé par la question initiale :

Comment transformer une chaîne de caractères en Func<double, double > (ou faire en sorte que le compilateur le prenne au pied de la lettre).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X