Как построить график в windows forms c
Перейти к содержимому

Как построить график в windows forms c

  • автор:

Как построить график функции в windows forms c#?

Мне нужно нарисовать график функции циссоиды Диокла. 5ddbe46979c66974066310.png
5ddbe501ccf07555150652.png
Так как я не очень понимаю как эту функцию вставить в windows forms c#, я использовал уравнение циссоиды в прямоугольной системе координат:
5ddbe4e9ab30b483198733.png
Вот мой код:

public Form1() < InitializeComponent(); int a = 4, m; for (int i = 1; ichart1.Series[0].Points.AddXY((i), (i*i*i)/m); > >

5ddbe560cabbf535337883.png

К сожалению, получается совсем не то, что нужно:

Я думаю, что проблема в том, как я записываю функцию. Может ли кто-то помочь мне решить это?

  • Вопрос задан более трёх лет назад
  • 17854 просмотра

Комментировать
Решения вопроса 2

Дык, а корень кто будет извлекать?
А так у вас строится y=x*x*x/(2*a-x). Кстати, выражение знаменателя тоже зачем-то у вас делится на 2.

Ответ написан более трёх лет назад
Нравится 2 2 комментария
HEDAX @HEDAX Автор вопроса

5ddbfb963c687452130221.png

Я исправил на:
public Form1() InitializeComponent();
int a = 4, m;
for (int i = 1; i <50; i++) m = ((2 * a) - i);
if (m == 0) m = 1;
>
chart1.Series[0].Points.AddXY((i), ((i*i*i)/m)/2);
>
>
Но все равно получается не так, как нужно:

HEDAX, Ну, а корень квадратный почему не извлекли?

FoggyFinder

Foggy Finder @FoggyFinder

Тут у вас сразу несколько ошибок:

1. Нужно явно приводить к double иначе при делении двух int получите тоже целое.
2. Вы берете очень большие границы. Рост знаменателя намного превышает скорость роста числителя. Сами посмотрите: возведите 50 в куб, что получите? График вы конечно построите, но наглядности будет немного.

Что более важно: ваш отрезок OA = 2*a, а это значит что ваша правая граница точно должна быть меньше чем 2*a;

3. Посмотрите как задана функция — в виде квадрата. Извлекая корень вы должны не забывать про нижнюю ветку — ту которую дают отрицательные значения y.
Насколько мне известно возможности стандартного контрола довольно ограничены — вам придется заносить значения во вторую линию.

Собирая все вместе, попробуйте что-то вроде такого:

double a = 3; double step = 0.1; for (double x = 0; x < 2 * a - 1; x += step) < var n = x * x * x; var d = 2 * a - x; chart1.Series[0].Points.AddXY(x, Math.Sqrt(n / d)); chart1.Series[1].Points.AddXY(x, -Math.Sqrt(n / d)); >

Объекты Graphics и Drawing в Windows Forms

Общеязыковая среда выполнения (CLR) использует расширенную реализацию интерфейса графических устройств Windows (GDI) под названием GDI+. С помощью GDI+ можно создавать графические элементы, рисовать текст и управлять графическими изображениями в виде объектов. Интерфейс GDI+ отличается высоким быстродействием и удобен в использовании. GDI+ можно использовать для отрисовки графических изображений в формах и элементах управления Windows Forms. Хотя GDI+ нельзя использовать непосредственно в веб-формах, графические изображения можно выводить через элемент управления веб-сервера Image.

В этом разделе представлены разделы по основам программирования с использованием GDI+. Хотя он не является полным справочником, в нем содержатся сведения об объектах Graphics, Pen, Brush и Color и способах выполнения таких задач, как рисование фигур, создание текста, отображение рисунков. Дополнительные сведения см. в разделе Справочник по GDI+.

Если вы хотите немедленно приступить к работе, см. статью Приступая к программированию графики. Она содержит разделы, посвященные использованию кода для рисования линий, фигур, текста и других элементов в формах Windows Forms.

В этом разделе

Общие сведения о графике
Общие сведения об управляемых классах, связанных с графикой.

Управляемый код GDI+
Сведения об управляемых классах GDI+.

Использование управляемых графических классов
Демонстрируется выполнение различных задач с помощью управляемых классов GDI+.

Ссылка

System.Drawing
Предоставляет доступ к основным графическим функциям GDI+.

System.Drawing.Drawing2D
Расширенные функциональные возможности для создания двухмерной и векторной графики.

System.Drawing.Imaging
Предоставляет расширенные графические функции GDI+.

System.Drawing.Text
Предоставляет расширенный набор типографических функций GDI+. Классы в этом пространстве имен позволяют создавать и использовать коллекции шрифтов.

Связанные разделы

Рисование и отрисовка пользовательского элемента управления
Подробные сведения о способах написания кода для рисования элементов управления.

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Построить график c#

Для начала вам будет достаточно стандартного класса Chart, хотя есть и сторонние компоненты для построения красивых графиков, но мне кажется, что сначала лучше разобраться со стандартным контролом. В документации на MSDN есть довольно подробный Tutorial. Основные моменты покажу в коде, подробности в официальной документации.

class ChartForm : Form < public ChartForm() < //создаем элемент Chart Chart myChart = new Chart(); //кладем его на форму и растягиваем на все окно. myChart.Parent = this; myChart.Dock = DockStyle.Fill; //добавляем в Chart область для рисования графиков, их может быть //много, поэтому даем ей имя. myChart.ChartAreas.Add(new ChartArea("Math functions")); //Создаем и настраиваем набор точек для рисования графика, в том //не забыв указать имя области на которой хотим отобразить этот //набор точек. Series mySeriesOfPoint = new Series("Sinus"); mySeriesOfPoint.ChartType = SeriesChartType.Line; mySeriesOfPoint.ChartArea = "Math functions"; for (double x = -Math.PI; x //Добавляем созданный набор точек в Chart myChart.Series.Add(mySeriesOfPoint); > > 

Вот собственно минимум кода для рисования графика на форме. Здесь не приведены ни настройки осей координат и сетки, ни другие графические рюшечки которые поддерживает данный контрол, т.к. примеры применения практически всех возможностей этого контрола есть в официальной документации, ссылка выше.

Вам нужно вычисление многочлена вынести в отдельную функцию. Это можно сделать например так

double Polynom(double x, double[] coefficients) < double y = 0.0; double currentX = 1.0; for(int i = 0; ireturn y; > 

И подставить ее вместо Math.Sin в моем примере.

Средства построения графиков для .NET

Не так давно пришлось столкнуться с тривиальной задачей — найти решение, которое позволит рендерить рисунки графиков для .NET. Сразу оговорюсь, что меня интересовали только линейные графики. Камнем преткновения, который подтолкнул к переделыванию уже существующего решения (это были графики, встроенные в rdlc отчеты), было быстродействие. В целом, к искомому решению были предъявлены такие требования:

  1. Необходимо оставить данную оптимизацию незамеченной для конечного пользователя, следовательно, решение должно быть широко настраиваемым, чтобы, в конечном счете, выглядеть так же, как и предшественник.
  2. Работать быстро (ну понятно, пользователи не любят ждать).
  3. Желательно, быть бесплатным или с открытым исходным кодом. Покупка не стала бы большой проблемой, найди я отличное платное решение, но начать лучше с open source.
Что было сделано?

Погуглив, выяснилось, что существует достаточно много вариантов для решения данной задачи, и все они достаточно сильно отличаются по многим параметрам (размер сообщества, скорость работы, удобство). В процессе выбора решения было опробовано 8 бесплатных вариантов:

  • DisLin. Кроссплатформенная библиотека (UNIX, Linux, FreeBSD, OpenVMS, Windows, Mac OSX и MS-DOS). Чрезвычайно мощная, гибкая, действительно стоит того, чтобы написать отдельную статью только о ней. Может быть, немного уступает своим конкурентам по степени читабельности кода (использует классический функциональный подход), но зато, благодаря этому, может быть легко портирована практически на любой язык. Имеет ванильные торты порты на C, C++, Fortran 77, Fortran 90, Perl, Python, Ruby, Tgl, GCL (порт на C# — обычная библиотека с импортированными функциями). Бесплатная для некоммерческого использования.
  • Google Chart Sharp. Обертка над Google Chart API для С#. На хабре уже были статьи о нем, поэтому в двух словах: бесплатный (с ограничением 50000 тыс. вызовов в день), работает очень шустро, присутствуют основные параметры для кастомизации. Среди плюсов: возможность использовать везде, где есть подключение к интернету, независимость от используемого языка / ОС. Основной минус — это, естественно, дополнительный round-trip данных по сети (если график Вам нужен ещё на сервере), что замедляет процесс.
  • Microsoft Chart Controls. Нативный функционал от Microsoft, который был представлен общественности в далеком 2008 году. К тому времени уже существовал ряд решений от сторонних разработчиков, но это не помешало Ms Chart Controls быстро завоевать популярность среди разработчиков. И не удивительно, ведь они поставлялись с .NET framework, имели удачную архитектуру, были легко настраиваемыми и привлекательными на вид. По скорости уступают остальным, но, тем не менее, работают тоже вполне прилично.
  • NPlot. Ещё одна open source библиотека. Правда, не самая быстрая и популярная — информацию по ней можно найти в Интернете, хотя и не так много, как, например, по Microsoft Chart Controls. Тем не менее, поигравшись с ней, у меня осталось довольно приятное послевкусие.
  • OxyPlot. «Живой» кроссплатформенный open source, где можно даже зарепортить баг, на который, скорее всего, отреагируют. Доступен также в NuGet. Есть соответствующие контролы для WPF/Silverligth, WinForms, Metro. Плюшки, вроде экспорта напрямую в OpenXml и Pdf. Если Вам необходимо не «минутное» решение и возможность поправить его под себя, это решение для Вас.
  • ZedGraph. Также «живой» open source, прямой конкурент для OxyPlot. По количеству поддерживаемых платформ (только Windows) и технологий (только WinForms и ASP .NET) уступает ему, но очень симпатичный и один из самых быстрых. Отличный выбор, если Вам надо «просто красивый график» и больше ничего.
  • WebChart. Бесплатный предшественник Microsoft Chart Controls. Насколько я вижу, мертвый с 2004 года. У него чуть более убогий функционал в сравнении с остальными решениями, но, так как он имеет некоторые внешние отличия от остальных, может быть вполне полезен.
  • OpenMinded. Беплатный вариант от пользователя OpenMinded. Выглядит красиво. О производительности судить трудно, так как я не нашел возможности рендерить результирующий рисунок иначе как на жесткий диск. Но поскольку проэкт открытый, любой желающий может его доделать под себя, уверен — это не проблема.

Ещё в самом начале я решил, что надо собрать как можно больше вариантов в одном месте и протестить их на быстродействие, а уже после этого было очень жалко выбрасывать в корзину проделанную работу. Поэтому было решено оформить эту статейку и выложить то, что получилось, на GitHub. Таким образом, если возникла необходимость, Вы можете настроить каждое решение под себя и сразу же его проверить. Лично мне очень не хватало такой статьи в начале. Может быть, исходники вызовут улыбку у гуру, но новичкам, которые только вникают в .NET и ASP, они однозначно будут очень полезны.
Для сравнения скорости работы берутся дефолтные настройки графика, указывается разрешение выходного рисунка и ему скармливается фиксированное количество точек. Каждое решение прогоняется несколько раз, и в качестве реальной скорости берется среднее. Опять же, это достаточно субъективно, и, если Вы можете предложить более красивый подход, я с интересом выслушаю.
На моем ПК (Intel Core I5 3.10 GHz, 8gb ОЗУ, Windows 7 x64) вышло следующее распределение скорости работы:

Решение Количество итераций Суммарное время (сек) Среднее время на одну итерацию (сек)
1 Dislin charts 5 1.9071907 0.38143814
2 Zed Graph 5 2.750275 0.550055
3 NPlot 5 3.1833183 0.63666366
4 Web Chart Control 5 5.130513 1.0261026
5 Microsoft Chart Controls 5 6.8456845 1.3691369
6 Oxy Plot 5 7.0067006 1.40134012
7 Open minded plot 5 8.257 1.6514
8 Google Sharp charting 5 9.8049804 1.96099608

Для различных входных параметров (разрешение изображения, количество точек на графике, параметры ПК, скорость интернета, фаза Луны и т.д.) результаты немного отличаются, поэтому Вы можете протестировать быстродействие у себя.
Я специально не делал глубокое сравнения фич и возможностей кастомизации, так как это довольно субъективная информация, которая сильно зависит от конкретной задачи. При необходимости, каждый желающий может провести полчаса, подебажить, посмотреть архитектуру решений, прикинуть, насколько легко их настроить под конкретные требования.
Если кто-то знает ещё бесплатные решения для графиков под .NET, которые пропущены в статье, — пишите в комментариях, и я постараюсь их добавить.

upd — (добавил решение от OpenMinded)
upd2 — (включил DevExpress в опрос)

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *