//пока что не ясно
        private static Point[] bezierCoeffs(MyPoint bezierStartPoint, MyPoint bezierPoint1, MyPoint bezierPoint2, MyPoint bezierEndPoint)
        {
            Point[] coeffs = new Point[4];
            double  bezierStartPointX_M_3 = bezierStartPoint.X * 3.0;
            double  bezierPoint1X_M_3     = bezierPoint1.X * 3.0;
            double  bezierPoint2X_M_3     = bezierPoint2.X * 3.0;

            coeffs[0].X = -bezierStartPoint.X + bezierPoint1X_M_3 - bezierPoint2X_M_3 + bezierEndPoint.X;
            coeffs[1].X = bezierStartPointX_M_3 - 6.0 * bezierPoint1.X + bezierPoint2X_M_3;
            coeffs[2].X = -bezierStartPointX_M_3 + bezierPoint1X_M_3;
            coeffs[3].X = bezierStartPoint.X;

            double bezierStartPointY_M_3 = bezierStartPoint.Y * 3.0;
            double bezierPoint1Y_M_3     = bezierPoint1.Y * 3.0;
            double bezierPoint2Y_M_3     = bezierPoint2.Y * 3.0;

            coeffs[0].Y = -bezierStartPoint.Y + bezierPoint1Y_M_3 - bezierPoint2Y_M_3 + bezierEndPoint.Y;
            coeffs[1].Y = bezierStartPointY_M_3 - 6.0 * bezierPoint1.Y + bezierPoint2Y_M_3;
            coeffs[2].Y = -bezierStartPointY_M_3 + bezierPoint1Y_M_3;
            coeffs[3].Y = bezierStartPoint.Y;

            return(coeffs);
        }
 public static MyPoint GetStartPointDiagonal(MyPoint a1, MyPoint b1)
 {
     return(new MyPoint(Math.Min(a1.X, b1.X), Math.Min(a1.Y, b1.Y)));
 }
 public static MyPoint GetEndPointDiagonal(MyPoint a1, MyPoint b1)
 {
     return(new MyPoint(Math.Max(a1.X, b1.X), Math.Max(a1.Y, b1.Y)));
 }
        //основная функция
        public static bool ComputeIntersections(MyPoint bezierStartPoint, MyPoint bezierPoint1, MyPoint bezierPoint2, MyPoint bezierEndPoint, MyPoint lineStartPoint, MyPoint lineEndPoint)
        {
            double A = lineEndPoint.Y - lineStartPoint.Y;            // A = y2 - y1
            double B = lineStartPoint.X - lineEndPoint.X;            // B = x1 - x2
            double C = -lineStartPoint.X * A - lineStartPoint.Y * B; //C=x1*(y1-y2)+y1*(x2-x1) = x1*(-A)+y1*(-B)=-x1*(A)-y1*(B)

            var coeffs = bezierCoeffs(bezierStartPoint, bezierPoint1, bezierPoint2, bezierEndPoint);

            double[] P = new double[4];

            P[0] = A * coeffs[0].X + B * coeffs[0].Y; // t^3
            P[1] = A * coeffs[1].X + B * coeffs[1].Y; // t^2
            P[2] = A * coeffs[2].X + B * coeffs[2].Y; // t
            P[3] = A * coeffs[3].X + B * coeffs[3].Y + C;

            var r = cubicRoots(P[0], P[1], P[2], P[3]);

            List <MyPoint> X = new List <MyPoint>();
            double         t;
            MyPoint        p;
            double         s;
            double         tMt;
            double         tMtMt;

            for (int i = 0; i < 3; i++)
            {
                t     = r[i];
                tMt   = t * t;   //Это выражение используется несколько раз. Небольшая оптимизация
                tMtMt = tMt * t; //Это выражение используется несколько раз. Небольшая оптимизация
                p     = new MyPoint
                        (
                    coeffs[0].X * tMtMt + coeffs[1].X * tMt + coeffs[2].X * t + coeffs[3].X,
                    coeffs[0].Y * tMtMt + coeffs[1].Y * tMt + coeffs[2].Y * t + coeffs[3].Y
                        );

                if ((lineEndPoint.X - lineStartPoint.X) != 0)
                {
                    s = (p.X - lineStartPoint.X) / (lineEndPoint.X - lineStartPoint.X);
                }
                else
                {
                    s = (p.Y - lineStartPoint.Y) / (lineEndPoint.Y - lineStartPoint.Y);
                }

                if (t < 0 || t > 1.0 || s < 0 || s > 1.0)
                {
                    continue;
                }

                X.Add(p);
            }
            return(X.Count > 0);
        }