==================================== 自習 ==================================== Mathematicaを用いた練習を行います。 まず、Mathematica を使えるようにしてください。 プログラムの中の数字などを適当に変更してプログラムがうまく動くか試してみてください。 以下の説明の中で*****ではさまれた部分は Mathematica に入力する文字列です。 コピーするか、自分で入力して、 Shift+Enter(Return) キーで実行します。 上から順に,すべて実行するようにしてください。 上で定義した関数を後で利用すること があります。 ----------------------------------- ベジエ曲線を用いて、文字を描いてみましょう。 まず、次を入力してください。 ****** 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}] L[n_] := Table[(1 - t)*b[i] + t*b[i + 1], {i, 0, n - 1}] B2Poly := ParametricPlot[Evaluate[L[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> True, PlotStyle -> {Thickness[0.005]}] Bezier[pt_, color_] := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> True, PlotRange -> All, PlotStyle -> {Thickness[pt], color}] ****** 文字『ゆ』を描いてみましょう。 少しずつつなぎ合わせて描くようにします。 ****** yy = 0.08 RR = Blue n = 3 b[0] = {0.1, -0.3} b[1] = {-0.2, -2} b[2] = {-0.2, -2} b[3] = {0, -4} p1 = B2Poly o1 = Bezier[yy, RR] ****** yy は線の太さを調整するためのものです。 RR に線の色を指定します。いまはBlueとしています。 次の部分を描きます。各々の部分に名前o1, o2, o3 などの名前をつけておきます。 ****** n = 4 b[0] = {0, -4} b[1] = {0, -2.5} b[2] = {0, -2.5} b[3] = {1.5, -0.5} b[4] = {3, -0.5} p2 = B2Poly o2 = Bezier[yy, RR] ****** ****** n = 3 b[0] = {3, -0.5} b[1] = {4, -0.5} b[2] = {5, -0.9} b[3] = {5, -2.5} p3 = B2Poly o3 = Bezier[yy, RR] ****** ****** n = 3 b[0] = {5, -2.5} b[1] = {5, -4} b[2] = {4, -4.5} b[3] = {3, -4.5} p4 = B2Poly o4 = Bezier[yy, RR] ****** ****** n = 3 b[0] = {3, -4.5} b[1] = {2.0, -4.5} b[2] = {1.5, -3.5} b[3] = {1.3, -2.8} p5 = B2Poly o5 = Bezier[yy, RR] ****** ****** n = 4 b[0] = {2.7, 0.2} b[1] = {3, -3} b[2] = {3, -4.8} b[3] = {2.5, -5.1} b[4] = {1.5, -5.3} p6 = B2Poly o6 = Bezier[yy, RR] ****** では、全体を表して見ましょう。 ****** bb = Show[o1, o2, o3, o4, o5, o6, Axes -> False] ****** 座標を入れておきましょう。 ****** Show[bb, Axes -> True] ****** ベジエ多角形も描いておきましょう。 ****** aa = Show[p1, p2, p3, p4, p5, p6] ****** ベジエ多角形とベジエ曲線を一緒に描きましょう。 ****** Show[aa, bb] ****** では、配付した文字を作って見ましょう。いくつかの 部分に分けて描けばよいかまず考えて見て下さい。 座標をどうしたらよいかを考えましょう。 なめらかにつなぐときは、 接線が同じになるようにベジエ点の配置を工夫してください。 文字『さ』を描いてみましょう。 ****** yy=0.05 RR=Blue n=3 b[0]={0.4, 4.5} b[1]={1,4.1} b[2]={3,4.4} b[3]={4.2,5} p1=B2Poly o1=Bezier[yy, RR] n=3 b[0]={2.2,5.6} b[1]={2.3,5} b[2]={3,3.5} b[3]={4,2.5} p2=B2Poly o2=Bezier[yy, RR] n=4 b[0]={4,2.5} b[1]={3,3.1} b[2]={1,3} b[3]={0.5,2.5} b[4]={0.5,1.9} p3=B2Poly o3=Bezier[yy, RR] n=4 b[0]={0.5,1.9} b[1]={0.5,1.3} b[2]={1,0.8} b[3]={3,0.7} b[4]={4,1.1} p4=B2Poly o4=Bezier[yy, RR] aa=Show[p1,p2,p3, p4] bb=Show[o1,o2,o3, o4, Axes -> True] Show[bb, aa] ****** 文字『と』、『か』、『き』、『お』、『を』、『も』、『a』、『b』などを作ってみましょう。 ************************************ 次に、回転面をつくってみましょう。 まず、原点からの半直線 y=x を回転させてみましょう。 ****** n = 1 b[0] = {0,0} b[1] = {1, 1} Bezier[0.005, RR] F=SS[n] ****** ****** T1=ParametricPlot3D[{F[[1]]*Cos[v], F[[1]]*Sin[v], F[[2]]}, {t, 0, 1}, {v, 0, 2*Pi}, PlotRange -> All, PlotPoints -> {20, 30}] ****** ****** Show[T1, ViewPoint -> {2, 0, -1/2}] ****** 次に、放物線を回転してみましょう。 ****** n =2 b[0] = {0,0} b[1] = {1/2, 0} b[2] = {1, 1} Bezier[0.005, RR] F=SS[n] ****** ****** T2=ParametricPlot3D[{F[[1]]*Cos[v], F[[1]]*Sin[v], F[[2]]}, {t, 0, 1}, {v, 0, 2*Pi}, PlotRange -> All, PlotPoints -> {20, 30}] ****** ****** Show[T2, ViewPoint -> {2, 0, -1}] ****** ****** T3=ParametricPlot3D[{F[[1]]*Cos[v], F[[1]]*Sin[v], F[[2]]}, {t, 0, 1}, {v, 0, Pi}, PlotRange -> All, PlotPoints -> {20, 30}] ****** 上で作った文字を回転して、曲面を作って見ましょう。 うまくできましたか。 ************************************ 例えば、回転面でカップを作ったとき、 取っ手をつけるにはどうしたらよいかを考えてみましょう。 曲線からチューブ状のものを作ることを考えましょう。 (3次元空間内の曲線に対するフレネ・セーレの公式を用います。) ****** CCCR[u_List, v_List] := RotateLeft[u RotateLeft[ v] - RotateLeft[u] v] /; Length[u] == Length[v] == 3 tangent[curve_][t_] := D[curve[tt], tt]/Simplify[Factor[D[curve[tt], tt].D[curve[tt], tt]]]^(1/2) /. tt -> 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 -> 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]) (Cos[theta] normalll[ff][t] +Sin[theta] binormal[ff][t]) *) ****** 次にコーヒーカップ(?)を作ってみましょう。 ****** n=2 b[0]={4,6.5} b[1]={3.8,6.4} b[2]={3.7,6} z1=Bezier[0.005, RR] F=SS[n] ****** ****** T1=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange -> All,PlotPoints -> {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[0.005, RR] F=SS[n] ****** ****** T2=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange -> All,PlotPoints -> {10,30}] ****** ****** n=2 b[0]={2,2.28} b[1]={2.3,2} b[2]={2.3,1.9} z3=Bezier[0.005, RR] F=SS[n] ****** ****** T3=ParametricPlot3D[{F[[1]]*Cos[v],F[[1]]*Sin[v],F[[2]]},{t,0,1},{v,0,2*Pi}, PlotRange -> All,PlotPoints -> {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[0.005, RR] 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}]] ****** ****** WWW3=Show[T1, T2, T3, WWWW, ViewPoint -> {1.858, 2.515, 1.4}, DisplayFunction -> dis[EdgeForm[]], Boxed -> False, Axes -> False] ****** ****** Show[WWW3, ViewPoint -> {1.5, 2.5, -0.4}, DisplayFunction -> dis[EdgeForm[]], Boxed -> False, Axes -> False] ****** 少し加工すると 参考: カップ1   カップ2   カップ3   が作れます。