WPF:尽可能快地绘制100万点曲线

时间:2015-08-15 13:10:46

标签: wpf performance curve points

我被要求编写一个程序,可以尽快处理100万点曲线。那曲线(我称之为Megaspiral的螺旋)必须通过鼠标事件移动和缩放。经过短暂的研究,我决定WPF会为我做。 我尝试了两种不同的方法:

第一个是这样的:首先我准备点然后我将它们添加到画布。

private void PreparePoints()
{
    double radius = 100;
    double xc = 100, yc = 150;
    double numPunti = Math.Pow(10, exp);
    double increment = ((double)360 / numPunti) * DEG_2_RAD * 10;
    int count = 0;
    DateTime beforePoint = DateTime.Now;
    for (double iii = increment; iii <= ((360 * DEG_2_RAD) * 10); iii += increment)
    {
        count++;
        radius -= Math.Pow(10, -exp + 2);
        Point P = new Point(xc + 50 + radius * Math.Cos(iii), yc + radius * Math.Sin(iii));
        pl1.Points.Add(P);          
    }
    TimeSpan tsPoint = DateTime.Now - beforePoint;
    Trace.WriteLine("Prepared " + count + " points in " + tsPoint.TotalMilliseconds/1000.0);

}

double exp = 6;
PolyLineSegment pl1 = new PolyLineSegment();
private void AddGraphics()
{
    PathFigure pf = new PathFigure();


    pf.Segments.Add(pl1);
    int aaa = pl1.Points.Count;
    PathGeometry pg = new PathGeometry();
    pg.Figures.Add(pf);

    Path p = new Path();
    p.StrokeThickness = 2;
    p.Stroke = Brushes.Red;
    p.Data = pg;        
    plotCanvas.Children.Add(p);    
}

在AddGraphics中我都试图使用上面的路径图并直接添加它们。

简而言之,我注意到这两个例程都需要一点时间才能执行(<1秒),但计算机会卡住很长时间。

作为第二种方法,我将100万条曲线绘制为自定义曲线:

namespace CustomShapes
{
public class MegaSpyral : Shape
{
    protected PathGeometry pg;
    PathFigure pf;
    PolyLineSegment pls;

    public MegaSpyral()
    {
        pg = new PathGeometry();
        pf = new PathFigure();
        pls = new PolyLineSegment();
        pg.Figures.Add(pf);
    }

    // Specify the center of the star
    public static readonly DependencyProperty CenterProperty = DependencyProperty.Register("MegaSpyralCenter", typeof(Point), typeof(Star),
        new FrameworkPropertyMetadata(new Point(20.0, 20.0),
            FrameworkPropertyMetadataOptions.AffectsMeasure));
public Point Center
{
    set { SetValue(CenterProperty, value); }
    get { return (Point)GetValue(CenterProperty); }
}

// Specify the size of the star:
    public static readonly DependencyProperty SizeRProperty =
            DependencyProperty.Register("MegaSpyralSizeR", typeof(double), typeof(Star),
            new FrameworkPropertyMetadata(10.0,
            FrameworkPropertyMetadataOptions.AffectsMeasure));
public double SizeR
    {
        set { SetValue(SizeRProperty, value); }
        get { return (double)GetValue(SizeRProperty); }
    }


    private const double DEG_2_RAD = Math.PI / 180;
    protected override Geometry DefiningGeometry
    {
        get
        {
            int exp = 5;
            double radius = 100;// SizeR;
            double xc = Center.X, yc = Center.X;
            double prev = 0;
            double numPunti = Math.Pow(10, exp);
            double increment = ((double)360 / numPunti) * DEG_2_RAD * 10;
            int count = 0;
            for (double iii = increment; iii <= ((360 * DEG_2_RAD) * 10); iii += increment)
            {
                count++;
                radius -= Math.Pow(10, -exp + 2);
                //Point P1 = new Point(xc + 50 + radius * Math.Cos(prev), yc + radius * Math.Sin(prev));
                Point P2 = new Point(xc + 50 + radius * Math.Cos(iii), yc + radius * Math.Sin(iii));
                if (count == 1)
                    pf.StartPoint = P2;
                else
                    pls.Points.Add(P2);                 
            }

            pf.Segments.Add(pls);

            pf.IsClosed = false;

            pf.Segments.Add(pls);
            pf.IsClosed = true;
            pg.FillRule = FillRule.Nonzero;

            return pg;
        }
    }
}
}

但这需要更长的时间。

很抱歉这么长时间,但我想让问题清楚。 所以这是我的两个问题:

  1. 真的没有办法让它更快地运作吗?
  2. 因为我必须准确地计时是什么事告诉我画布已被绘制(我在每个元素上尝试了所有事件)
  3. 帕特里克

    编辑:参考Most performant way to graph thousands of data points with WPF?我认为这是一个不同的问题,因为:所有的答案都会导致下采样点,这是一般的正确暗示,但对我来说不是,因为我现在还没有我的程序在非常快的时间内执行(稍后会执行)但只能选择以最快的方式显示所有这些点。

    ===&GT;编辑2:对不起因为没有让它更清楚而感到遗憾。我不需要绘制10 ^ 6点。 我已经制作了一个优化曲线的s / r,并将它们从10 ^ 6降低到4000。 我想知道的是绘制折线段的最快方法。为了做到这一点,我将停用优化程序并返回10 ^ 6点,但只是为了测量不同绘制方法的准确时间。 回到我原来的问题。谁能告诉我什么是用多线段制作曲线的最快方法?

0 个答案:

没有答案