Funciones Básicas
Subrutina para generar funciones básicas de B-Splines para vectores con nodos abiertos.
c = orden de la función básica del B-spline
d = primer término de la relación recursiva de la función básica
e = segundo término de la relación recursiva de la función básica
npts = número de puntos que definen el polígono (puntos iniciales)
n(,) = array que contiene las funciones básicas
nplusc = constante (npts + c). Máximo número de valores de nodo
t = valor del parámetro
temp() = array temporal
x() = vector de nodos
subrutina basicas(c,t,npts,x();n(,))
dimension temp(20)
nplusc = npts+c
Se calcula el primer orden de las funciones básicas
for i=1 to nplusc-1
if t>=x(i) and t<x(i+1) then
temp(i)=1
else
temp(i)=0
end if
next i
Calcular las funciones básicas de mayor orden
for k=2 to c
for i=1 to nplusc-k
if temp(i)<>0 then
d=((t-x(i))*temp(i))/(x(i+k-1)-x(i))
else
d=0
end if
if temp(i+1)<>0 then
e=((x(i+k)-t)*temp(i+1))/(x(i+k)-x(i+1))
else
e=0
end if
temp(i)=d+e
next i
next k
if t = x(nplusc) then temp(npts)=1
Poner en un array
for i=1 to npts
n(1,i)=temp(i)
next i
if t=x(nplusc) then n(1,npts)=1
return
Nodos abiertos
Subrutina para generar vector de nodos abiertos para B-Splines.
c = orden de la función básica del B-spline
n = número de puntos que definen el polígono (puntos iniciales)
nplusc = constante (npts + c). Máximo número de valores de nodo
x() = vector de nodos
subrutina nodos(n,c;x())
nplusc = n+c
nplus2 = n+2
for i=2 to nplusc-1
if t>c and i<nplus2 then
x(i)=x(i-1)+1
else
x(i)=x(i-1)
end if
next i
return
Nodos uniformes
Subrutina para generar vector de nodos uniformes para B-Splines.
c = orden de la función básica del B-spline
n = número de puntos que definen el polígono (puntos iniciales)
nplusc = constante (npts + c). Máximo número de valores de nodo
x() = vector de nodos
subrutina nodos(n,c;x())
nplusc = n+c
for i=1 to nplusc
x(i)=(i-1)
next i
return
B-Splines abiertos
Subrutina para generar B-Splines con nodos abiertos.
b(,) = array que contiene los vertices
b(,) = array que contiene los puntos de la curva
k = orden de la función básica del B-spline
nbasis = array con las funciones basicas para un simple valor
npts = número de puntos que definen el polígono (puntos iniciales)
nplusc = constante (npts + c). Máximo número de valores de nodo
t = valor del parámetro
x() = vector de nodos
p1 = núnero de puntos para ser calculado en la curva
subrutina bspline(k,p1,npts,b(,);p(,))
dimension nbasis(1,20),x(30),temp(1,3)
nplusc = npts+k
Inicialización del vector de nodos y del array de funciones basicas
Mat nbasis = Zer(1,npts)
Mat x = Zer(nplusc)
Generar el vector de nodos uniformes
Call nodos(npts,k;x)
icount = 0
Calcular los puntos de la curva del b-spline
for t=0 to x(npts+k) step x(npts+k)/(p1-1)
icount = icount+1
Call Basicas(k,t,npts,x;nbasis)
Mat temp=nbasis*b
p(icount,1)=temp(1,1)
p(icount,2)=temp(1,2)
p(icount,3)=temp(1,3)
next t
return
B-Splines uniformes
Subrutina para generar B-Splines uniformes.
b(,) = array que contiene los vertices
b(,) = array que contiene los puntos de la curva
k = orden de la función básica del B-spline
nbasis = array con las funciones basicas para un simple valor
npts = número de puntos que definen el polígono (puntos iniciales)
nplusc = constante (npts + c). Máximo número de valores de nodo
t = valor del parámetro
x() = vector de nodos
p1 = núnero de puntos para ser calculado en la curva
subrutina bspline(k,p1,npts,b(,);p(,))
dimension nbasis(1,20),x(30),temp(1,3)
nplusc = npts+k
Inicialización del vector de nodos y del array de funciones basicas
Mat nbasis = Zer(1,npts)
Mat x = Zer(nplusc)
Generar el vector de nodos uniformes
Call nodos(npts,k;x)
icount = 0
Calcular los puntos de la curva del b-spline
for t=(k-1) to (npts) step (npts-k-1)/(p1-1)
icount = icount+1
Call Basicas(k,t,npts,x;nbasis)
Mat temp=nbasis*b
p(icount,1)=temp(1,1)
p(icount,2)=temp(1,2)
next t
return
|