public override ScanLine DoTask(ScanLine source) { int count = source.Count; ScanLine ret = new ScanLine(source.LaserID, count); ret.DisplayAsLine = source.DisplayAsLine; if (count < 4) { ret.AddRange(source); } else { BezierBuilder bez = new BezierBuilder(SegmentPerCurve, MinSquareDistance); bez.SetControlPoints(source); switch (Mode) { case eMode.Mode0: ret.AddRange(bez.GetDrawingPoints0()); break; case eMode.Mode1: ret.AddRange(bez.GetDrawingPoints1()); break; default: ret.AddRange(bez.GetDrawingPoints2()); break; } } return(ret); }
protected void RenderIsolineCollection(DrawingContext dc, double strokeThickness, IsolineCollection collection, CoordinateTransform transform) { foreach (LevelLine line in collection) { StreamGeometry lineGeometry = new StreamGeometry(); using (var context = lineGeometry.Open()) { context.BeginFigure(line.StartPoint.ViewportToScreen(transform), false, false); if (!UseBezierCurves) { context.PolyLineTo(line.OtherPoints.ViewportToScreen(transform).ToArray(), true, true); } else { context.PolyBezierTo(BezierBuilder.GetBezierPoints(line.AllPoints.ViewportToScreen(transform).ToArray()).Skip(1).ToArray(), true, true); } } lineGeometry.Freeze(); Pen pen = new Pen(new SolidColorBrush(Palette.GetColor(line.Value01)), strokeThickness); dc.DrawGeometry(null, pen, lineGeometry); } }
protected override void UpdateUIRepresentationCore() { if (updating) { return; } updating = true; var transform = Plotter.Viewport.Transform; PathGeometry geometry = PathGeometry; PointCollection points = Points; geometry.Clear(); if (BezierPoints != null) { points = BezierPoints; var screenPoints = points.DataToScreen(transform).ToArray(); PathFigure figure = new PathFigure(); figure.StartPoint = screenPoints[0]; figure.Segments.Add(new PolyBezierSegment(screenPoints.Skip(1), true)); geometry.Figures.Add(figure); geometry.FillRule = this.FillRule; } else if (points == null) { } else { PathFigure figure = new PathFigure(); if (points.Count > 0) { Point[] bezierPoints = null; figure.StartPoint = points[0].DataToScreen(transform); if (points.Count > 1) { Point[] screenPoints = points.DataToScreen(transform).ToArray(); bezierPoints = BezierBuilder.GetBezierPoints(screenPoints).Skip(1).ToArray(); figure.Segments.Add(new PolyBezierSegment(bezierPoints, true)); } if (bezierPoints != null && buildBezierPoints) { Array.Resize(ref bezierPoints, bezierPoints.Length + 1); Array.Copy(bezierPoints, 0, bezierPoints, 1, bezierPoints.Length - 1); bezierPoints[0] = figure.StartPoint; BezierPoints = new PointCollection(bezierPoints.ScreenToData(transform)); } } geometry.Figures.Add(figure); geometry.FillRule = this.FillRule; } updating = false; }