编辑:基本上我需要从用comboBox
函数绘制的Draw()
中选择的函数(x / 2,..)。
我需要编写一个绘制函数图的代码。我有一位代表:
delegate float Function(float x);
我的绘图功能:
void Draw(Function f)
{
Graphics g = CreateGraphics();
for (float i = -100; i < 100; i+=0.1f)
{
g.DrawString(".", new Font("arial", 10), Brushes.Black, i+200, ClientSize.Height-(f(i) + 100));
}
}
在MainFormLoad上我加载了我的数组(这可能不是这样做的正确方法,但我有点迷失了怎么办)。 arr
包含我想要绘制的函数。
void MainFormLoad(object sender, EventArgs e)
{
string[] arr;
arr = new string[] {"x / 2", "50 * Math.Sin(x / 50.0)"};
var arr = from item in arr select item;
foreach (var i in arr)
{
comboBox1.Items.Add(i);
}
}
然后在ButtonClick上我尝试调用它:
void Button1Click(object sender, EventArgs e)
{
//Draw(x => x / 2) It should work this way
Draw(x => (Combobox1. something here ?));
}
答案 0 :(得分:0)
我知道你评论过你不想要外部库,但是当我读到这篇文章时我刚刚完成了答案。所以,就是这样。您可以使用Ncalc,它非常易于使用,请查看
class Program
{
static void Main(string[] args)
{
var strFunc = "10000/x";
for (var i = 1; i < 10000; i++)
{
var strFuncRplacement = strFunc.Replace("x", i.ToString());
var e = new Expression(strFuncRplacement);
Console.WriteLine(e.Evaluate());
}
Console.ReadLine();
}
}
您只需安装nuget包和using指令
即可using NCalc;
通过这种方式,您可以节省大量精力和代码行
希望它可以帮到你
答案 1 :(得分:0)
我不确定我是否正确理解了这个问题,但我认为你可以这样做:
而不是
void Draw(Function f)
使用
void Draw(Func<double, double> f)
而不是
arr = new string[] {"x / 2", "50 * Math.Sin(x / 50.0)"};
使用
var arr = new Func<double, double>[] {(double x) => x/2, (double x) => Math.Sin(x)};
答案 2 :(得分:0)
有什么理由将函数声明为字符串类型而不是函数类型?
如果不是,则将数组arr更改为Function数组并使用Functions启动它。
如果是,则无法进行,因为您无法仅使用c#中的标准库将字符串转换为c#代码。