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

Все примеры объединены в одном solution для Visual Studio 2005 и написаны на языке C#, скачать их можно отсюда.
Проект в примере - WindowsCoord
public partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent ();
// Подпишемся на событие, возникающее при нажатии кнопки мыши
// Обратите внимание, что подписываемся на событие MouseDownEvent, а не MouseDown
zedGraph.MouseDownEvent +=
new ZedGraphControl.ZedMouseEventHandler (zedGraph_MouseDownEvent);
DrawGraph ();
}
/// <summary>
/// Обработчик события нажатия на кнопку мыши
/// </summary>
/// <returns>Метод возвращает true, если нужно запретить дальнейшую встроенную обработку события (показ контекстного меню, начало выделения и т.п.), и false, если обработка события должна быть продолжена</returns>
bool zedGraph_MouseDownEvent (ZedGraphControl sender, MouseEventArgs e)
{
GraphPane pane = zedGraph.GraphPane;
// Координаты, которые переданы в событие
Point eventPoint = new Point (e.X, e.Y);
eventCoord.Text = string.Format ("({0}; {1})", eventPoint.X, eventPoint.Y);
// Координаты, пересчитанные в систему координат графика
double graphX, graphY;
// Пересчитать координаты из системы координат, связанной с контролом zedGraph
// в систему координат, связанную с графиком
pane.ReverseTransform (new PointF (e.X, e.Y), out graphX, out graphY);
graphCoord.Text = string.Format ("({0:F3}; {1:F3})", graphX, graphY);
// Пересчитаем в обратную сторону из системы координат графика
// в систему координат контрола.
// Должны получить те же значения, что и в eventPoint
// (с точностью до погрешности округления)
// Последний параметр CoordType.AxisXYScale обозначает,
// в какой системе координат заданы координаты, переданные в первых двух параметрах.
PointF controlPoint = pane.GeneralTransform (new PointF ((float)graphX,
(float)graphY),
CoordType.AxisXYScale);
controlCoord.Text = string.Format ("({0}; {1})", controlPoint.X, controlPoint.Y);
return false;
}
private double f (double x)
{
if (x == 0)
{
return 1;
}
return Math.Sin (x) / x;
}
private void DrawGraph ()
{
GraphPane pane = zedGraph.GraphPane;
pane.XAxis.MajorGrid.IsVisible = true;
pane.YAxis.MajorGrid.IsVisible = true;
// Очистим список кривых
pane.CurveList.Clear ();
// Создадим список точек
PointPairList list = new PointPairList ();
double xmin = -50;
double xmax = 50;
// Заполняем список точек
for (double x = xmin; x <= xmax; x += 0.01)
{
// добавим в список точку
list.Add (x, f (x));
}
// Создадим кривую
LineItem myCurve = pane.AddCurve ("", list, Color.Blue, SymbolType.None);
// Вызываем метод AxisChange (), чтобы обновить данные об осях.
zedGraph.AxisChange ();
// Обновляем график
zedGraph.Invalidate ();
}
}
{
public Form1 ()
{
InitializeComponent ();
// Подпишемся на событие, возникающее при нажатии кнопки мыши
// Обратите внимание, что подписываемся на событие MouseDownEvent, а не MouseDown
zedGraph.MouseDownEvent +=
new ZedGraphControl.ZedMouseEventHandler (zedGraph_MouseDownEvent);
DrawGraph ();
}
/// <summary>
/// Обработчик события нажатия на кнопку мыши
/// </summary>
/// <returns>Метод возвращает true, если нужно запретить дальнейшую встроенную обработку события (показ контекстного меню, начало выделения и т.п.), и false, если обработка события должна быть продолжена</returns>
bool zedGraph_MouseDownEvent (ZedGraphControl sender, MouseEventArgs e)
{
GraphPane pane = zedGraph.GraphPane;
// Координаты, которые переданы в событие
Point eventPoint = new Point (e.X, e.Y);
eventCoord.Text = string.Format ("({0}; {1})", eventPoint.X, eventPoint.Y);
// Координаты, пересчитанные в систему координат графика
double graphX, graphY;
// Пересчитать координаты из системы координат, связанной с контролом zedGraph
// в систему координат, связанную с графиком
pane.ReverseTransform (new PointF (e.X, e.Y), out graphX, out graphY);
graphCoord.Text = string.Format ("({0:F3}; {1:F3})", graphX, graphY);
// Пересчитаем в обратную сторону из системы координат графика
// в систему координат контрола.
// Должны получить те же значения, что и в eventPoint
// (с точностью до погрешности округления)
// Последний параметр CoordType.AxisXYScale обозначает,
// в какой системе координат заданы координаты, переданные в первых двух параметрах.
PointF controlPoint = pane.GeneralTransform (new PointF ((float)graphX,
(float)graphY),
CoordType.AxisXYScale);
controlCoord.Text = string.Format ("({0}; {1})", controlPoint.X, controlPoint.Y);
return false;
}
private double f (double x)
{
if (x == 0)
{
return 1;
}
return Math.Sin (x) / x;
}
private void DrawGraph ()
{
GraphPane pane = zedGraph.GraphPane;
pane.XAxis.MajorGrid.IsVisible = true;
pane.YAxis.MajorGrid.IsVisible = true;
// Очистим список кривых
pane.CurveList.Clear ();
// Создадим список точек
PointPairList list = new PointPairList ();
double xmin = -50;
double xmax = 50;
// Заполняем список точек
for (double x = xmin; x <= xmax; x += 0.01)
{
// добавим в список точку
list.Add (x, f (x));
}
// Создадим кривую
LineItem myCurve = pane.AddCurve ("", list, Color.Blue, SymbolType.None);
// Вызываем метод AxisChange (), чтобы обновить данные об осях.
zedGraph.AxisChange ();
// Обновляем график
zedGraph.Invalidate ();
}
}
Вернуться к остальным примерам
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.