#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]
Почему вы хотите использовать afloat
в качестве индекса массива? То жеk
самое, почему не anint
? Если ваш код не компилируется, вы должны хотя бы показывать сообщения об ошибках. И предоставьте полный пример, а не только несколько несвязанных фрагментов.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. Да, этот код, похоже, не соответствует тому, что они должны реализовывать .