我被要求编写一个程序,可以尽快处理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;
}
}
}
}
但这需要更长的时间。
很抱歉这么长时间,但我想让问题清楚。 所以这是我的两个问题:
帕特里克
编辑:参考Most performant way to graph thousands of data points with WPF?我认为这是一个不同的问题,因为:所有的答案都会导致下采样点,这是一般的正确暗示,但对我来说不是,因为我现在还没有我的程序在非常快的时间内执行(稍后会执行)但只能选择以最快的方式显示所有这些点。===&GT;编辑2:对不起因为没有让它更清楚而感到遗憾。我不需要绘制10 ^ 6点。 我已经制作了一个优化曲线的s / r,并将它们从10 ^ 6降低到4000。 我想知道的是绘制折线段的最快方法。为了做到这一点,我将停用优化程序并返回10 ^ 6点,但只是为了测量不同绘制方法的准确时间。 回到我原来的问题。谁能告诉我什么是用多线段制作曲线的最快方法?