================ beziersurface1 ================ Mathematicaを用いた練習を行います。 Mathematica は毎回使いますから、GNOMEパネルの ランチャーに登録しておきましょう。 Mathematica は 「センターメニュー」-「アプリケーション」-「Mathematic数式処理」 にあります。 適当にプログラムの中の数字などを変更して試してみてください。 以下の説明の中で*****ではさまれた部分は Mathematica に入力する文字列です。自分で入力し Shift+Enter(Return) キーで実行します。 上から順に,すべて実行するようにしてください。 上で定義した関数を後で利用すること があります。 これまで、ベジエ曲線を用いて、回転面を作ったり、 曲線からチューブ状のものを作ることを考えました。 曲面は形を変えながら空間内を移動する曲線の軌跡と考えて、 ベジエ曲線を用いることにより、テンソル積ベジエ曲面が定義できる。 (参考テキスト: ベジエ曲線とベジエ曲面  ページ 23〜24参照) テンソル積ベジエ曲面の方法で曲面を描いてみましょう。 ******* Cn[s_]:=n!/(s!*(n-s)!) Cm[s_]:=m!/(s!*(m-s)!) Bn[s_,u_]:=Cn[s]*(u^s)*((1-u)^(n-s)) Bm[s_,u_]:=Cm[s]*(u^s)*((1-u)^(m-s)) A:=Sum[Sum[bb[j][k]*Bn[j,u]*Bm[k,v], {j,0,n}],{k,0,m}] S:=Sum[Sum[ww[j][k]*bb[j][k]*Bn[j,u]*Bm[k,v], {j,0,n}],{k,0,m}]/(Sum[Sum[ww[j][k]*Bn[j,u]*Bm[k,v], {j,0,n}],{k,0,m}]) ******* ******* BezSurface[a_,b_,c_,d_]:=ParametricPlot3D[ Evaluate[A],{u,a,b},{v,c,d}, AspectRatio->Automatic] RatBezSurface[a_,b_,c_,d_]:=ParametricPlot3D[ Evaluate[S],{u,a,b},{v,c,d}, AspectRatio->1] ******* まず、双曲放物面を描いてみましょう。 ******* n=1 m=1 bb[0][0]={0, 0, 0} bb[0][1]={0, 1, 0} bb[1][0]={1, 0, 0} bb[1][1]={1, 1, 1} AA1=BezSurface[-1,1,-1,1] ******* いろいろな方向から曲面をみてみましょう。 ******* Show[AA1, ViewPoint -> {2, - 2, 0.5}] ******* ******* Show[AA1, ViewPoint -> {2, 2, 0.5}] ******* ******* Show[AA1, ViewPoint -> {2, -4, -0.5}] ******* つぎに放物線の上を直線が動く場合の曲面を描きましょう。 ******* n = 1 m = 2 bb[0][0] = {-1, 1, 0}; bb[0][1] = {0, -1, 0}; bb[0][2] = {1, 1, 0}; bb[1][0] = {-1, 1, 1}; bb[1][1] = {0, -1, 1}; bb[1][2] = {1, 1, 1}; Bez1 = BezSurface[0, 1, 0, 1] ******* ******* Show[Bez1, ViewPoint -> {-1, 1, 1}] ******* ******* n = 2 m = 2 bb[0][0] = {0, 0, 0}; bb[0][1] = {0, 1, 1}; bb[0][2] = {0, 2, 0}; bb[1][0] = {1, 0, 1}; bb[1][1] = {1, 1, 2}; bb[1][2] = {1, 2, 1}; bb[2][0] = {2, 0, 0}; bb[2][1] = {2, 1, 1}; bb[2][2] = {2, 2, 0}; Bez2 = BezSurface[0, 1, 0, 1] ******* ******* Show[Bez2, ViewPoint -> {-1, -1, 0}] ******* ******* n = 2 m = 2 bb[0][0] = {1, 0, 0}; bb[0][1] = {1, 0, 1}; bb[0][2] = {0, 0, 1}; bb[1][0] = {1, 1, 0}; bb[1][1] = {1, 1, 1}; bb[1][2] = {0, 0, 1}; bb[2][0] = {0, 1, 0}; bb[2][1] = {0, 1, 1}; bb[2][2] = {0, 0, 1}; Bez3 = BezSurface[0, 1, 0, 1] ******* ******* Show[Bez3, ViewPoint -> {-1, -1, 0}] ******* ******* Bez4= BezSurface[-1, 1, -1, 1] ******* ******* Show[Bez4, ViewPoint -> {-1, -1, 0}] ******* つぎに円弧の上を直線が動く場合の曲面を描きましょう。 ******* n = 1 m = 2 ww[0][0] = 1; ww[0][1] = 1; ww[0][2] = 2; ww[1][0] = 1; ww[1][1] = 1; ww[1][2] = 2; bb[0][0] = {0, 1, 0}; bb[0][1] = {1, 1, 0}; bb[0][2] = {1, 0, 0}; bb[1][0] = {0, 1, 1}; bb[1][1] = {1, 1, 1}; bb[1][2] = {1, 0, 1}; ratbez1 = RatBezSurface[0, 1, -1, 1] ******* ******* Show[ratbez1, ViewPoint -> {-1, 1, -1}] ******* ******* n = 2 m = 2 ww[0][0] = 1; ww[0][1] = 1; ww[0][2] = 2; ww[1][0] = 1; ww[1][1] = 1; ww[1][2] = 2; ww[2][0] = 2; ww[2][1] = 2; ww[2][2] = 4; bb[0][0] = {0, 0, 0}; bb[0][1] = {0, 1, 1}; bb[0][2] = {0, 2, 0}; bb[1][0] = {1, 0, 1}; bb[1][1] = {1, 1, 2}; bb[1][2] = {1, 2, 1}; bb[2][0] = {2, 0, 0}; bb[2][1] = {2, 1, 1}; bb[2][2] = {2, 2, 0}; ratbez2 = RatBezSurface[0, 1, 0, 1] ******* ******* Show[ratbez2, ViewPoint -> {-1, -1, 0}] ******* 球面の8分の1を描きましょう。 ******* m=2; n=2; ww[0][0]=1; ww[0][1]=1; ww[0][2]=2; ww[1][0]=1; ww[1][1]=1; ww[1][2]=2; ww[2][0]=2; ww[2][1]=2; ww[2][2]=4; bb[0][0]={1,0,0}; bb[0][1]={1,0,1}; bb[0][2]={0,0,1}; bb[1][0]={1,1,0}; bb[1][1]={1,1,1}; bb[1][2]={0,0,1}; bb[2][0]={0,1,0}; bb[2][1]={0,1,1}; bb[2][2]={0,0,1}; ratbez3=RatBezSurface[0,1,0,1] ******* ******* ratbez4=RatBezSurface[-1,1,-1,1] ******* ******* Show[ratbez4, ViewPoint -> {-1, -1, 0}] ******* 今日の課題 テンソル積ベジエ曲面を用いて、曲面を作りましょう。 n, m の値や点 bb[i][j] の値を変えてみましょう。 重み ww[i][j] の値も変えてみましょう。