Глава V
5.2. Вставка узла

Пусть `C^w(u)=∑_(i=0)^nN_(i,p)(u)P_i^w` будет NURBS кривой определённой на `U=``{u_0,…,u_m}`. Пусть `bar u in [u_k,u_{k+1})`, и вставьте `bar u` в `U`, чтобы сформировать новый узло­вой вектор `bar U={bar u_0=u_0,…,bar u_k=u_k, bar u_{k+1}=bar u, bar u_{k+2}=u_{k+1},…,bar u_{m+1}=u_m}`. Если `V_U` и `V_{bar U}` обозначим векторное пространство кривых, определенных на `U` и `bar U`, соответственно, то, очевидно `V_U∈V_{bar U}` (и `dim(V_{bar U}=dim(V_U)+1`); Таким образом, `C^w(u)` имеет представление о `bar U` в форме

`C^w(u)=sum_(i=0)^(n+1)bar N_(i,p)(u)Q_i^w`(5.1)

где `{bar N_(i,p)(u)}` являются базисной функцией `p`-ой степени на `bar U`. Термин вставка узла обычно относится к процессу определения `{Q_i^w}` в уравнении (5.1). Важно отметить, что вставка узла действительно только изменение векторного пространства базиса; Кривая не изменяется, ни геометрически ни параметрически.

Хотя это и не сразу видно, вставка узла является одним из наиболее важных из всех алгоритмов B-сплайнов. Некоторые из его использований являются:

Теперь `{Q_i^w}` в уравнении (5.1) могут быть получены путем постановки и решения системы линейных уравнений. Если мы установим

`sum_(i=0)^nN_(i,p)(u)P_i^w=sum_(i=0)^(n+1)bar N_(i,p)(u)Q_i^w`(5.2)

затем, подставив `n+2` подходящих значений и в уравнение (5.2), мы получим не единственную, общую систему `n+2` линейных уравнений с `n+2` неизвестных, `Q_i^w`. Тем не менее, существует более эффективное решение. Из свойства Св.2.2 и `bar u in [u_k,u_{k+1})` следует, что

`sum_(i=k-p)^kN_(i,p)(u)P_i^w=sum_(i=k-p)^(k+1)bar N_(i,p)(u)Q_i^w`(5.3)

Для всех `u ∈ [u_k,u_(k+1))`, и

`N_(i,p)(u)=bar N_(i,p)(u)`   `i=0,…,k-p-1`

`N_(i,p)(u)=bar N_(i+1,p)(u)`   `i=k+1,…,n`(5.4)

Из уравнений (5.3) и (5.4) вместе с линейной независимостью базисных функций (раздел 2.4), следует, что

`P_i^w=Q_i^w`   `i=0,…,k-p-1`

`P_i^w=Q_(i+1)^w`   `i=k+1,…,n(5.5)

Теперь рассмотрим `N_(i,p)(u)` для `i=k-p,…,k`. Они могут быть выражены в терминах `bar N_(i,p)(u)` при `i=k-p,…,k+1`, путем

`N_(i,p)(u)=(bar u - bar u_i)/(bar u_(i+p+1) - bar u_i)bar N_(i,p)(u)+(bar u_(i+p+2) - bar u)/(bar u_(i+p+2) - bar u_(i+1))bar N_(i+1,p)(u)`(5.6)

Уравнение (5.6) доказано индукцией по `p` (и по формуле [2.5]), но мы опускаем его здесь, так как оно довольно грязное. Доказательства, использующие разделенные разности встречаются в [DeBo78; Boeh80; Lee83].

Для краткости мы сейчас запишем `bar N_i` для `bar N_(i,p)(u)`. Подставляя (5.6) в уравнение (5.3) получаем

`((bar u-bar u_(k-p))/(bar u_(k+1)- bar u_(k-p))bar N_(k-p)+(bar u_(k+2) - bar u)/(bar u_(k+2)-bar u_(k-p+1))bar N_(k-p+1))P_(k-p)^w`

`+((bar u- bar u_(k-p+1))/(bar u_(k+2) - bar u_(k-p+1))bar N_(k-p+1)+(bar u_(k+3) - bar u)/(bar u_(k+3) - bar u_(k-p+2))bar N_(k-p+2))P_(k-p+1)^w`

`vdots`

`+((bar u - bar u_k)/(bar u_(k+p+1) - bar u_k )bar N_k+(bar u_(k+p+2) - bar u)/( bar u_(k+p+2) - bar u_(k+1)) bar N_(k+1))P_k^w=bar N_(k-p)Q_(k-p)^w+⋯+bar N_(k+1)Q_(k+1)^w`

Приравняв коэффициенты и используя узловой вектор `U` вместо `bar U`, мы получим

`0=bar N_(k-p)(Q_(k-p)^w-P_(k-p)^w)+bar N_(k-p+1)(Q_(k-p+1)^w-(bar u - bar u_(k-p+1))/(bar u_(k+1) - bar u_(k-p+1))P_(k-p+1)^w+(bar u_(k+1)-bar u)/(bar u_(k+1) - bar u_(k-p+1))P_(k-p)^w)+⋯+`

`bar N_k(Q_k^w-(bar u - bar u_k)/(bar u_(k+p) - bar u_k)P_k^w+(bar u_(k+p) - bar u)/(bar u_(k+p) - bar u_k)P_(k-1)^w) + bar N_(k+1)(Q_(k+1)^w-P_k^w)`(5.7)

Для `i=k-p+1,…,k`, мы установим

`α_i=(bar u-u_i)/(u_(i+p)-u_i)`(5.8)

И отмечаем, что

`1-α_i=(u_(i+p) - bar u)/(u_(i+p)-u_i)`(5.9)

Использование линейной независимости базисных функций и подставляя формулы (5.8) и (5.9) в уравнение (5.7) получаем

`Q_(k-p)^w=P_(k-p)^w`

`Q_i^w=α_i P_i^w+(1-α_i)P_(i-1)^w`   `k-p+1≤i≤k`

`Q_(k+1)^w=P_k^w`(5.10)

Наконец, комбинируя формулы (5.5) и (5.10) , мы получим формулу для вычисления всех новых контрольных точек, `Q_i^w`, уравнения (5.1), т.е.

`Q_i^w=α_i P_i^w+(1-α_i)P_(i-1)^w`(5.11)

где

`α_i={(1,i≤k-p), ((bar u-u_i)/(u_(i+p)-u_i),k-p+1≤i≤k),(0,i≥k+1):}`

Уравнение (5.11) говорит, что только `p` новых контрольных точек должно быть вычислено. Для краткости мы используем `P` вместо `P^w` в примерах Пример5.1 - Пример5.4.

...

...

...

...

``

``(5.11)