================ Rotation Surface2 ================ Mathematicaを用いた練習を行います。 Mathematica は毎回使いますから、GNOMEパネルの ランチャーに登録しておきましょう。 Mathematica は 「センターメニュー」-「アプリケーション」-「Mathematic数式処理」 にあります。 適当にプログラムの中の数字などを変更して試してみてください。 以下の説明の中で*****ではさまれた部分は Mathematica に入力する文字列です。自分で入力し Shift+Enter(Return) キーで実行します。 上から順に,すべて実行するようにしてください。 上で定義した関数を後で利用すること があります。 先週は、ベジエ曲線を用いて、回転面を作ってみました。 例えば、回転面でカップを作ったとき、 取っ手をつけるにはどうしたらよいかを考えてみましょう。 曲線からチューブ状のものを作ることを考えましょう。 (3次元空間内の曲線に対するフレネ・セーレの公式を用います。) ****** CCCR[u_List, v_List]:= RotateLeft[u RotateLeft[v] -RotateLeft[u] v] /; Length[u] \[Equal]Length[v] \[Equal] 3 tangent[curve_][t_]:=D[curve[tt],tt]/ Simplify[Factor[D[curve[tt], tt].D[curve[tt], tt]]]^(1/2) /. tt\[Rule]t binormal[curve_][t_]:=Simplify[CCCR[D[curve[tt],tt],D[curve[tt],{tt, 2}]]]/ Simplify[Factor[CCCR[D[curve[tt],tt],D[curve[tt],{tt, 2}]]. CCCR[D[curve[tt],tt],D[curve[tt],{tt, 2}]]]]^(1/2) /.tt\[Rule]t normalll[curve_][t_]:=CCCR[binormal[curve][t], tangent[curve][t]] tubecurve[ff_][r_][t_, theta_]:=ff[t] + r*(Cos[theta] normalll[ff][t] +Sin[theta] binormal[ff][t])/2 tubecurve10[ff_][r_][a_, b_][t_, theta_]:=ff[t] + r*(a*Cos[theta] normalll[ff][t] +b*Sin[theta] binormal[ff][t])/2 seashell[ff_][r_][t_, theta_]:= ff[t] +t*r* (Cos[theta] normalll[ff][t] +Sin[theta] binormal[ff][t]) Needs["Graphics`Colors`"] Cn[s_] := n!/(s!*(n - s)!) Bn[s_, u_] := Cn[s]*(u^s)*((1 - u)^(n - s)) SS[n_] := Sum[b[j]*Bn[j, t], {j, 0, n}] AA[n_] := Sum[w[j]*b[j]*Bn[j, t], {j, 0, n}]/Sum[w[j]*Bn[j, t], {j, 0, n}] L[n_] := Table[(1 - t)*b[i] + t*b[i + 1], {i, 0, n - 1}] Bezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> True, PlotRange -> All] RatBezCurve:= ParametricPlot[Evaluate[AA[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> True, PlotRange -> All] B2Poly := ParametricPlot[Evaluate[L[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> True, PlotStyle -> {Thickness[0.005]}] ****** まず、放物線からチューブを作りましょう。 ****** n = 2 b[0] = {1, 0} b[1] = {1, 1} b[2] = {0, 1} Bezier hh1 = SS[n] ****** ****** h1[u_] := {hh1[[1]], 0, hh1[[2]]} /. t -> u WW1 = ParametricPlot3D[ tubecurve[h1][.4][t, theta] // Evaluate, {theta, 0, 2*Pi}, {t, 0, 1}] ****** 円からチューブを作りましょう。何ができますか? ****** h2[u_] := {Cos[u] + 2, Sin[u] - 1, -1} /. t -> u WW2 = ParametricPlot3D[ tubecurve[h2][.8][t, theta] // Evaluate, {theta, 0, 2*Pi}, {t, 0, 2*Pi}, PlotRange -> All, PlotPoints -> {20, 40}] ****** 色をつけてみましょう。 ****** ParametricPlot3D[ Append[tubecurve[h1][.4][t, theta], FaceForm[Red, Pink]] // Evaluate, {t, 0, 1}, {theta, 0, 2*Pi}, PlotRange -> All, Lighting -> False] ****** ****** ParametricPlot3D[ Append[tubecurve[h2][.4][t, theta], FaceForm[Red, Pink]] // Evaluate, {t, 0, 2* Pi}, {theta, -Pi/2, Pi/2}, PlotRange -> All, PlotPoints -> {24, 16}, Lighting -> False] ****** しゃぶしゃぶ鍋? ****** h20[u_] := {5*Cos[u] + 2, 5*Sin[u] - 1, 5} /. t -> u ****** ****** ParametricPlot3D[ tubecurve10[h20][4][2, 4][t, theta] // Evaluate, {theta, -Pi, Pi/8}, {t, 0, 2*Pi}, PlotRange -> All, PlotPoints -> {20, 40}] ****** seashellを用いて曲面を作ってみましょう。 ****** h3[u_]:={u*Cos[u], u*Sin[u],-3*u}/.t\[Rule]u ParametricPlot3D[h3[t]//Evaluate, {t, 0,6*Pi}, PlotRange\[Rule]All] ****** ****** WW3 = ParametricPlot3D[ seashell[h3][.5][t, theta] // Evaluate, {theta, 0, 2*Pi}, {t, 0, 8*Pi}, PlotRange -> All, PlotPoints -> {20, 80}] ****** ****** Show[WW3, ViewPoint -> {1.5, 2.5, -0.4}] ****** ****** ParametricPlot3D[ Append[seashell[h3][.5][t, theta], FaceForm[LightBlue, Pink]] // Evaluate, {theta, 0, 2*Pi}, {t, 0, 8*Pi}, PlotRange -> All, PlotPoints -> {20, 80}, Lighting -> False, ViewPoint -> {1.5, 2.5, -0.4}] ****** 次にコーヒーカップ(?)を作ってみましょう。 ****** n=2 b[0]={4,6.5} b[1]={3.8,6.4} b[2]={3.7,6} z1=Bezier F=SS[n] ****** ****** T1=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange\[Rule]All,PlotPoints\[Rule]{6,30}] ****** ****** n=5 b[0]={3.7,6} b[1]={3.2,4} b[2]={2.5,3} b[3]={2.3,2} b[4]={2,2} b[5]={0,2} z2=Bezier F=SS[n] ****** ****** T2=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange\[Rule]All,PlotPoints\[Rule]{10,30}] ****** ****** n=2 b[0]={2,2.28} b[1]={2.3,2} b[2]={2.3,1.9} z3=Bezier F=SS[n] ****** ****** T3=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange\[Rule]All,PlotPoints\[Rule]{5,30}] ****** ****** Show[T1,T2,T3] ****** では取っ手をつけましょう。 取っ手部分の曲線をベジエ曲線を用いて作りましょう。 ****** n = 5 b[0] = {3.8, 6.0} b[1] = {3.9, 6.2} b[2] = {6.5, 7} b[3] = {6, 5} b[4] = {3, 3} b[5] = {2.6, 3} gg1 = SS[n] p1 = B2Poly o1 = Bezier Show[p1, o1] ****** 断面となる曲線をまとめておきます。 ****** Show[z1, z2, z3, o1] ****** 取っ手を作ります。 ****** totte[ff_][r_][t_, theta_] := ff[t] + r*(Cos[theta] normalll[ff][t] + 3*Sin[theta] binormal[ff][t])/2 ****** ****** g1[u_] := {gg1[[1]], 0, gg1[[2]]} /. t -> u ****** ****** WWWW = ParametricPlot3D[ totte[g1][.4][t, theta] // Evaluate, {theta, 0, 2*Pi}, {t, 0, 1.02}] ****** これで取っ手ができました。 全部あわせてみるとコーヒーカップができました。 ****** Show[T1, T2, T3, WWWW] ****** ****** Show[T1, T2, T3, WWWW, ViewPoint -> {1.858, 2.515, 1.4}, Boxed -> False, Axes -> False] ****** メッシュをとってみましょう。 ****** dis[ins_][g_] := $DisplayFunction[Insert[g, ins, {1, 1}]] ****** ****** Show[T1, T2, T3, WWWW, ViewPoint -> {1.858, 2.515, 1.4}, DisplayFunction -> dis[EdgeForm[]], Boxed -> False, Axes -> False] ****** ****** Show[WW3, ViewPoint -> {1.5, 2.5, -0.4}, DisplayFunction -> dis[EdgeForm[]], Boxed -> False, Axes -> False] ****** 少し加工すると 参考: カップ1   カップ2   カップ3   が作れます。 今日の課題 ベジエ曲線あるいは有理ベジエ曲線を描いて、これから回転面、チューブやシェルを 作りましょう。