public PointOnPath AdvancePoint(PointOnPath pt, ref double dist)
        {
            // assert that we're looking at the same segment
            Debug.Assert(Equals(pt.segment));

            if (pt.dist + dist <= 0)
            {
                // handle the case of negative distance going before start point
                dist += pt.dist;
                return(StartPoint);
            }
            else if (pt.dist + dist >= cb.ArcLength)
            {
                // handle the case of positive distance going after end point
                dist -= cb.ArcLength - pt.dist;
                return(EndPoint);
            }
            else
            {
                // we're in the range that we can achieve
                double targetDist = pt.dist + dist;
                double tValue     = cb.FindT(targetDist);
                double actDist    = cb.PartialArcLength(tValue);

                dist = 0;
                return(new PointOnPath(this, targetDist, cb.Bt(tValue)));
            }
        }
        public static void DrawBezier(GLPen pen, PointF startP, PointF ctrl1, PointF ctrl2, PointF endP)
        {
            CubicBezier cb = new CubicBezier(Utility.ToCoord(startP), Utility.ToCoord(ctrl1), Utility.ToCoord(ctrl2), Utility.ToCoord(endP));

            pen.GLApplyPen();
            Gl.glBegin(Gl.GL_LINE_STRIP);
            //iterate this bitch
            for (double i = 0; i < 1.0; i += .025)
            {
                PointF p = Utility.ToPointF(cb.Bt(i));
                Gl.glVertex2f(p.X, p.Y);
            }

            PointF p1 = Utility.ToPointF(cb.Bt(1));

            Gl.glVertex2f(p1.X, p1.Y);

            Gl.glEnd();
        }
        public void DrawBezier(IPen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4)
        {
            CubicBezier cb = new CubicBezier(Utility.ToCoord(pt1), Utility.ToCoord(pt2), Utility.ToCoord(pt3), Utility.ToCoord(pt4));

            ApplyPen(pen);
            Gl.glBegin(Gl.GL_LINE_STRIP);
            //iterate this bitch
            for (double i = 0; i < 1.0; i += .025)
            {
                PointF p = Utility.ToPointF(cb.Bt(i));
                Gl.glVertex2f(p.X, p.Y);
            }

            PointF p1 = Utility.ToPointF(cb.Bt(1));

            Gl.glVertex2f(p1.X, p1.Y);

            Gl.glEnd();
        }