Graphics Reference
In-Depth Information
begin
real array
a [0..] , b [0..];
boolean
fromRight;
if
m = 0
then
begin
derivs[0] := ctrls[0];
return;
end
;
for
i:=1
to
m
do
begin
a[i] := u - knots[i];
b[i] := knots[m+i] - u;
end
;
fromRight := (b[1] > a[m]);
if
fromRight
then
begin
for
i:=0
to
m
do
derivs[i] := ctrls[i];
for
j:=1
to
m
do
for
i:=0
to
m-j
do
derivs[i] := (1.0/(a[i+j]+b[i+1]))*
(a[i+j]*derivs[i+1] + b[i+1]*derivs[i]);
for
j:=1
to
d
do
for
i:=d
downto
j
do
derivs[i] := ((m-j+1)/b[i-j+1])*(derivs[i] - derivs[i-1]);
end
else
begin
for
i:=0
to
m
do
derivs[i] := ctrls[m-i];
for
j:=1
to
m
do
for
i:=0
to
m-j
do
derivs[i] := (1.0/(a[m-i]+b[m-j+1-i]))*
(b[m-j+1-i]*derivs[i+1] + a[m-i]*derivs[i]);
for
j:=1
to
d
do
for
i:=d
downto
j
do
derivs[i] := (-(m-j+1)/a[m-i+j])* (derivs[i] - derivs[i-1]);
end
end
;
Algorithm 11.5.4.2.
Continued