================ BEZIER3(平面の有理ベジエ曲線) ================ Mapleを用いた実習を行います. Mapleを起動してください. 適当にプログラムの中の数字などを変更して試してみてください. 以下の説明の中で*****ではさまれた部分は Mapleに入力する文字列です.自分で入力あるいはコピーし Enter(Return) キーで実行します. 上から順に,すべて実行するようにしてください. 上で定義した関数を後で利用すること があります. 関数のグラフを描くにはパッケイジ plots と plottools を用います.また,線形代数のパッケイジ linalgも用います. ****** with(linalg): with(PolynomialTools): with(plots): with(plottools): ****** 有理曲線のベジエ点と重みを求めましょう. まず次を入力してください. ***** projectparameterlist:=proc(rationalfunlist) local pp; pp:=[lcm(denom(rationalfunlist[1]),denom(rationalfunlist[2]))*(rationalfunlist[1]), lcm(denom(rationalfunlist[1]),denom(rationalfunlist[2]))*(rationalfunlist[2]), lcm(denom(rationalfunlist[1]),denom(rationalfunlist[2]))]; end: ***** 4分の1円のベジエ点と重みを求めましょう. ***** LL:=[(1 - t^2)/(1 + t^2), (2*t)/(1 + t^2)]; ***** ***** AA:=projectparameterlist(factor(LL)); ***** ***** mm:=max(degree(AA[1], t), degree(AA[2], t),degree(AA[3], t)); m:=eval(mm)+1; ***** ***** f := (i,j)-> binomial(j-1, i-1)/binomial(m-1, i-1): Matrix(m,f); ***** ***** b1:= j->coeff(AA[1], t,j) ; b2:= j->coeff(AA[2], t,j) ; b3:= j->coeff(AA[3], t,j) ; ***** ***** v := array(1..m): for i to m do v[i] :=[b1(i-1),b2(i-1), b3(i-1)] end do: ***** ***** print(v); ***** ***** LL:= transpose(evalm( transpose(v) &* Matrix(m,f))); ***** ***** ratbez:=array(1..m): for i to m do ratbez[i]:=[ LL[i][1]/LL[i][3], LL[i][2]/LL[i][3]] end do: ***** ***** print(ratbez); ***** ***** weight:=array(1..m): for i to m do weight[i]:=LL[i][3] end do: ***** ***** print(weight); ***** ***** rationalbezier1:=proc(L,W, clr, thk, r,s) local n, b, bb; n:=nops(L)-1; b:= [sum(n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*L[k+1][1]*W[k+1], k=0..n)/(sum(n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1], k=0..n)), sum(n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*L[k+1][2]*W[k+1], k=0..n)/(sum(n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1],k=0..n))]: bb:=plot([b[1], b[2], u=r..s], color=clr, thickness=thk); end: ***** ***** rationalbezier1(convert(ratbez,'list'), convert(weight,'list'), blue,2, 0,1); ***** 半円のベジエ点と重みを求めましょう. ***** LL:=[(2*t-1)/(1 -2*t+ 2*t^2), (2*t*(1-t))/(1 -2*t+ 2*t^2)]; ***** 重みが0のときは,次数上げをして,重みを正にします, ***** mm:=max(degree(AA[1], t), degree(AA[2], t),degree(AA[3], t)); m:=eval(mm)+2; ***** 次の場合にも,同様のことをして,求めましょう. ***** LL:=[2*(t)/(1+(t)^2), 4*(t)*(1-(t)^2)/(1+(t)^2)^2] ***** ***** LL:=[2*(2*t-1)/(1+(2*t-1)^2), 4*(2*t-1)*(1-(2*t-1)^2)/(1+(2*t-1)^2)^2]; ***** いろいろな有理曲線のベジエ点と重みを求めましょう. 何かおもしろそうなものができたら、教えて下さい.