> restart; > with(plots): with(linalg): > deboor1 :=proc(degree,coeff1,knot,u) > # De Boor Agorithmus zur Berechnung einer Koordinate der > # B-spline-Kurve fuer den Parameterwert u im Intervall i > # degree: Polynomgrad der B-spline-Kurve s > # coeff1: Kontrollpunkte der B-spline-Kurve s > # knot: Knotenfolge > # u: Parameterwert, berechnet wird s(u) > # i: u's interval: knot[i]<= u < knot[i+1] > # output: s(u) > #option trace; > local k,j,t1,t2,coeffa,kn,i; > coeffa:=vector(30); > kn:=vectdim(knot); > i:=degree; > for j from 2 to kn-1 do if u > knot[j] then i:=j fi od; > for j from i-degree+1 to i+1 do coeffa[j] :=coeff1[j] od; > for k from 1 to degree do > for j from i+1 by (-1) to i-degree+k+1 do > t1 := (knot[j+degree-k] - u )/(knot[j+degree-k]-knot[j-1]); > t2 := 1.0-t1; > coeffa[j] :=t1* coeffa[j-1]+t2* coeffa[j]; > od > od; > RETURN(coeffa[i+1]) > end: > > # Grad 3 (kubische Splinekurve) > knot:=vector(19,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10]): # > Knotenvektor > coeff1:=vector(14): coeff0:=vector(14): > # y-Koordinate der Kontrollpunkte > for j from 1 to 14 do > coeff1[j]:=evalf(sin(2*knot[j+3]+1)+cos(knot[j+3]-3/2)) od: > # spezielle x-Koordinate fŸr kubische Splines > for j from 1 to 14 do > coeff0[j]:=evalf((knot[j+3]+knot[j+4]+knot[j+5])/3) od: > m:=101: > z:= vector(m): > a:=-5: b:=5: h:=(b-a)/(m-1): > for j from 1 to m do z[j]:=evalf(a+ (j-1)*h) od: > #Anwendung des DeBoor Algorithmus fŸr y-Koordinate und x-Koordinate > for j from 1 to m do s[j]:=deboor1(3,coeff1,knot,z[j]); > s0[j]:=deboor1(3,coeff0,knot,z[j]) od: > # plotsetup(ps,plotoutput=`plot1.ps`,plotoptions=`noborder`); > F:=listplot([seq([s0[t],s[t]],t=1..m)],axes=NONE): #Druck der > B-Spline-Kurve > G:=listplot([seq([coeff0[t],coeff1[t]],t=1..14)],axes=NONE): #Druck > des Kontrollpolygons > > H:=pointplot([seq([coeff0[t],coeff1[t]],t=1..14)],axes=NONE,symbol=CIR > CLE): #Druck der Kontrollpunkte > display({F,G,H}); > > > #Grad 2 (quadratische Splinekurve) > knot:=vector(18,[-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9]): # > Knotenvektor > coeff1:=vector(15): coeff0:=vector(15): > # y-Koordinate der Kontrollpunkte > for j from 1 to 15 do > coeff1[j]:=evalf(sin(2*knot[j+2]+1)+cos(knot[j+2]-3/2)) od: > # spezielle x-Koordinate fŸr quadratische Splines > for j from 1 to 15 do coeff0[j]:=evalf((knot[j+2]+knot[j+3])/2) od: > m:=101: > z:= vector(m): > a:=-6: b:=6: h:=(b-a)/(m-1): > for j from 1 to m do z[j]:=evalf(a+ (j-1)*h) od: > #Anwendung des DeBoor Algorithmus fŸr y-Koordinate und x-Koordinate > for j from 1 to m do s[j]:=deboor1(2,coeff1,knot,z[j]); > s0[j]:=deboor1(2,coeff0,knot,z[j]) od: > # plotsetup(ps,plotoutput=`plot1.ps`,plotoptions=`noborder`); > F:=listplot([seq([s0[t],s[t]],t=1..m)],axes=NONE): > G:=listplot([seq([coeff0[t],coeff1[t]],t=1..15)],axes=NONE): > > H:=pointplot([seq([coeff0[t],coeff1[t]],t=1..15)],axes=NONE,symbol=CIR > CLE): > display({F,G,H}); Warning, new definition for norm Warning, new definition for trace >