public virtual void Copy(CubicBezier acopy)
 {
     base.Copy(acopy);
     m_p1            = acopy.m_p1;
     m_p2            = acopy.m_p2;
     m_useEndArrow   = acopy.m_useEndArrow;
     m_useStartArrow = acopy.m_useStartArrow;
     m_crv           = acopy.m_crv;
     m_guid          = acopy.Guid;
     UpdateCtrlPts();
     Selected = acopy.Selected;
 }
        void UpdateCtrlPts()
        {
            double xDelta = m_p2.X - m_p1.X;
            double scale  = 0.6;

            m_p1Ctrl.X = m_p1.X + xDelta * scale;
            m_p1Ctrl.Y = m_p1.Y;
            m_p2Ctrl.X = m_p2.X - xDelta * scale;
            m_p2Ctrl.Y = m_p2.Y;

            if (m_crv == null)
            {
                m_crv = new CubicBezierCurveCurve(new float[2] {
                    (float)m_p1.X, (float)m_p1.Y
                },
                                                  new float[2] {
                    (float)m_p1Ctrl.X, (float)m_p1Ctrl.Y
                },
                                                  new float[2] {
                    (float)m_p2Ctrl.X, (float)m_p2Ctrl.Y
                },
                                                  new float[2] {
                    (float)m_p2.X, (float)m_p2.Y
                });
            }
            else
            {
                m_crv.SetPos(0, (float)m_p1.X, (float)m_p1.Y);
                m_crv.SetPos(1, (float)m_p1Ctrl.X, (float)m_p1Ctrl.Y);
                m_crv.SetPos(2, (float)m_p2Ctrl.X, (float)m_p2Ctrl.Y);
                m_crv.SetPos(3, (float)m_p2.X, (float)m_p2.Y);
            }
            float[] midPt = { 0.0f, 0.0f };
            m_crv.Eval(0.5f, ref midPt[0], ref midPt[1]);
            m_center.X = midPt[0];
            m_center.Y = midPt[1];
        }