MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Построение графика произвольной функции c#"
Answer 796077
Зачем искать какие-то библиотеки, если это легко можно реализовать с помощью стандартных средств WinForms: для построения графиков использовать Chart, а для вычисления выражений - скажем, JavaScript в невидимом WebBrowser. Конечно, можно задействовать средства динамической компиляции и вычислять выражения на C#, но, я думаю, с JavaScript попроще будет.
Данный пример позволяет построить график функции, задаваемой любым JS-выражением:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Globalization; using System.Text; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace WinFormsTest { public partial class Form1 : Form { protected WebBrowser wb; public Form1() { InitializeComponent(); //инициализируем WebBrowser для вычислений wb = new WebBrowser(); wb.ScriptErrorsSuppressed = true;//убрать на этапе отладки, чтобы видеть ошибки //подгатавливаем JS-код для вычисления произвольного выражения string js = @"function execute(script){return eval(script);}"; wb.DocumentText = "<html><head><script type=\"text/javascript\">"+ js+"</script></head><body>Hello World</body></html>"; } /// <summary> /// Построение графика функции /// </summary> /// <param name="ch">Элемент управления Chart</param> /// <param name="expression">Математическое выражение функции от аргумента x в JavaScript-синтаксисе</param> /// <param name="x_min">Начало интервала значений аргумента</param> /// <param name="x_max">Конец интервала значений аргумента</param> /// <param name="dx">Шаг изменения аргумента</param> public void PlotGraph(Chart ch,string expression, double x_min, double x_max,double dx) { DataTable dt = new DataTable(); dt.Columns.Add("x", typeof(Double)); dt.Columns.Add("y", typeof(Double)); DataRow row; double x; string s; object y; //создаем культуру, совместимую с представлением чисел в JS CultureInfo culture = new CultureInfo( CultureInfo.CurrentCulture.Name); culture.NumberFormat.NegativeSign = "-"; culture.NumberFormat.NumberDecimalSeparator = "."; //создаем таблицу значений for (x = x_min; x < x_max; x += dx) { row = dt.NewRow(); row["x"] = x; //подгатавливаем выражение для JS s = "var x=" + x.ToString(culture) + "; " + expression + ";"; //вычисляем выражение y = wb.Document.InvokeScript("execute",new object[] { s }); //преобразуем результат из строки в Double row["y"] = Convert.ToDouble(y, culture); dt.Rows.Add(row); } //добавляем ряд в Chart ch.DataSource = dt; Series ser = new Series(); ser.Name = expression; ser.XValueMember = "x"; ser.YValueMembers = "y"; ser.ChartType = SeriesChartType.Line; ch.Series.Clear(); ch.Series.Add(ser); } private void button1_Click(object sender, EventArgs e) { //пример использования PlotGraph(chart1, "Math.sin(x)+0.3*Math.sin(15*x)", 0.0, Math.PI * 2, 0.1); } } }
Если перенастроить WebBrowser на новую версию IE через реестр, можно и прямо в нем графики строить, через HTML5 Canvas.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.