Fit параметрическая кривая в Math.Net - PullRequest
0 голосов
/ 17 марта 2020

У меня есть массив точек, рассчитанный заранее для кривой Безье степени N. Для оптимизированной кривой Безье есть функция Y (t_i) в зависимости от двух параметров p0 и p1 , которые влияют на его форму и которые меня интересуют. Функция также возвращает точку в зависимости от параметра t_i .

Как я могу использовать Math. Net Numerics.Fit для выбора параметров p0 и p1?

            private double BernsteinPolynom(int n, int k, double t)
            {
                return SpecialFunctions.Binomial(n, k) * Math.Pow(t, k) * Math.Pow(1 - t, n - k);
            }


            private Point CalculateBezierPoint(double t)
            {
                Point result = new Point(0,0);
                int n = controlPoints.Count - 1;
                for (int k = 0; k <= n; k++)
                {
                    result += (Vector)controlPoints[k]*BernsteinPolynom(n,k,t);
                }
                return result;
            }

            private Point Yt_i(double p0, double p1, double t_i)
            {
                int n = controlPoints.Count - 1;
                Point result = new Point(0,0);
                result += (Vector)controlPoints[0] * BernsteinPolynom(3, 0, t_i);
                result += (Vector)controlPoints[0] * BernsteinPolynom(3, 1, t_i);
                result += (Vector)controlPoints[n] * BernsteinPolynom(3, 2, t_i);
                result += (Vector)controlPoints[n] * BernsteinPolynom(3, 3, t_i);


                result += (p0 * (Vector)(controlPoints[1] - (Vector)controlPoints[0    ]) * BernsteinPolynom(3, 1, t_i));
                result += (p1 * (Vector)(controlPoints[n] - (Vector)controlPoints[n - 1]) * BernsteinPolynom(3, 2, t_i));

                return result;
            }

       //main
       int n = controlPoints.Count-1;
       List<Point> X = new List<Point>(controlPoints);
       Point[] P_i = new Point[n + 1];
       double[] t_i = new double[n + 1];
       double[][] xy = new double[2][];
       for (int i = 0; i <= n; i++)
       {
          t_i[i] = i / n;
          P_i[i] = CalculateBezierPoint(t_i[i]);
       }

Мне нужно свернуть (P_i [i] -Yt_i (p0, p1, t_i [i])) ^ 2 для всех я

...