ZedGraph:仅获取可见曲线点的PointPair列表

时间:2012-04-22 23:51:48

标签: .net winforms zedgraph

如何仅获取可见曲线数据的PointPairList而不是Curveitem列表中的所有点?此缩放应在缩放或平移时动态更改。

感谢。

3 个答案:

答案 0 :(得分:1)

似乎没有ZedGraph API方法为您执行此操作。但是,下面的代码演示了一个VisiblePoints方法,它返回一个PointPairList并在一个非常特定的ZedGraph用例下工作。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using ZedGraph;

namespace ZedGraphMain
{
    public class ZedGraphDemo : Form
    {
        public ZedGraphDemo()
        {
            var graphControl = new ZedGraphControl();
            graphControl.Dock = DockStyle.Fill;
            graphControl.IsShowPointValues = true;
            Controls.Add(graphControl);
            var points = new PointPairList();
            for (double i = 0; i <= 5.0; i += 1)
                points.Add(i, i);

            var curve = graphControl.GraphPane.AddCurve("A Label", points, Color.ForestGreen);

            graphControl.RestoreScale(graphControl.GraphPane);
            graphControl.ZoomEvent += (_, __, ___) => LogVisibility(graphControl, curve, points);
        }

        private static PointPairList VisiblePoints(ZedGraphControl control, LineItem lineItem, PointPairList points)
        {
            var pointPairList = new PointPairList();
            pointPairList.AddRange(points.Where(pp => IsVisible(control, lineItem, pp)).ToList());
            return pointPairList;
        }

        private static bool IsVisible(ZedGraphControl control, LineItem lineItem, PointPair point)
        {
            GraphPane pane = control.GraphPane;
            Scale xScale = lineItem.GetXAxis(pane).Scale;
            Scale yScale = lineItem.GetYAxis(pane).Scale;
            return point.X > xScale.Min && point.X < xScale.Max && point.Y > yScale.Min && point.Y < yScale.Max;
        }

        private static void LogVisibility(ZedGraphControl control, LineItem lineItem, PointPairList points)
        {
            List<PointPair> visiblePoints = VisiblePoints(control, lineItem, points);
            Console.Out.WriteLine(DateTime.Now + ": " + string.Join(",", visiblePoints.Select(pp => string.Format("({0:N1}, {1:N1})", pp.X, pp.Y))));
        }
    }
}

答案 1 :(得分:0)

我相信PointPairList总是包含所有点。

绘制的点始终存在,它就是它们如何通过缩放和转换为像素变化。盘中。

我知道我需要为大型数据集创建自己的AverageFilteredList。我有成千上万的点,应用程序会由于内存使用而停止运行(为简洁起见,删除了实现):

public class AverageFilteredPointList : IPointList 
{
  <snip>

  public int Count { get; set; }
  public int MaxPts { get; set; }

  public PointPair this[int index] { get; set; }
  public void SetBounds(double min, double max, int maxPts) { }
}

我认为你必须实现自己的IPointList类,当你想要收集“点”可见的信息时,会在缩放/平移时处理它自己的内部点。

此外,我不确定这是否会对您有所帮助,但您可以使用以下GraphPane函数来确定像素位置的实际DataPoint:

ReverseTransform(pt, out xSampleData, out ySampleData);

答案 2 :(得分:0)

现有FilteredPointList符合您的要求。

它包含关于如何使用它的detailed explanation以及link to a ZedGraph wiki