Р(2) - У0, Р(3) = у,, р(А) - у2.....р(7) - у5.
Поскольку В-сплайн функции при целых значениях с принимают только значения 0, 1/6 и 4/6, то шесть указанных выше условий принимают вид:
4с0 + с, - 6у0, с0 + 4с, + с2 - 6#,, с, + 4с2 + с3 - 6у2, (11.101)
сА+4с5-6у5.
Эти уравнения почти идентичны уравнениям (11.76) и (11.77), поэтому их можно решить методами, описанными в разделе 11.10.3.
Все эти идеи легко могут быть распространены на любое число заданных точек у0,у1.....yL, для любого нужного L. Напишите функцию
void adjust (double у[]. double с[]. int L)
которая по заданному массиву у[] создает массив с[].
Для интерполяции точек pi - (xjt у) описанный процесс выполняется один раз для х-компонентов и один раз для ^-компонентов, в результате чего создаются массивы x_new[] и y_new[]. Тогда интерполирующая кривая задается формулой:
p(t)= ХВД.4(0.
1 = 0
где Wi = (x_new[], y_new[]). Пример такой кривой приведен на рис. 11.66.
11.13. Тематические задания
Рис. 11.66. Пример двумерной интерполяции B-сплайнами (с разрешения Tuan Le Ngoc)
Напишите программу, которая позволяет пользователю задавать с помощью мыши последовательность из (L + 1) контрольных точек, а затем рисует интерполирующую кривую на базе кубических B-сплайнов. Поэкспериментируйте с различными значениями L.
Дополнительное задание. Расширьте свою программу так, чтобы она рисовала замкнутые кривые, интерполирующие контрольные точки. Какие изменения должны быть для этого сделаны в уравнении (11.101)?
Тематическое задание 11.7. Интерполяция кубическими полиномами Уровень сложности III.
Напишите программу, которая позволяет пользователю задавать с помощью мыши последовательность из (L +1) контрольных точек, а затем рисует интерполирующую кривую на базе кубических полиномов. Скорости на внутренних стыках задаются с помощью метода Кочанека-Бартелса при определенных значениях параметров натяжения, смещенности и непрерывности. Два оставшихся условия на кубические коэффициенты определяются исходя из требования, чтобы вторые производные на концевых контрольных точках равнялись нулю.