3

Curveitem リスト内のすべてのポイントではなく、可視曲線データのみの PointPairList を取得するにはどうすればよいですか? このリストは、ズームまたはパンするときに動的に変更する必要があります。

ありがとう。

4

3 に答える 3

2

これを行う ZedGraph API メソッドはないようです。ただし、以下のコードは、PointPairList を返す VisiblePoints メソッドを示しており、特定の 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))));
        }
    }
}
于 2015-02-11T10:22:00.330 に答える
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);
于 2013-05-23T20:05:14.650 に答える