================ BEZIER3 ================ Mathematicaを用いた練習を行います。 Mathematica は毎回使いますから、GNOMEパネルの ランチャーに登録しておきましょう。 Mathematica は 「センターメニュー」-「アプリケーション」-「Mathematic数式処理」 にあります。 適当にプログラムの中の数字などを変更して試してみてください。 以下の説明の中で*****ではさまれた部分は 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->False] BlueBezier:= ParametricPlot[Evaluate[SS[n]],{t,0,1},AspectRatio->Automatic, Axes->False,PlotRange\[Rule]All, PlotStyle->{Thickness[0.01],Blue}] RedBezier:= ParametricPlot[Evaluate[SS[n]],{t,0,1},AspectRatio\[Rule]Automatic, Axes\[Rule]False,PlotRange\[Rule]All, PlotStyle->{Thickness[0.01],Red}] GreenBezier:= ParametricPlot[Evaluate[SS[n]],{t,0,1},AspectRatio\[Rule]Automatic, Axes\[Rule]False,PlotRange\[Rule]All, PlotStyle->{Thickness[0.01],Green}] OrangeBezier:= ParametricPlot[Evaluate[SS[n]],{t,0,1},AspectRatio\[Rule]Automatic, Axes\[Rule]False,PlotRange\[Rule]All, PlotStyle->{Thickness[0.01],Orange}] BlackBezier:= ParametricPlot[Evaluate[SS[n]],{t,0,1},AspectRatio\[Rule]Automatic, Axes\[Rule]False,PlotRange\[Rule]All, PlotStyle->{Thickness[0.01],Black}] ****** ****** filledcurve[curve_, {u_, u0_, u1_}, Color_, CCC_] := Module[{plottmp, grtmp}, plottmp = ParametricPlot[curve // Evaluate, {u, u0, u1}, AspectRatio -> Automatic, DisplayFunction -> Identity]; grtmp = plottmp /. (Line[pts_] :> Polygon[pts]); Show[grtmp, DisplayFunction -> $DisplayFunction, Axes -> False, PlotRange -> All, DefaultColor -> Color, Background -> CCC]] ****** ベジエ曲線の復習です。ベジエの制御点が変わるとどのように形が変わるかを見ましょう。 ****** n = 3; b[0] = {-2, 0}; b[1] = {1, 2}; b[2] = {-1, 2}; b[3] = {2, 0}; dd1 = SS[n]; bb1 = B2Poly cc1 = RedBezier Show[cc1, bb1] ****** ****** filledcurve[dd1, {t, 0, 1}, Red, RGBColor[.7, 0.9, 0.9]] ****** ****** n = 3; b[0] = {-2, 0}; b[1] = {2, 2}; b[2] = {-2, 2}; b[3] = {2, 0}; dd2 = SS[n]; bb2 = B2Poly cc2 = RedBezier Show[cc2, bb2] ****** ****** filledcurve[dd2, {t, 0, 1}, Red, RGBColor[.7, 0.9, 0.9]] ****** ****** n = 3; b[0] = {-2, 0}; b[1] = {4, 2}; b[2] = {-4, 2}; b[3] = {2, 0}; dd3 = SS[n]; bb3 = B2Poly cc3 = RedBezier Show[cc3, bb3] ****** ****** filledcurve[dd3, {t, 0, 1}, Red, RGBColor[.7, 0.9, 0.9]] ****** ****** n = 5; b[0] = {-3, 0}; b[1] = {-2, -3}; b[2] = {4, -4}; b[3] = {-4, -4}; b[4] = {2, -3}; b[5] = {3, 0}; dd4 = SS[n]; bb4 = B2Poly cc4 = RedBezier Show[cc4, bb4] ****** ****** filledcurve[dd4, {t, 0, 1}, RGBColor[1, 0.0, 0.0], RGBColor[.7, 0.9, 0.9]] ****** ****** n = 5; b[0] = {-3, 0}; b[1] = {3, -3}; b[2] = {3, -6}; b[3] = {-3, -6}; b[4] = {-3, -3}; b[5] = {3, 0}; dd5 = SS[n]; bb5 = B2Poly cc5 = RedBezier Show[cc5, bb5] ****** ****** filledcurve[dd5, {t, 0, 1}, RGBColor[1, 0.0, 0.0], RGBColor[.7, 0.9, 0.9]] ****** ****** n = 5; b[0] = {-2, 0}; b[1] = {-2, -5}; b[2] = {4, -0}; b[3] = {-4, -0}; b[4] = {2, -5}; b[5] = {2, 0}; dd6 = SS[n]; bb6 = B2Poly cc6 = RedBezier Show[cc6, bb6] ****** ****** filledcurve[dd6, {t, 0, 1}, RGBColor[1, 0.0, 0.0], RGBColor[.7, 0.9, 0.9]] ****** 次に、ハートを描いてみましょう。 ここでは、1つのベジエ曲線でハートを描いてみましょう。 先週の場合は2つのベジエ曲線を用いてハートを描きました。 これをもう一度、描きましょう。 ****** n=8 b[0]={0,1/2}; b[1]={0,0.7}; b[2]={2.5,3.5}; b[3]={2.5,4}; b[4]={2.5,4.7}; b[5]={2,5.5}; b[6]={1/2,5.5}; b[7]={0,5}; b[8]={0,4}; c1=RedBezier b1=B2Poly pp1=SS[n]; b[0]={0,1/2}; b[1]={0,.7}; b[2]={-2.5,3.5}; b[3]={-2.5,4}; b[4]={-2.5,4.7}; b[5]={-2,5.5}; b[6]={-1/2,5.5}; b[7]={0,5}; b[8]={0,4}; c2=RedBezier b2=B2Poly pp2=SS[n]; ****** ****** Show[c1,c2] ****** ****** Show[c1,c2, b1,b2] ****** ハートに色をぬりましょう。 ****** filledcurve[{pp1, pp2}, {t, 0, 1}, RGBColor[1, 0.0, 0.0], RGBColor[.7, 0.9, 0.9]] ****** では、1つのベジエ曲線でハートを描いてみましょう。 ****** n = 11; b[0] = {0, 1}; b[1] = {-1, 2}; b[2] = {-2, 2}; b[3] = {-3.5, 0}; b[4] = {-3, -2}; b[5] = {14, -3}; b[6] = {-14, -3}; b[7] = {3, -2}; b[8] = {3.5, 0}; b[9] = {2, 2}; b[10] = {1, 2}; b[11] = {0, 1}; dd7 = SS[n]; bb7 = B2Poly cc7 = RedBezier Show[cc7, bb7] ****** ****** filledcurve[dd7, {t, -0, 1}, Blue, RGBColor[.7, 0.7, 0.9]] ****** あまり形がよくないですね! もう少し形をよくしましょう。 ****** n = 15; b[0] = {0, 1}; b[1] = {0, 1.2}; b[2] = {-.1, 1.9}; b[3] = {-1, 1.8}; b[4] = {-2, 1.65}; b[5] = {-3.95, .3}; b[6] = {-2.5, -1.5}; b[7] = {18, -2}; b[8] = {-18, -2}; b[9] = {2.5, -1.5}; b[10] = {3.95, .3}; b[11] = {2, 1.65}; b[12] = {1, 1.8}; b[13] = {.1, 1.9}; b[14] = {0, 1.2}; b[15] = {0, 1}; dd8 = SS[n]; cc8 = BlackBezier bb8 = B2Poly Show[cc8, bb8] ****** ****** filledcurve[dd8, {t, 0, 1}, Green, RGBColor[.7, 0.9, 0.9]] ****** まだ、満足できないですね。 もう少し形をよくしましょう。 ****** n = 17; b[0] = {0, 1}; b[1] = {0, 1.2}; b[2] = {-.1, 1.9}; b[3] = {-1, 1.8}; b[4] = {-1.5, 1.65}; b[5] = {-1.9, .3}; b[6] = {-1.9, -.2}; b[7] = {-2.0, -1.3}; b[8] = {14.2, -1.5}; b[9] = {-14.2, -1.5}; b[10] = {2.0, -1.3}; b[11] = {1.9, -.2}; b[12] = {1.9, .3}; b[13] = {1.5, 1.65}; b[14] = {1, 1.8}; b[15] = {.1, 1.9}; b[16] = {0, 1.2}; b[17] = {0, 1}; dd9 = SS[n]; cc9 = BlueBezier bb9 = B2Poly Show[cc9, bb9] ****** ****** filledcurve[dd9, {t, 0, 1}, Red, RGBColor[.7, 0.9, 0.9]] ****** 一応、ハートが描けたことにしましょう。 ここで、一度ファイルをsaveして(適当に名前をつけてください)、 Mathematicaから出て下さい。 再びMathematicaを起動して、続けてください。 次に、文字 「お」 をかいてみましょう。 同じように、行列を用いて文字「お」をいろいろと 変形してみてください。また、他の文字「あ」「る」 「わ」などを書くにはどうしたらよいかを 考えて見ましょう。 ****** 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 -> False] BlueBezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> False, PlotRange -> All, PlotStyle -> {Thickness[0.01], Blue}] RedBezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> False, PlotRange -> All, PlotStyle -> {Thickness[0.01], Red}] GreenBezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> False, PlotRange -> All, PlotStyle -> {Thickness[0.01], Green}] OrangeBezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> False, PlotRange -> All, PlotStyle -> {Thickness[0.01], Orange}] BlackBezier := ParametricPlot[Evaluate[SS[n]], {t, 0, 1}, AspectRatio -> Automatic, Axes -> False, PlotRange -> All, PlotStyle -> {Thickness[0.01], Black}] ****** 行列を入れましょう。 ****** m={{1,0},{0,1}} ****** ****** MatrixForm[m] ****** ****** nn={.45,-1} ****** ****** n=2 b[0]=m.({-.45,1}+nn) b[1]=m.({0,.95}+nn) b[2]=m.({.57,1.1}+nn) o1=BlackBezier p1=B2Poly b[0]=m.({0.1,1.4}+nn) b[1]=m.({0.1,1}+nn) b[2]=m.({0.11,-0.6}+nn) o2=BlackBezier p2=B2Poly n=13 b[0]=m.({0.11,-0.6}+nn) b[1]=m.({0.11,-0.7}+nn) b[2]=m.({-0.2,-0.8}+nn) b[3]=m.({-1.3,-0.2}+nn) b[4]=m.({-0.9,-0.1}+nn) b[5]=m.({-0.3,0.1}+nn) b[6]=m.({-0.1,0.4}+nn) b[7]=m.({1.7,1.4}+nn) b[8]=m.({2.0,0.8}+nn) b[9]=m.({1.7,-0.3}+nn) b[10]=m.({1.6,-0.6}+nn) b[11]=m.({1.4,-0.8}+nn) b[12]=m.({0.7,-0.7}+nn) b[13]=m.({0.5,-0.4}+nn) o3=BlackBezier p3=B2Poly n=2 b[0]=m.({.9,1.18}+nn) b[1]=m.({1.2,1.1}+nn) b[2]=m.({1.45,.9}+nn) o10=BlackBezier p10=B2Poly ****** ****** A1=Show[o1,o2,o3, o10,p1,p2,p3, p10 , PlotRange->All] ****** ****** Show[o1,o2,o3, o10, PlotRange->All] ****** 鏡文字をかいてみましょう。 ****** m={{-1,0},{0,1}} n=2 b[0]=m.({-.45,1}+nn) b[1]=m.({0,.95}+nn) b[2]=m.({.57,1.1}+nn) o1=RedBezier p1=B2Poly b[0]=m.({0.1,1.4}+nn) b[1]=m.({0.1,1}+nn) b[2]=m.({0.11,-0.6}+nn) o2=RedBezier p2=B2Poly n=13 b[0]=m.({0.11,-0.6}+nn) b[1]=m.({0.11,-0.7}+nn) b[2]=m.({-0.2,-0.8}+nn) b[3]=m.({-1.3,-0.2}+nn) b[4]=m.({-0.9,-0.1}+nn) b[5]=m.({-0.3,0.1}+nn) b[6]=m.({-0.1,0.4}+nn) b[7]=m.({1.7,1.4}+nn) b[8]=m.({2.0,0.8}+nn) b[9]=m.({1.7,-0.3}+nn) b[10]=m.({1.6,-0.6}+nn) b[11]=m.({1.4,-0.8}+nn) b[12]=m.({0.7,-0.7}+nn) b[13]=m.({0.5,-0.4}+nn) o3=RedBezier p3=B2Poly n=2 b[0]=m.({.9,1.18}+nn) b[1]=m.({1.2,1.1}+nn) b[2]=m.({1.45,.9}+nn) o10=RedBezier p10=B2Poly ****** ****** A2=Show[o1,o2,o3, o10,p1,p2,p3, p10 , PlotRange->All] ****** 文字を変形しましょう ****** m={{1,1/2},{1,2}} n=2 b[0]=m.({-.45,1}+nn) b[1]=m.({0,.95}+nn) b[2]=m.({.57,1.1}+nn) o1=BlueBezier p1=B2Poly b[0]=m.({0.1,1.4}+nn) b[1]=m.({0.1,1}+nn) b[2]=m.({0.11,-0.6}+nn) o2=BlueBezier p2=B2Poly n=13 b[0]=m.({0.11,-0.6}+nn) b[1]=m.({0.11,-0.7}+nn) b[2]=m.({-0.2,-0.8}+nn) b[3]=m.({-1.3,-0.2}+nn) b[4]=m.({-0.9,-0.1}+nn) b[5]=m.({-0.3,0.1}+nn) b[6]=m.({-0.1,0.4}+nn) b[7]=m.({1.7,1.4}+nn) b[8]=m.({2.0,0.8}+nn) b[9]=m.({1.7,-0.3}+nn) b[10]=m.({1.6,-0.6}+nn) b[11]=m.({1.4,-0.8}+nn) b[12]=m.({0.7,-0.7}+nn) b[13]=m.({0.5,-0.4}+nn) o3=BlueBezier p3=B2Poly n=2 b[0]=m.({.9,1.18}+nn) b[1]=m.({1.2,1.1}+nn) b[2]=m.({1.45,.9}+nn) o10=BlueBezier p10=B2Poly A3=Show[o1,o2,o3, o10,p1,p2,p3, p10 , PlotRange->All] ****** 文字を変形しましょう ****** m={{1,1/2},{0,1}} n=2 b[0]=m.({-.45,1}+nn) b[1]=m.({0,.95}+nn) b[2]=m.({.57,1.1}+nn) o1=RedBezier p1=B2Poly b[0]=m.({0.1,1.4}+nn) b[1]=m.({0.1,1}+nn) b[2]=m.({0.11,-0.6}+nn) o2=RedBezier p2=B2Poly n=13 b[0]=m.({0.11,-0.6}+nn) b[1]=m.({0.11,-0.7}+nn) b[2]=m.({-0.2,-0.8}+nn) b[3]=m.({-1.3,-0.2}+nn) b[4]=m.({-0.9,-0.1}+nn) b[5]=m.({-0.3,0.1}+nn) b[6]=m.({-0.1,0.4}+nn) b[7]=m.({1.7,1.4}+nn) b[8]=m.({2.0,0.8}+nn) b[9]=m.({1.7,-0.3}+nn) b[10]=m.({1.6,-0.6}+nn) b[11]=m.({1.4,-0.8}+nn) b[12]=m.({0.7,-0.7}+nn) b[13]=m.({0.5,-0.4}+nn) o3=RedBezier p3=B2Poly n=2 b[0]=m.({.9,1.18}+nn) b[1]=m.({1.2,1.1}+nn) b[2]=m.({1.45,.9}+nn) o10=RedBezier p10=B2Poly A4=Show[o1,o2,o3, o10, PlotRange->All] ****** ****** Show[A1,A2] ****** ****** Show[A1,A3] ****** ****** Show[A1,A4] ******