================ beziersurface 2 ================ 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.03], Flatten[Table[Point[b[[i + 1]][[j + 1]]], {i, 0, Length[b] - 1}, {j, 0, Length[b[[1]]] - 1}], 1]}] ******* まず、双曲放物面を描いてみましょう。 行列として、制御点(ベジエ点)を入力します。 ********************* aa = {{{0, 0, 0}, {0, 1, 0}}, {{1, 0, 0}, {1, 1, 1}}} AA1=ParametricPlot3D[bezsurface[aa][u, v] // Evaluate, {u, -1, 1}, {v, -1, 1}, Boxed -> False, Axes -> None, PlotRange -> All]; ******* ******* AA= Show[ParametricPlot3D[bezsurface[aa][u, v] // Evaluate, {u, -1, 1}, {v, -1, 1}], beznet[aa], bezpts[aa], Boxed -> False, Axes -> None, DisplayFunction -> $DisplayFunction, PlotRange -> All]; ******* いろいろな方向から曲面をみてみましょう。 ******* Show[AA, ViewPoint -> {2, - 2, 0.5}] ******* ******* Show[AA, ViewPoint -> {2, 2, 0.5}] ******* ******* Show[AA, ViewPoint -> {2, 3, -2}] ********************* つぎに放物線の上を直線が動く場合の曲面を描きましょう。 6点の場合にあたります。 行列の形でベジエ点を与えましょう。 ********************* bb = {{{1, 0, 0}, {1, 0, 1}}, {{1, 1, 0}, {1, 1, 1}}, {{0, 1, 0}, {0, 1, 1}}} ******* ******* BB =ParametricPlot3D[bezsurface[bb][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ベジエ点とベジエネットの様子です。 ******* BBNP=Show[beznet[bb], bezpts[bb], PlotRange -> All]; ******* ******* Show[BB, BBNP] ********************* 9点を与える場合の例を考えましょう。 ************** cc= {{{0, 2, 0}, {0, 2, 2}, {0, 4, 2}}, {{2, 2, 0}, {2, 2, 2}, {4, 4, 2}}, {{2, 0, 0}, {2, 0, 2}, {4, 0, 2}}} ******* ******* CCBP=Show[ beznet[cc], bezpts[cc], Axes -> True, PlotRange -> All]; ******* ******* CC=ParametricPlot3D[bezsurface[cc][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[CC, CCBP] ************** 別の9点の例を考えましょう。 ************** ************** ccc2 = {{{0, 6, 0}, {0, 6, 2}, {0, 4, 2}}, {{6, 6, 0}, {6, 6, 2}, {4, 4, 2}}, {{6, 0, 0}, {6, 0, 2}, {4, 0, 2}}} ******* ******* CCC2BP=Show[ beznet[ccc2], bezpts[ccc2], Axes -> True, PlotRange -> All]; ******* ******* CCC2=ParametricPlot3D[bezsurface[ccc2][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[CCC2, CCC2BP, PlotRange -> All] ********************* ************** ************** ********************* ccc3 = {{{0, 0, 0}, {0, 1, 1}, {0, 2, 0}}, {{1, 0, 1}, {1, 1, 2}, {1, 2, 1}}, {{2, 0, 0}, {2, 1, 1}, {2, 2, 0}}} ******* ******* CCC3BP=Show[ beznet[ccc3], bezpts[ccc3], Axes -> True, PlotRange -> All]; ******* ******* CCC3=ParametricPlot3D[bezsurface[ccc3][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[CCC3, CCC3BP, PlotRange -> All] ******* ******* ccc3[[1]] ******* ******* w1 = ParametricPlot3D[bezcurve[ccc3[[1]]][t] // Evaluate, {t, 0, 1}] ******* ******* w2 = ParametricPlot3D[bezcurve[ccc3[[3]]][t] // Evaluate, {t, 0, 1}] ******* ******* cd1 = {ccc3[[1]][[1]], ccc3[[2]][[1]] , ccc3[[3]][[1]]} cd2 = {ccc3[[1]][[3]], ccc3[[2]][[3]] , ccc3[[3]][[3]]} ******* ******* w3 = ParametricPlot3D[bezcurve[cd1][t] // Evaluate, {t, 0, 1}] ******* ******* w4 = ParametricPlot3D[bezcurve[cd2][t] // Evaluate, {t, 0, 1}] ******* ******* Show[CCC3BP, w1, w2, w3, w4, Axes -> True, PlotRange -> All]; ******* **************************** ********************* ******* ccc4 = {{{0, 0, 0}, {0, 1, 1}, {0, 2, 0}}, {{1, 0, -1}, {1, 1, -2}, {1, 2, -1}}, {{2, 0, 0}, {2, 1, 1}, {2, 2, 0}}} ******* ******* CCC4BP=Show[ beznet[ccc4], bezpts[ccc4], Axes -> True, PlotRange -> All]; ******* ******* CCC4=ParametricPlot3D[bezsurface[ccc4][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[CCC4, CCC4BP, PlotRange -> All] ********************* ********************* ******* ddd1 = {{{0, 0, -1}, {0, 1, 1}, {0, 2, -1}, {0, 3, 1}}, {{1, 0, -1.5}, {1, 1, -1}, {1, 2, 0}, {1, 3, 1/2}}, {{2, 0, -1}, {2, 1, 1}, {2, 2, -1}, {2, 3, 1}}} ******* ******* DDD1BP=Show[ beznet[ddd1], bezpts[ddd1], Axes -> True, PlotRange -> All]; ******* ******* DDD1 =ParametricPlot3D[bezsurface[ddd1][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[DDD1, DDD1BP, PlotRange -> All, ViewPoint -> {2, -2, 1}] ********************* ********************* cc= {{{0, 2, 0}, {0, 2, 2}, {0, 4, 2}}, {{2, 2, 0}, {2, 2, 2}, {4, 4, 2}}, {{2, 0, 0}, {2, 0, 2}, {4, 0, 2}}} www= {{1,1, 2}, {1,1,2}, {2,2,4}} ******* ******* RR1BP=Show[ beznet[cc], bezpts[cc], Axes -> True, PlotRange -> All]; ******* ******* RR1=ParametricPlot3D[ratbezsur[www, cc][u, v] // Evaluate, {u, 0, 1}, {v, 0, 1}] ******* ******* Show[RR1, RR1BP] ******* ******* RR2=ParametricPlot3D[ratbezsur[www, cc][u, v] // Evaluate, {u, -1, 1}, {v, -1, 1}] ************** 今日の課題 1 プリントの25ページの例1、例2の点を入力してみましょう。 2 プリントの27ページ〜の28ページ例1、例2、例3の点を入力してみましょう。 3 点の与え方をいろいろと考えて、形を作ってみましょう。