У меня есть массив точек, рассчитанный заранее для кривой Безье степени 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 для всех я