/// <summary> /// Renders the transformed points. /// </summary> /// <param name="rc"> /// The render context. /// </param> /// <param name="clippingRect"> /// The clipping rect. /// </param> /// <param name="pointsToRender"> /// The points to render. /// </param> protected void RenderPoints(IRenderContext rc, OxyRect clippingRect, IList <ScreenPoint> pointsToRender) { var screenPoints = pointsToRender; if (this.Smooth) { // spline smoothing (should only be used on small datasets) var resampledPoints = ScreenPointHelper.ResamplePoints(pointsToRender, this.MinimumSegmentLength); screenPoints = CanonicalSplineHelper.CreateSpline(resampledPoints, 0.5, null, false, 0.25); } // clip the line segments with the clipping rectangle if (this.StrokeThickness > 0 && this.ActualLineStyle != LineStyle.None) { this.RenderSmoothedLine(rc, clippingRect, screenPoints); } if (this.MarkerType != MarkerType.None) { rc.DrawMarkers( pointsToRender, clippingRect, this.MarkerType, this.MarkerOutline, new[] { this.MarkerSize }, this.MarkerFill, this.MarkerStroke, this.MarkerStrokeThickness); } }
/// <summary> /// Renders the series on the specified rendering context. /// </summary> /// <param name="rc">The rendering context.</param> /// <param name="model">The owner plot model.</param> public override void Render(IRenderContext rc, PlotModel model) { if (this.Points.Count == 0) { return; } if (this.XAxis == null || this.YAxis == null) { Trace("Axis not defined."); return; } double minDistSquared = this.MinimumSegmentLength * this.MinimumSegmentLength; var clippingRect = this.GetClippingRect(); // Transform all points to screen coordinates var points = this.Points; int n0 = points.Count; IList <ScreenPoint> pts0 = new ScreenPoint[n0]; for (int i = 0; i < n0; i++) { pts0[i] = this.XAxis.Transform(points[i].X, points[i].Y, this.YAxis); } int n1 = this.points2.Count; IList <ScreenPoint> pts1 = new ScreenPoint[n1]; for (int i = 0; i < n1; i++) { int j = this.Reverse2 ? n1 - 1 - i : i; pts1[j] = this.XAxis.Transform(this.points2[i].X, this.points2[i].Y, this.YAxis); } if (this.Smooth) { var rpts0 = ScreenPointHelper.ResamplePoints(pts0, this.MinimumSegmentLength); var rpts1 = ScreenPointHelper.ResamplePoints(pts1, this.MinimumSegmentLength); pts0 = CanonicalSplineHelper.CreateSpline(rpts0, 0.5, null, false, 0.25); pts1 = CanonicalSplineHelper.CreateSpline(rpts1, 0.5, null, false, 0.25); } // draw the clipped lines rc.DrawClippedLine( pts0, clippingRect, minDistSquared, this.GetSelectableColor(this.ActualColor), this.StrokeThickness, this.ActualLineStyle, this.LineJoin, false); rc.DrawClippedLine( pts1, clippingRect, minDistSquared, this.GetSelectableColor(this.ActualColor), this.StrokeThickness, this.ActualLineStyle, this.LineJoin, false); // combine the two lines and draw the clipped area var pts = new List <ScreenPoint>(); pts.AddRange(pts1); pts.AddRange(pts0); // pts = SutherlandHodgmanClipping.ClipPolygon(clippingRect, pts); rc.DrawClippedPolygon(pts, clippingRect, minDistSquared, this.GetSelectableFillColor(this.Fill), null); // draw the markers on top rc.DrawMarkers( pts0, clippingRect, this.MarkerType, null, new[] { this.MarkerSize }, this.MarkerFill, this.MarkerStroke, this.MarkerStrokeThickness, 1); rc.DrawMarkers( pts1, clippingRect, this.MarkerType, null, new[] { this.MarkerSize }, this.MarkerFill, this.MarkerStroke, this.MarkerStrokeThickness, 1); }
/// <summary> /// Force the smoothed points to be re-evaluated. /// </summary> protected void ResetSmoothedPoints() { double tolerance = Math.Abs(Math.Max(this.MaxX - this.MinX, this.MaxY - this.MinY) / ToleranceDivisor); this.smoothedPoints = CanonicalSplineHelper.CreateSpline(this.Points, 0.5, null, false, tolerance); }