================ beziersurface 3 ================ Mathematicaを用いた練習を行います。 Mathematica は毎回使いますから、GNOMEパネルの ランチャーに登録しておきましょう。 Mathematica は 「センターメニュー」-「アプリケーション」-「Mathematic数式処理」 にあります。 適当にプログラムの中の数字などを変更して試してみてください。 以下の説明の中で*****ではさまれた部分は Mathematica に入力する文字列です。自分で入力し Shift+Enter(Return) キーで実行します。 上から順に,すべて実行するようにしてください。 上で定義した関数を後で利用すること があります。 テンソル積ベジエ曲面の続きです。 (参考テキスト: ベジエ曲線とベジエ曲面  23ページ〜29ページ 参照) 前回と同じプログラムを使います。 制御点は行列として入力できるようにしました。 重みも同じです。 このプログラムを用いて、テンソル積ベジエ曲面の方法で曲面を描いてみましょう。 ******* bernstein[n_, r_][t_] := If[n == r, If[r == 0, n!/(r!(n - r)!), n! t^r/(r!(n - r)!)], If[r == 0, n!(1 - t)^(n - r)/(r!(n - r)!), n!(1 - t)^(n - r)t^r/(r!(n - r)!)]] bezcurve[b_][t_] := Sum[b[[i]] bernstein[Length[b] - 1, i - 1][t], {i, 1, Length[b]}] ratbezcurve[w_, b_][t_] := (Sum[w[[i]] b[[i]] bernstein[Length[b] - 1, i - 1][t], {i, 1, Length[b]}])/ (Sum[w[[i]] bernstein[Length[b] - 1, i - 1][t], {i, 1, Length[b]}]) poly[b_] := Graphics[Table[Line[{b[[i]], b[[i + 1]]}], {i, 1, Length[b] - 1}]] pts[b_] := Graphics[{PointSize[0.02], Table[Point[b[[i]]], {i, 1, Length[b]}]}] ******* ******* bezsurface[b_][u_, v_] := Sum[Sum[b[[i + 1]][[j + 1]] bernstein[Length[b] - 1, i][u] bernstein[Length[b[[1]]] - 1, j][v], {i, 0, Length[b] - 1}], {j, 0, Length[b[[1]]] - 1}] ******* ******* ratbezsur[w_, b_][u_, v_] := (Sum[ Sum[w[[i + 1]][[j + 1]] b[[i + 1]][[j + 1]] bernstein[Length[b] - 1, i][u] bernstein[Length[b[[1]]] - 1, j][v], {i, 0, Length[b] - 1}], {j, 0, Length[b[[1]]] - 1}])/(Sum[Sum[w[[i + 1]][[j + 1]] bernstein[Length[b] - 1, i][u] bernstein[Length[b[[1]]] - 1, j][v], {i, 0, Length[b] - 1}], {j, 0, Length[b[[1]]] - 1}]) ******* ******* beznet[b_] := Module[{tmp1, tmp2}, tmp1 = Table[Graphics3D[Line[Table[b[[i + 1]][[j + 1]], {j, 0, Length[b[[1]]] - 1}]]], {i, 0, Length[b] - 1}]; tmp2 = Table[Graphics3D[Line[Table[b[[i + 1]][[j + 1]], {i, 0, Length[b] - 1}]]], {j, 0, Length[b[[1]]] - 1}]; Join[tmp1, tmp2]] ******* ******* bezpts[b_] := Graphics3D[{PointSize[0.015], Flatten[Table[Point[b[[i + 1]][[j + 1]]], {i, 0, Length[b] - 1}, {j, 0, Length[b[[1]]] - 1}], 1]}] ******* スプーンを描いてみましょう。 行列として、制御点(ベジエ点)を入力します。 まずスプーンの先を描きましょう。 ********************* cc = {{{4, 0, 0}, {4, 1/2, 0}, {3, 3/2, 0}, {3/2, 3/2, 0}, {1/2, 2, 0}, {0, 1/4, 0}}, {{4, 0, 0}, {4, 1/2*1/8, -1/3}, {3, 3/2*1/4, -1/2}, {3/2, 3/2*1/2, -1/2}, {1/2, 2*1/2, -1}, {0, 1/4, 0}}, {{4, 0, 0}, {4, 0, -1/3}, {3, 0, -1/2}, {3/2, 0, -1/2}, {1/2, 0, -1}, {0, 0, 0}}, {{4, 0, 0}, {4, -1/2*1/8, -1/3}, {3, -3/2*1/4, -1/2}, {3/2, -3/2*1/2, -1/ 2}, {1/2, -2*1/2, -1}, {0, -1/4, 0}}, {{4, 0, 0}, {4, -1/2, 0}, {3, -3/2, 0}, {3/2, -3/2, 0}, {1/2, -2, 0}, {0, -1/4, 0}}} ******* ******* Show[ beznet[cc], bezpts[cc], Axes -> True, PlotRange -> All] ******* いろいろな方向からベジエネットをみてみましょう。 ******* Show[ beznet[cc], bezpts[cc], Axes -> True, PlotRange -> All, ViewPoint -> {0.001, 0.000, 3.383}] ******* ******* VVV = ParametricPlot3D[bezsurface[cc][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* つぎにスプーンの柄の部分を描きましょう。 ********************* bb ={{{0, 1/8, 0}, {-1, 5/16, 1}, {-6, 6/16, 2}}, {{0, -1/8, 0}, {-1, -5/16, 1}, {-6, -6/16, 2}}} ******* ******* WW1 = ParametricPlot3D[bezsurface[bb][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {8, 16}] ******* スプーン全体です。 ******* WWWW = Show[WW1, VVV] ******* ******* Show[ beznet[cc], beznet[bb], bezpts[cc], bezpts[bb], Axes -> True, PlotRange -> All] ********** ****** Show[WWWW, ViewPoint->{1.886, -2.350, 1.540}] ****** ****** Show[WWWW,ViewPoint->{2,2,1/2}] ****** ****** Show[WWWW,ViewPoint->{1,1,2}] ****** 次に、ワイングラスを描きましょう。 まず円形にするために重みを決めます。 ****** w = { {1, 1, 2}, {1, 1, 2}, {1, 1, 2}} ****** ****** dd1 = {{ {-3, 0, 12}, {-3, 3, 12}, {0, 3, 12}}, { {-6, 0, 6}, {-6, 6, 6}, {0, 6, 6}}, { {-3/2, 0, 6}, {-3/2, 3/2, 6}, {0, 3/2, 6}}} ****** ベジエネットを描きます。 ****** P1 = Show[ beznet[dd1], bezpts[dd1], Axes -> True, PlotRange -> All] ****** ****** QQ1 = ParametricPlot3D[ ratbezsur[w, dd1][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {20, 20}] ****** ****** Show[P1, QQ1] ****** ****** Q1 = ParametricPlot3D[ ratbezsur[w, dd1][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {20, 20}] ****** ****** dd2 = {{ {3, 0, 12}, {3, 3, 12}, {0, 3, 12}}, { {6, 0, 6}, {6, 6, 6}, {0, 6, 6}}, { {3/2, 0, 6}, {3/2, 3/2, 6}, {0, 3/2, 6}}} ****** ****** P2 = Show[ beznet[dd2], bezpts[dd2], Axes -> True, PlotRange -> All] ****** ****** QQ2 = ParametricPlot3D[ ratbezsur[w, dd2][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {20, 20}] ****** ****** Show[P2, QQ2, ViewPoint -> {2., -1., -2}] ****** ****** Q2 = ParametricPlot3D[ ratbezsur[w, dd2][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {20, 20}] ****** ****** dd3 = {{ {-3/2, 0, 6}, {-3/2, 3/2, 6}, {0, 3/2, 6}}, { {-1/2, 0, 6}, {-1/2, 1/2, 6}, {0, 1/2, 6}}, {{-1/2, 0, 7/2}, {-1/2, 1/2, 7/2}, {0, 1/2, 7/2}}} ****** ****** P3 = Show[ beznet[dd3], bezpts[dd3], Axes -> True, PlotRange -> All] ****** ****** Q3 = ParametricPlot3D[ ratbezsur[w, dd3][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {10, 20}] ****** ****** dd4 = {{ {3/2, 0, 6}, {3/2, 3/2, 6}, {0, 3/2, 6}}, { {1/2, 0, 6}, {1/2, 1/2, 6}, {0, 1/2, 6}}, {{1/2, 0, 7/2}, {1/2, 1/2, 7/2}, {0, 1/2, 7/2}}} ****** ****** P4=Show[ beznet[dd4], bezpts[dd4], Axes -> True, PlotRange -> All] ****** ****** Q4 = ParametricPlot3D[ ratbezsur[w, dd4][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {10, 20}] ****** ****** dd5 = {{{-1/2, 0, 7/2}, {-1/2, 1/2, 7/2}, {0, 1/2, 7/2}}, { {-1/2, 0, 1}, {-1/2, 1/2, 1}, {0, 1/2, 1}}, { {-7/2, 0, 1}, {-7/2, 7/2, 1}, {0, 7/2, 1}}} ****** ****** P5 = Show[ beznet[dd5], bezpts[dd5], Axes -> True, PlotRange -> All] ****** ****** Q5 = ParametricPlot3D[ ratbezsur[w, dd5][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {10, 20}] ****** ****** dd6 = {{{1/2, 0, 7/2}, {1/2, 1/2, 7/2}, {0, 1/2, 7/2}}, { {1/2, 0, 1}, {1/2, 1/2, 1}, {0, 1/2, 1}}, { {7/2, 0, 1}, {7/2, 7/2, 1}, {0, 7/2, 1}}} ****** ****** P6 = Show[ beznet[dd6], bezpts[dd6], Axes -> True, PlotRange -> All] ****** ****** Q6 = ParametricPlot3D[ ratbezsur[w, dd6][u, v] // Evaluate, {u, 0, 1}, {v, -1, 1}, PlotPoints -> {10, 20}] ****** ****** Show[Q1, Q2, Q3, Q4, Q5, Q6] ****** ****** Show[ beznet[dd1], bezpts[dd1], beznet[dd2], bezpts[dd2], beznet[dd3], bezpts[dd3], beznet[dd4], bezpts[dd4], beznet[dd5], bezpts[dd5], beznet[dd6], bezpts[dd6], Axes -> True, PlotRange -> All]; ****** マウスの形(?) ****** mm1 ={ { {2, 10, 0}, {2, 6, 0}, {1, 4, 0}, {4, 0, 0}, {2, 0, 0}, {0, 0, 0},{-2, 0, 0}, {-4, 0, 0}, {-1, 4, 0}, {-2, 6, 0}, {-2, 10, 0}}, {{2, 10, 0}, {2, 10.2, 0},{2, 10.5, 0}, {1, 10.8, 0}, {0, 11, 0}, {0, 11.3, 0}, {0, 11, 0}, {-1, 10.8, 0}, {-2, 10.5, 0}, {-2, 10.2, 0},{-2, 10, 0} }} ****** ****** P1 = Show[ beznet[mm1], bezpts[mm1], Axes -> True, PlotRange -> All] ****** ****** B1=ParametricPlot3D[bezsurface[mm1][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {20, 20}] ****** ****** mm2 ={ { {2, 10, 0}, {2, 6, 0}, {1, 4, 0}, {4, 0, 0}, {2, 0, 0},{0, 0, 0}, {-2, 0, 0}, {-4, 0, 0}, {-1, 4, 0}, {-2, 6, 0}, {-2, 10, 0}}, { {2, 10, 1}, {2, 6, 1}, {1, 4, 1}, {4, 2, 5}, {2, 1,5},{0, 1, 6}, {-2,1, 5}, {-4, 2, 5}, {-1, 4, 1}, {-2, 6, 1}, {-2, 10, 1}}, {{2, 10, 1}, {2, 10.2, 1},{2, 10.5, 1}, {1, 10.8, 1}, {0, 11, 1}, {0, 11.3, 1}, {0, 11, 1}, {-1, 10.8, 1}, {-2, 10.5, 1}, {-2, 10.2, 1},{-2, 10, 1} }} ****** ****** P2 = Show[ beznet[mm2], bezpts[mm2], Axes -> True, PlotRange -> All] ****** ****** B2=ParametricPlot3D[bezsurface[mm2][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {20, 20}, ViewPoint->{2.656, 1.919, 0.845}] ****** ****** Show[B2, ViewPoint->{1.457, -1.891, -2.398}] ****** ****** mm3={{{2, 10, 0}, {2, 10.2, 0},{2, 10.5, 0}, {1, 10.8, 0}, {0, 11, 0}, {0, 11.3, 0}, {0, 11, 0}, {-1, 10.8, 0}, {-2, 10.5, 0}, {-2, 10.2, 0},{-2, 10, 0} }, {{2, 10, 1}, {2, 10.2, 1},{2, 10.5, 1}, {1, 10.8, 1}, {0, 11, 1}, {0, 11.3, 1}, {0, 11, 1}, {-1, 10.8, 1}, {-2, 10.5, 1}, {-2, 10.2, 1},{-2, 10, 1} }} ****** ****** B3=ParametricPlot3D[bezsurface[mm3][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}, PlotPoints -> {5, 16}, ViewPoint->{2.656, 1.919, 0.845}] ****** ****** Show[B1, B2, B3, ViewPoint->{3, 3.252, 1.659}] ****** ****** Show[B1, B2, B3, ViewPoint->{1.457, -1.891, -2.398}] ****** 今日の課題 テンソル積ベジエ曲面として、曲面を描くこと。 1 プリントの26ページの図32を作ってみましょう。 2 プリントの29ページ図34を作ってみましょう。 3 点の与え方(ベジエネット)をいろいろと考えて、形を作ってみましょう。 例えば、マウスの形、自転車のサドル、携帯電話、水道の蛇口など