public GraphControl() { mTraceBoxes = new List<TracingBox>(); mPointTrans = new PointTranslater() { ZoomX = ZOOM_DEFAULT, ZoomY = ZOOM_DEFAULT }; }
internal void Draw(DrawingContext dc, PointTranslater pt, GraphDrawingOptions op) { IPlotDataSource plotData = PlotData; if (plotData == null) return; double plotDataBegin = plotData.GetSegmentBegin(); double plotDataEnd = plotData.GetSegmentEnd(); double from = Math.Max(Math.Max(op.From, SegmentBegin), plotDataBegin); double to = Math.Min(Math.Min(op.To, SegmentEnd), plotDataEnd); if (from >= to) return; //plotData.SetZoom(pt.Zoom); plotData.SetSegment(from, to); var pointsToDraw = plotData.GetPoints(); if (pointsToDraw == null) return; if (pointsToDraw.Count <= 1) return; var graphPen = new Pen(StrokeBrush, StrokeThickness); int startIndex = plotData.GetStartIndex(); if (startIndex < 0) return; Rect rect = op.GraphRect; rect.X = pt.TransalteX(from); rect.Width = pt.TransalteX(to) - rect.X; Point next = pt.Translate(pointsToDraw[startIndex]); Point boundPoint; if (IsInterpolationEnabled) boundPoint = plotData.Interpolate(from); else boundPoint = pointsToDraw[startIndex]; boundPoint = pt.Translate(boundPoint); if (IsInterpolationEnabled) dc.DrawLine(graphPen, boundPoint, next); if (rect.Left > op.GraphRect.Left) { dc.DrawEllipse(StrokeBrush, null, boundPoint, BOUND_POINT_RADOUS, BOUND_POINT_RADOUS); } int endIndex = plotData.GetEndIndex(); for (int i = startIndex; i <= endIndex; i++) { Point prev = next; next = pt.Translate(pointsToDraw[i]); if (!(rect.Contains(prev) || rect.Contains(next))) continue; dc.DrawLine(graphPen, prev, next); } if (IsInterpolationEnabled) boundPoint = plotData.Interpolate(to); else boundPoint = pointsToDraw[endIndex]; boundPoint = pt.Translate(boundPoint); if (IsInterpolationEnabled) dc.DrawLine(graphPen, next, boundPoint); if (rect.Right < op.GraphRect.Right) { dc.DrawEllipse(StrokeBrush, null, boundPoint, BOUND_POINT_RADOUS, BOUND_POINT_RADOUS); } }