Beispiel #1
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0 || editing)
            {
                return;
            }

            using (SolidBrush brushBack = styleHelper.GetBackgroundBrush((int)(opacityFactor * 128)))
                using (SolidBrush brushText = styleHelper.GetForegroundBrush((int)(opacityFactor * 255)))
                    using (Font fontText = styleHelper.GetFont((float)transformer.Scale))
                    {
                        // Note: recompute background size in case the font floored.
                        SizeF textSize   = canvas.MeasureString(text, fontText);
                        Point bgLocation = transformer.Transform(background.Rectangle.Location);
                        Size  bgSize     = new Size((int)textSize.Width, (int)textSize.Height);

                        SizeF untransformed = transformer.Untransform(textSize);
                        background.Rectangle = new RectangleF(background.Rectangle.Location, untransformed);

                        Rectangle rect = new Rectangle(bgLocation, bgSize);
                        RoundedRectangle.Draw(canvas, rect, brushBack, fontText.Height / 4, false, false, null);
                        canvas.DrawString(text, fontText, brushText, rect.Location);
                    }
        }
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            using (Pen penLine = styleHelper.GetPen(opacityFactor, transformer.Scale))
            {
                Point[] points = transformer.Transform(pointList).ToArray();

                if (!initializing)
                {
                    penLine.EndCap   = LineCap.Round;
                    penLine.StartCap = LineCap.Round;

                    if (styleHelper.PenShape == PenShape.Dash)
                    {
                        penLine.DashStyle = DashStyle.Dash;
                    }

                    canvas.DrawCurve(penLine, points, 0.5f);
                }
                else
                {
                    penLine.Width = 1.0f;
                    canvas.DrawLines(penLine, points);
                }
            }
        }
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityTrackable(trackingTimestamps, currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            Point start = transformer.Transform(points["a"]);
            Point end   = transformer.Transform(points["b"]);

            using (Pen penEdges = styleHelper.GetPen(opacityFactor, transformer.Scale))
                using (Brush brush = styleHelper.GetBrush(opacityFactor))
                {
                    if (distorter != null && distorter.Initialized)
                    {
                        DrawDistorted(canvas, distorter, transformer, penEdges, brush, start, end);
                    }
                    else
                    {
                        DrawStraight(canvas, transformer, penEdges, brush, start, end);
                    }
                }

            if (trackExtraData != TrackExtraData.None)
            {
                string text = GetExtraDataText();
                miniLabel.SetText(text);
                miniLabel.Draw(canvas, transformer, opacityFactor);
            }
        }
Beispiel #4
0
        private void DrawStraight(Graphics canvas, IImageToViewportTransformer transformer, Pen penEdges, Point start, Point end)
        {
            if (styleHelper.LineShape == LineShape.Squiggle)
            {
                canvas.DrawSquigglyLine(penEdges, start, end);
            }
            else if (styleHelper.LineShape == LineShape.Dash)
            {
                penEdges.DashStyle = DashStyle.Dash;
                canvas.DrawLine(penEdges, start, end);
            }
            else
            {
                canvas.DrawLine(penEdges, start, end);
            }

            labelMeasure.SetAttach(GetMiddlePoint(), true);

            if (styleHelper.LineEnding == LineEnding.StartArrow || styleHelper.LineEnding == LineEnding.DoubleArrow)
            {
                ArrowHelper.Draw(canvas, penEdges, start, end);
            }

            if (styleHelper.LineEnding == LineEnding.EndArrow || styleHelper.LineEnding == LineEnding.DoubleArrow)
            {
                ArrowHelper.Draw(canvas, penEdges, end, start);
            }
        }
Beispiel #5
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (tracking)
            {
                opacityFactor = 1.0;
            }

            if (opacityFactor <= 0)
            {
                return;
            }

            int   iAlpha = (int)(opacityFactor * 255);
            Point c      = transformer.Transform(points["0"]);

            using (Pen p = styleHelper.GetPen(iAlpha))
                using (SolidBrush b = styleHelper.GetBrush((int)(opacityFactor * defaultBackgroundAlpha)))
                {
                    canvas.DrawLine(p, c.X - defaultRadius, c.Y, c.X + defaultRadius, c.Y);
                    canvas.DrawLine(p, c.X, c.Y - defaultRadius, c.X, c.Y + defaultRadius);
                    canvas.FillEllipse(b, c.Box(defaultRadius + 1));
                }

            if (ShowMeasurableInfo)
            {
                labelCoordinates.SetText(CalibrationHelper.GetPointText(new PointF(points["0"].X, points["0"].Y), true, true, infosFading.ReferenceTimestamp));
                labelCoordinates.Draw(canvas, transformer, opacityFactor);
            }
        }
Beispiel #6
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (tracking)
            {
                opacityFactor = 1.0;
            }

            if (opacityFactor <= 0)
            {
                return;
            }

            int   iAlpha = (int)(opacityFactor * 255);
            Point c      = transformer.Transform(points["0"]);

            using (Pen p = styleHelper.GetPen(iAlpha))
                using (SolidBrush b = styleHelper.GetBrush((int)(opacityFactor * defaultBackgroundAlpha)))
                {
                    canvas.DrawLine(p, c.X - defaultRadius, c.Y, c.X + defaultRadius, c.Y);
                    canvas.DrawLine(p, c.X, c.Y - defaultRadius, c.X, c.Y + defaultRadius);
                    canvas.FillEllipse(b, c.Box(defaultRadius + 1));
                }

            if (trackExtraData != TrackExtraData.None)
            {
                string text = GetExtraDataText(infosFading.ReferenceTimestamp);
                miniLabel.SetText(text);
                miniLabel.Draw(canvas, transformer, opacityFactor);
            }
        }
Beispiel #7
0
        public double AddSpot(long timestamp, GraphicsPath path, IImageToViewportTransformer transformer)
        {
            // Add the shape of this spotlight to the global mask for the frame.
            // The dim rectangle is added separately in Spotlights class.
            double opacityFactor = infosFading.GetOpacityFactor(timestamp);

            if (tracking)
            {
                opacityFactor = 1.0;
            }

            if (opacityFactor <= 0)
            {
                return(0);
            }

            //RescaleCoordinates(_fStretchFactor, _DirectZoomTopLeft);
            Point center = transformer.Transform(points["o"]);
            int   r      = transformer.Transform(radius);

            rescaledRect = center.Box(r);
            path.AddEllipse(rescaledRect);

            // Return the opacity factor at this spot so the spotlights manager is able to compute the global dim value.
            return(opacityFactor);
        }
Beispiel #8
0
        public void Draw(Graphics canvas, IImageToViewportTransformer transformer, long timestamp, StyleHelper styleHelper)
        {
            double opacityFactor = infosFading.GetOpacityFactor(timestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            using (SolidBrush brushBack = styleHelper.GetBackgroundBrush((int)(opacityFactor * 255)))
                using (SolidBrush brushText = styleHelper.GetForegroundBrush((int)(opacityFactor * 255)))
                    using (Font fontText = styleHelper.GetFont((float)transformer.Scale))
                        using (Pen penContour = styleHelper.GetForegroundPen((int)(opacityFactor * 255)))
                        {
                            // Note: recompute background size in case the font floored.
                            string text     = value.ToString();
                            SizeF  textSize = canvas.MeasureString(text, fontText);

                            Point bgLocation = transformer.Transform(background.Rectangle.Location);
                            Size  bgSize     = new Size((int)textSize.Width, (int)textSize.Height);

                            SizeF untransformed = transformer.Untransform(textSize);
                            background.Rectangle = new RectangleF(background.Rectangle.Location, untransformed);

                            penContour.Width = 2;
                            Rectangle rect = new Rectangle(bgLocation, bgSize);
                            RoundedRectangle.Draw(canvas, rect, brushBack, fontText.Height / 4, false, true, penContour);
                            canvas.DrawString(text, fontText, brushText, rect.Location);
                        }
        }
Beispiel #9
0
 public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
 {
     foreach (AutoNumber number in autoNumbers)
     {
         number.Draw(canvas, transformer, currentTimestamp, styleHelper);
     }
 }
Beispiel #10
0
        private void DrawDistorted(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, Pen penEdges, Brush brush, Point start, Point end)
        {
            List <PointF> curve            = distorter.DistortLine(points["a"], points["b"]);
            List <Point>  transformedCurve = transformer.Transform(curve);

            if (styleHelper.LineShape == LineShape.Squiggle)
            {
                canvas.DrawSquigglyLine(penEdges, start, end);
            }
            else if (styleHelper.LineShape == LineShape.Dash)
            {
                DashStyle oldDashStyle = penEdges.DashStyle;
                penEdges.DashStyle = DashStyle.Dash;
                canvas.DrawCurve(penEdges, transformedCurve.ToArray());
                penEdges.DashStyle = oldDashStyle;
            }
            else
            {
                canvas.DrawCurve(penEdges, transformedCurve.ToArray());
            }

            miniLabel.SetAttach(curve[curve.Count / 2], true);

            if (styleHelper.LineEnding == LineEnding.StartArrow || styleHelper.LineEnding == LineEnding.DoubleArrow)
            {
                ArrowHelper.Draw(canvas, penEdges, start, end);
            }

            if (styleHelper.LineEnding == LineEnding.EndArrow || styleHelper.LineEnding == LineEnding.DoubleArrow)
            {
                ArrowHelper.Draw(canvas, penEdges, end, start);
            }
        }
Beispiel #11
0
        public int HitTest(PointF point, IImageToViewportTransformer transformer)
        {
            int result = -1;

            PointF topLeft  = new PointF(rectangle.Left, rectangle.Top);
            PointF topRight = new PointF(rectangle.Right, rectangle.Top);
            PointF botRight = new PointF(rectangle.Right, rectangle.Bottom);
            PointF botLeft  = new PointF(rectangle.Left, rectangle.Bottom);

            if (HitTester.HitTest(topLeft, point, transformer))
            {
                result = 1;
            }
            else if (HitTester.HitTest(topRight, point, transformer))
            {
                result = 2;
            }
            else if (HitTester.HitTest(botRight, point, transformer))
            {
                result = 3;
            }
            else if (HitTester.HitTest(botLeft, point, transformer))
            {
                result = 4;
            }
            else if (rectangle.Contains(point.ToPoint()))
            {
                result = 0;
            }

            return(result);
        }
Beispiel #12
0
        public static bool HitTest(PointF target, PointF mouse, IImageToViewportTransformer transformer)
        {
            int radius    = 10;
            int boxRadius = Math.Max(1, transformer.Untransform(radius));

            return(target.Box(boxRadius).Contains(mouse));
        }
Beispiel #13
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0 || !loaded)
            {
                return;
            }

            Rectangle rect = transformer.Transform(boundingBox.Rectangle);

            if (finishedResizing)
            {
                finishedResizing = false;
                RenderAtNewScale(rect.Size, transformer.Scale);
            }

            if (svgRendered == null)
            {
                return;
            }

            fadingColorMatrix.Matrix33 = (float)opacityFactor;
            fadingImgAttr.SetColorMatrix(fadingColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            canvas.DrawImage(svgRendered, rect, 0, 0, svgRendered.Width, svgRendered.Height, GraphicsUnit.Pixel, fadingImgAttr);

            if (selected)
            {
                boundingBox.Draw(canvas, rect, penBoundingBox, brushBoundingBox, 4);
            }
        }
Beispiel #14
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            if (!valid)
            {
                return;
            }

            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            Rectangle rect = transformer.Transform(boundingBox.Rectangle);

            fadingColorMatrix.Matrix33 = (float)opacityFactor;
            fadingImgAttr.SetColorMatrix(fadingColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            canvas.DrawImage(bitmap, rect, 0, 0, bitmap.Width, bitmap.Height, GraphicsUnit.Pixel, fadingImgAttr);

            if (selected)
            {
                boundingBox.Draw(canvas, rect, penBoundingBox, brushBoundingBox, 4);
            }
        }
Beispiel #15
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            int alpha = (int)(opacityFactor * 255);

            this.selected = selected;

            using (Pen p = styleHelper.GetPen(alpha, transformer.Scale))
            {
                Rectangle boundingBox = transformer.Transform(center.Box(radius));
                canvas.DrawEllipse(p, boundingBox);

                if (selected)
                {
                    // Handler: arc in lower right quadrant.
                    p.Color = p.Color.Invert();
                    canvas.DrawArc(p, boundingBox, 25, 40);
                }
            }
        }
Beispiel #16
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            QuadrilateralF quad = transformer.Transform(quadImage);

            int alpha = (int)(opacityFactor * 255);

            using (Pen p = styleHelper.GetPen(alpha, transformer.Scale))
            {
                p.EndCap = LineCap.Square;
                if (styleHelper.PenShape == PenShape.Dash)
                {
                    p.DashStyle = DashStyle.Dash;
                }

                canvas.DrawLine(p, quad.A, quad.B);
                canvas.DrawLine(p, quad.B, quad.C);
                canvas.DrawLine(p, quad.C, quad.D);
                canvas.DrawLine(p, quad.D, quad.A);
            }
        }
        private bool IsPointInObject(PointF point, IImageToViewportTransformer transformer)
        {
            // Angles, hit zones, segments.

            bool hit = false;

            foreach (AngleHelper angle in angles)
            {
                hit = angle.SweepAngle.Hit(point);
                if (hit)
                {
                    break;
                }
            }

            if (hit)
            {
                return(true);
            }

            foreach (GenericPostureAbstractHitZone hitZone in genericPosture.HitZones)
            {
                hit = IsPointInHitZone(hitZone, point);
                if (hit)
                {
                    break;
                }
            }

            if (hit)
            {
                return(true);
            }

            foreach (GenericPostureCircle circle in genericPosture.Circles)
            {
                hit = IsPointInsideCircle(circle, point, transformer);
                if (hit)
                {
                    break;
                }
            }

            if (hit)
            {
                return(true);
            }

            foreach (GenericPostureSegment segment in genericPosture.Segments)
            {
                hit = IsPointOnSegment(segment, point, transformer);
                if (hit)
                {
                    break;
                }
            }

            return(hit);
        }
Beispiel #18
0
 private bool IsPointOnHandler(PointF point, IImageToViewportTransformer transformer)
 {
     using (GraphicsPath path = new GraphicsPath())
     {
         path.AddArc(points["o"].X - radius, points["o"].Y - radius, radius * 2, radius * 2, 0, 360);
         return(HitTester.HitTest(path, point, 2, false, transformer));
     }
 }
Beispiel #19
0
 private bool IsPointInObject(PointF point, IImageToViewportTransformer transformer)
 {
     using (GraphicsPath path = new GraphicsPath())
     {
         path.AddEllipse(points["o"].X - radius, points["o"].Y - radius, radius * 2, radius * 2);
         return(HitTester.HitTest(path, point, 0, true, transformer));
     }
 }
 private bool IsPointOnArc(GenericPostureCircle circle, PointF point, IImageToViewportTransformer transformer)
 {
     using (GraphicsPath path = new GraphicsPath())
     {
         PointF center = circle.Center >= 0 ? genericPosture.PointList[circle.Center] : GetUntransformedComputedPoint(circle.Center);
         path.AddArc(center.Box(circle.Radius), 0, 360);
         return(HitTester.HitTest(path, point, circle.Width, false, transformer));
     }
 }
Beispiel #21
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            if (!Visible || imageSize == SizeF.Empty)
            {
                return;
            }

            DrawGrid(canvas, transformer);
        }
Beispiel #22
0
        private void DrawCenteredCircle(Graphics canvas, IImageToViewportTransformer transformer, Pen pen, float radiusX, float radiusY)
        {
            PointF     a    = Map(new PointF(-radiusX, radiusY));
            PointF     b    = Map(new PointF(radiusX, radiusY));
            PointF     c    = Map(new PointF(radiusX, -radiusY));
            RectangleF rect = new RectangleF(a.X, a.Y, b.X - a.X, c.Y - a.Y);

            canvas.DrawEllipse(pen, transformer.Transform(rect));
        }
 private bool IsPointInsideCircle(GenericPostureCircle circle, PointF point, IImageToViewportTransformer transformer)
 {
     using (GraphicsPath path = new GraphicsPath())
     {
         PointF center = circle.Center >= 0 ? genericPosture.PointList[circle.Center] : GetUntransformedComputedPoint(circle.Center);
         path.AddEllipse(center.Box(circle.Radius));
         return(HitTester.HitTest(path, point, 0, true, transformer));
     }
 }
Beispiel #24
0
        private void ComputeTextPosition(Angle angle, IImageToViewportTransformer transformer)
        {
            int    imageTextDistance = transformer.Untransform(textDistance);
            double bissect           = (angle.Start + angle.Sweep / 2) * MathHelper.DegreesToRadians;
            int    adjacent          = (int)(Math.Cos(bissect) * imageTextDistance);
            int    opposed           = (int)(Math.Sin(bissect) * imageTextDistance);

            TextPosition = new Point(adjacent, opposed);
        }
Beispiel #25
0
        private bool IsPointInObject(PointF point, IImageToViewportTransformer transformer)
        {
            bool hit = false;

            using (GraphicsPath areaPath = new GraphicsPath())
            {
                areaPath.AddEllipse(center.Box(radius + styleHelper.LineSize));
                hit = HitTester.HitTest(areaPath, point, 0, true, transformer);
            }
            return(hit);
        }
Beispiel #26
0
        private bool IsPointInObject(PointF point, IImageToViewportTransformer transformer)
        {
            bool hit = false;

            using (GraphicsPath areaPath = new GraphicsPath())
            {
                GetHitPath(areaPath);
                hit = HitTester.HitTest(areaPath, point, 0, true, transformer);
            }
            return(hit);
        }
Beispiel #27
0
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            if (currentTimestamp < visibleTimestamp)
            {
                return;
            }

            double opacityFactor = 1.0;

            if (currentTimestamp > invisibleTimestamp)
            {
                opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);
            }

            if (opacityFactor <= 0)
            {
                return;
            }

            timecode = GetTimecode(currentTimestamp);
            string text = timecode;

            using (SolidBrush brushBack = styleHelper.GetBackgroundBrush((int)(opacityFactor * 128)))
                using (SolidBrush brushText = styleHelper.GetForegroundBrush((int)(opacityFactor * 255)))
                    using (Font fontText = styleHelper.GetFont((float)transformer.Scale))
                    {
                        SizeF textSize   = canvas.MeasureString(text, fontText);
                        Point bgLocation = transformer.Transform(mainBackground.Rectangle.Location);
                        Size  bgSize     = new Size((int)textSize.Width, (int)textSize.Height);

                        SizeF untransformed = transformer.Untransform(textSize);
                        mainBackground.Rectangle = new RectangleF(mainBackground.Rectangle.Location, untransformed);

                        Rectangle rect           = new Rectangle(bgLocation, bgSize);
                        int       roundingRadius = fontText.Height / 4;
                        RoundedRectangle.Draw(canvas, rect, brushBack, roundingRadius, false, false, null);
                        canvas.DrawString(text, fontText, brushText, rect.Location);

                        if (showLabel && name.Length > 0)
                        {
                            using (Font fontLabel = styleHelper.GetFont((float)transformer.Scale * 0.5f))
                            {
                                // Note: the alignment here assumes fixed margins of the rounded rectangle class.
                                SizeF     lblTextSize         = canvas.MeasureString(name, fontLabel);
                                int       labelRoundingRadius = fontLabel.Height / 3;
                                int       top     = rect.Location.Y - (int)lblTextSize.Height - roundingRadius - labelRoundingRadius;
                                Rectangle lblRect = new Rectangle(rect.Location.X, top, (int)lblTextSize.Width, (int)lblTextSize.Height);
                                RoundedRectangle.Draw(canvas, lblRect, brushBack, labelRoundingRadius, true, false, null);
                                canvas.DrawString(name, fontLabel, brushText, lblRect.Location);
                            }
                        }
                    }
        }
 private void UpdateAngles(IImageToViewportTransformer transformer)
 {
     for (int i = 0; i < angles.Count; i++)
     {
         PointF origin = genericPosture.Points[genericPosture.Angles[i].Origin];
         PointF leg1   = genericPosture.Points[genericPosture.Angles[i].Leg1];
         PointF leg2   = genericPosture.Points[genericPosture.Angles[i].Leg2];
         int    radius = genericPosture.Angles[i].Radius;
         Color  color  = genericPosture.Angles[i].Color;
         angles[i].Update(origin, leg1, leg2, radius, color, CalibrationHelper, transformer);
     }
 }
Beispiel #29
0
        public int HitTest(PointF point, long currentTimeStamp, IImageToViewportTransformer transformer)
        {
            int    result  = -1;
            double opacity = infosFading.GetOpacityFactor(currentTimeStamp);

            if (opacity > 0)
            {
                return(background.HitTest(point, false, 0, transformer));
            }

            return(result);
        }
        public override void Draw(Graphics canvas, DistortionHelper distorter, IImageToViewportTransformer transformer, bool selected, long currentTimestamp)
        {
            double opacityFactor = infosFading.GetOpacityFactor(currentTimestamp);

            if (opacityFactor <= 0)
            {
                return;
            }

            List <Point> screenPoints = transformer.Transform(points);

            using (penEdges = styleHelper.GetPen(opacityFactor, 1.0))
                using (SolidBrush br = styleHelper.GetBrush(opacityFactor))
                {
                    int rows = subdivisions + 1;
                    int cols = rows;

                    // Rows
                    for (int i = 0; i < rows; i++)
                    {
                        int          row  = i;
                        List <Point> line = new List <Point>();
                        for (int j = 0; j < cols; j++)
                        {
                            int index = row * cols + j;
                            line.Add(screenPoints[index]);
                        }

                        canvas.DrawCurve(penEdges, line.ToArray());
                    }

                    // Columns
                    for (int i = 0; i < cols; i++)
                    {
                        int          col  = i;
                        List <Point> line = new List <Point>();
                        for (int j = 0; j < rows; j++)
                        {
                            int index = j * cols + col;
                            line.Add(screenPoints[index]);
                        }

                        canvas.DrawCurve(penEdges, line.ToArray());
                    }

                    // Handles
                    foreach (PointF p in screenPoints)
                    {
                        canvas.FillEllipse(br, p.Box(4));
                    }
                }
        }