将字符串转换为数学公式

时间:2014-01-29 13:32:33

标签: c# plot

我想构建一个3d绘图应用程序。 我已经成功地建造了抽屉,它可以绘制任何功能。 抽屉接收z作为输入并为每个点设置它。

我有3Dpoint课程:

class 3Dpoint
{
public double x,y,z

public 3Dpoint(double a, double b)
{
this.x = a;
this.y = b;
this.z =0;
}

}

随着应用程序的继续,它定义了越来越多的点。 对于每个点,它设置x和y,然后计算z:

for(int a ... )
 for(int b ....)
 { 
  3Dpoint p = new 3Dpoint(a,b);
  p.z = Math.sin(p.x) * Math.Cos(p.y); // for instance
 }

现在而不是z计算是永久性的,我想让用户设置它,输入将是这样的:

z= cos(x) ^ sqrt(sin(y)) + 6

现在我已经构建了一个解析器,但它非常慢,并且需要他充足的时间才能完成,当我为每个点运行它时,他需要永远完成它。

代码:http://codeviewer.org/view/code:3bcc

知道如何改进我的解析器?知道我可以使用的任何免费在线解析器代码吗?

TNX。 :)

3 个答案:

答案 0 :(得分:1)

查看NCalc,可能正是您正在寻找的内容。

答案 1 :(得分:1)

查看声称

Symbolism
  

在C#中自动简化代数表达式

通过以下测试:

var x = new Symbol("x");
var y = new Symbol("y");
var z = new Symbol("z");
Func<int, Integer> Int = (n) => new Integer(n);
AssertIsTrue(x + x == 2 * x);
AssertIsTrue(x + x == 2 * x);
AssertIsTrue(x + x + x == 3 * x);
AssertIsTrue(5 + x + 2 == 7 + x);
AssertIsTrue(3 + x + 5 + x == 8 + 2 * x);
AssertIsTrue(4 * x + 3 * x == 7 * x);
AssertIsTrue(x + y + z + x + y + z == 2 * x + 2 * y + 2 * z);

它应该通过简化来提高速度。

PS。我自己没有用过。

答案 2 :(得分:0)

如果可以使用解析数学表达式的语法,您可以检查您最喜欢的解析器。由于这是解释解析如何工作的最常见示例,因此您不应该遇到任何问题。请查看IronyCoco/RGOLDANTLR(已提及NCalc),LLLPGSprache

不像更流行的解析器那么成熟,即使我的NLT套件包括简单的数学计算器 - 输入是文本,输出是数字(数学评估的结果)。