Шпаргалка по ZedGraph. Как изменять существующие кривые
Пример показывает каким образом можно получать и изменять точки, по которым построен график без необходимости сохранять точки в отдельных переменных.
Сначала строятся два графика, показанных на первом скриншоте, а затем после нескольких нажатий на кнопку "Изменить кривые" они постепенно становятся такими, какими они показаны на втором скриншоте.


Все примеры объединены в одном solution для Visual Studio 2005 и написаны на языке C#, скачать их можно отсюда.
Проект в примере - ChangeCurves
public partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent ();
DrawGraphs ();
}
/// <summary>
/// Функция для рисования
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private double f (double x)
{
if (x == 0)
{
return 1;
}
return Math.Sin (x) / x;
}
/// <summary>
/// Нарисовать изначальные графики
/// </summary>
private void DrawGraphs ()
{
// Получим панель для рисования
GraphPane pane = zedGraph.GraphPane;
// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
pane.CurveList.Clear ();
// Два списка точек для двух графиков
PointPairList list1 = new PointPairList ();
PointPairList list2 = new PointPairList ();
double xmin = -50;
double xmax = 50;
// Заполняем списи точек
for (double x = xmin; x <= xmax; x += 0.01)
{
list1.Add (x, f (x));
list2.Add (x, f (x * 0.5));
}
// Добавим две кривые, но не будем сохранять указатели на них
pane.AddCurve ("", list1, Color.Blue, SymbolType.None);
pane.AddCurve ("", list2, Color.Red, SymbolType.None);
zedGraph.AxisChange ();
zedGraph.Invalidate ();
}
/// <summary>
/// Обработчик нажатия на кнопку
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void changeBtn_Click (object sender, EventArgs e)
{
GraphPane pane = zedGraph.GraphPane;
// Изменим существующие кривые.
// Доступ к кривым осуществляется по индексам
// (Есть еще перегруженный оператор this[] для доступа к кривым по меткам)
ModifyCurve (pane.CurveList[0], 1.1);
ModifyCurve (pane.CurveList[1], 0.9);
// Обновим оси и сам график
zedGraph.AxisChange ();
zedGraph.Invalidate ();
}
/// <summary>
/// Изменение кривой. Координата X остается неизменной, а координата Y умножается на k
/// </summary>
private static void ModifyCurve (CurveItem curve, double k)
{
// Создадим новый список точек для кривой
PointPairList newlist = new PointPairList ();
// Пробежимся по всем точкам на кривой
for (int i = 0; i < curve.Points.Count; i++)
{
// Заполним новый список точек
newlist.Add (curve.Points[i].X, curve.Points[i].Y * k);
}
// Заменим список точек в кривой
curve.Points = newlist;
}
}
{
public Form1 ()
{
InitializeComponent ();
DrawGraphs ();
}
/// <summary>
/// Функция для рисования
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private double f (double x)
{
if (x == 0)
{
return 1;
}
return Math.Sin (x) / x;
}
/// <summary>
/// Нарисовать изначальные графики
/// </summary>
private void DrawGraphs ()
{
// Получим панель для рисования
GraphPane pane = zedGraph.GraphPane;
// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
pane.CurveList.Clear ();
// Два списка точек для двух графиков
PointPairList list1 = new PointPairList ();
PointPairList list2 = new PointPairList ();
double xmin = -50;
double xmax = 50;
// Заполняем списи точек
for (double x = xmin; x <= xmax; x += 0.01)
{
list1.Add (x, f (x));
list2.Add (x, f (x * 0.5));
}
// Добавим две кривые, но не будем сохранять указатели на них
pane.AddCurve ("", list1, Color.Blue, SymbolType.None);
pane.AddCurve ("", list2, Color.Red, SymbolType.None);
zedGraph.AxisChange ();
zedGraph.Invalidate ();
}
/// <summary>
/// Обработчик нажатия на кнопку
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void changeBtn_Click (object sender, EventArgs e)
{
GraphPane pane = zedGraph.GraphPane;
// Изменим существующие кривые.
// Доступ к кривым осуществляется по индексам
// (Есть еще перегруженный оператор this[] для доступа к кривым по меткам)
ModifyCurve (pane.CurveList[0], 1.1);
ModifyCurve (pane.CurveList[1], 0.9);
// Обновим оси и сам график
zedGraph.AxisChange ();
zedGraph.Invalidate ();
}
/// <summary>
/// Изменение кривой. Координата X остается неизменной, а координата Y умножается на k
/// </summary>
private static void ModifyCurve (CurveItem curve, double k)
{
// Создадим новый список точек для кривой
PointPairList newlist = new PointPairList ();
// Пробежимся по всем точкам на кривой
for (int i = 0; i < curve.Points.Count; i++)
{
// Заполним новый список точек
newlist.Add (curve.Points[i].X, curve.Points[i].Y * k);
}
// Заменим список точек в кривой
curve.Points = newlist;
}
}
Вернуться к остальным примерам
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.