Базовая функция BSpline в C

#c #algorithm #bezier #curve #spline

#c #Алгоритм #Безье #кривая #сплайн

Вопрос:

Я пытаюсь вычислить кривые Bspline с заданными контрольными точками. Я исследовал Bplsines, и линия Bspline, которую я пытаюсь нарисовать, является равномерной квадратичной линией Bspline. Но я не уверен, правильно ли я понял. Пожалуйста, помогите мне с моим замешательством. Если я прав, степень каждой отдельной кривой bspline зависит от моего решения. Поэтому я хочу, чтобы они были квадратичными. И количество узлов зависит от количества контрольных точек. (количество узлов = количество контрольных точек — 2). Потому что каждый отдельный управляющий полигон будет включать три контрольные точки. Функция, которую я вычисляю вектор узла, является:

 for(int i = 0; i < numOfPoints-2; i  )
{
    if(1<=i amp;amp; i <= k)
        knotArray[i] = 0;
    else if(k   1 <= i amp;amp; i <= n   1)
        knotArray[i] = i-k;
    else if(n   2 <= i amp;amp; i <= n   k   1)
        knotArray[i] = n - k   2;

}
  

Я не знаю, правильно ли это. Согласно документации, которую я прочитал, формула для вычисления вектора узла выглядит примерно так.

И метод, который я использую для вычисления базовой функции, является:

t: параметр функции

i: базовая функция, которую я вычисляю

k: (степень кривой) 1. (в данном случае это 3 в начале)

x[]: вектор узлов

 float N(float t, float i, float k, float x[])
{
    if(k == 1)  //k = n   1 (n is the degree of the curve)
    {
        if(x[i] <= t amp;amp; t <= x[i 1])
            return 1;
        else
            return 0;
}


     return (t - x[i] / x[i k-1] - x[i]) * N(t, i, k-1, x)   (x[i k] - t / x[i k] - x[i 1])* N(t,  i 1, k-1, x);
}
  

Формула базовой функции

Он даже не компилирует код, и я ищу ошибку по крайней мере 3 часа.

Если кто-нибудь из пациентов сможет научить меня основам кривой Bspline, я буду очень благодарен.

Комментарии:

1. x[i] Почему вы хотите использовать a float в качестве индекса массива? То же k самое, почему не an int ? Если ваш код не компилируется, вы должны хотя бы показывать сообщения об ошибках. И предоставьте полный пример, а не только несколько несвязанных фрагментов.

2. Вы знаете основные математические правила, не так ли? Они также действительны в C. Это (t - x[i] / x[i k-1] - x[i]) не то, что показано в вашей формуле. Это то же t - (x[i] / x[i k-1]) - x[i] самое, что и пока вам нужно (t - x[i]) / (x[i k-1] - x[i]) . Добавьте скобки для обеспечения приоритета.

3. Вы можете добавить ссылку на документ, который вы использовали в качестве ссылки.

4. Пожалуйста, имейте в виду, что когда x[i k-1] == x[i] или x[i k] == x[i 1] , знаменатель в вашем выражении будет равен нулю. Поэтому не возвращайте само выражение. Сначала вычислите результат выражения и проверьте, равен ли знаменатель нулю. После этого вы можете безопасно вернуть результат.

5. Да, этот код, похоже, не соответствует тому, что они должны реализовывать .