================ BEZIER3(ベジエ曲面) ================ Mapleを用いた実習を行います. Mapleを起動してください. 適当にプログラムの中の数字などを変更して試してみてください. 以下の説明の中で*****ではさまれた部分は Mapleに入力する文字列です.自分で入力あるいはコピーし Enter(Return) キーで実行します. 上から順に,すべて実行するようにしてください. 上で定義した関数を後で利用すること があります. 関数のグラフを描くにはパッケイジ plots と plottools を用います. ****** with(plots): with(plottools): ****** ベジエ曲面を描くには、plot3dを用います. plot3dを用いて双曲放物面を描いてみましょう. ****** plot3d([u, v, u*v], u=-1..1, v=-1..1); ****** 縦と横の比を1対1にするには,1:1のボタンを押すか, PlotメニュのScaling Constrainedを選んで下さい. ベジエ曲面を描くための準備として、まず次を入力してください. ***** beziersurface1:=proc(L, r,s, p, q) local n, m, b, bb; n:=nops(L)-1; m:=nops(L[1])-1; b:= [sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*cpoly[k+1][j+1][1], k=0..n), j=0..m), sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*cpoly[k+1][j+1][2], k=0..n), j=0..m), sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*cpoly[k+1][j+1][3], k=0..n), j=0..m)]: bb:=plot3d([b[1], b[2],b[3]], u=r..s, v=p..q); end: ***** これを用いて,双曲放物面を描いてみましょう. ***** cpoly:=[[[-1,-1,1], [-1,1,-1]],[[1,-1,-1], [1,1,1]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを描くための準備として、次を入力してください. ***** with(ListTools): cframe:=k-> spacecurve(cpoly[k], color=black, thickness=1): lframe:=k-> spacecurve(Transpose(cpoly)[k], color=black, thickness=1): beznet:=proc(L) local bb; bb:=display(seq(lframe(j),j=1..nops(cpoly[1])), seq(cframe(j),j=1..nops(cpoly))): end: ***** ベジエ曲面の例を描いてみましょう. 例1 ***** cpoly:=[[[0,0, 0],[1, 0, 1], [2, 0, 0]], [[0, 1, 1], [1, 1, 2], [2, 1, 1]], [[0, 2, 0], [1, 2, 1], [2, 2, 0]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)); ***** 例2 ***** cpoly:=[[[-1,-1, 0],[-1, 0, 2], [-1, 1, 0]], [[0, -1, -2], [0, 0, 0], [0, 1, -2]], [[1, -1, 0], [1, 0, 2], [1, 1, 0]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)); ***** 例3 ***** cpoly:=[[[2,0, 2],[4, 0, 2], [4, 0, 0]], [[2, 2, 2], [4, 4, 2], [4, 4, 0]], [[0, 2, 2], [0, 4, 2], [0, 4, 0]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)); ***** 例4 ***** cpoly:= [[[1,0, 0],[1, 0, 1], [0, 0, 1]], [[1, 1, 0], [1, 1, 1], [0, 0, 1]], [[0, 1, 0], [0, 1, 1], [0, 0, 1]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)); ***** 例5 ***** cpoly:=[[[-22,-22, 0],[10, -18, 16], [10, 18, 16], [-22, 22, 0]], [[-18, 10, -16],[-22/3,-22/3, 0], [-22/3,22/3, 0], [-18, -10, -16]], [[18, 10, -16],[22/3,-22/3, 0], [22/3,22/3, 0], [18, -10, -16]], [[22,-22, 0],[-10, -18, 16], [-10, 18, 16], [22, 22, 0]]]; beziersurface1(cpoly, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)); ***** 例6 スプーンを描いてみましょう. まずスプーンの先を描きます. ***** cpoly:=[[[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]]]; A1:=beziersurface1(cpoly, 0,1, 0,1): display(A1); ***** ベジエネットを加えます. ***** AA1:=display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)): display(AA1); ***** つぎにスプーンの柄の部分を描きます. ***** cpoly:=[[[0, 1/8, 0], [-1, 5/16, 1], [-6, 6/16, 2]], [[0, -1/8, 0], [-1, -5/16, 1], [-6, -6/16, 2]]]; A2:=beziersurface1(cpoly, 0,1, 0,1): display(A2); ***** ベジエネットを加えます. ***** AA2:=display(beznet(cpoly), beziersurface1(cpoly, 0,1, 0,1)): display(AA2); ***** ***** display(AA1,AA2); display(A1,A2); ***** 有理ベジエ曲面を描くための準備として、まず次を入力してください. ***** rationalbeziersurface1:=proc(L, W, r,s, p, q) local n, m, b, bb; n:=nops(L)-1; m:=nops(L[1])-1; b:= [sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1]*cpoly[k+1][j+1][1], k=0..n), j=0..m)/sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1], k=0..n), j=0..m), sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1]*cpoly[k+1][j+1][2], k=0..n), j=0..m)/sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1], k=0..n), j=0..m), sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1]*cpoly[k+1][j+1][3], k=0..n), j=0..m)/sum(sum(m!/(j!*(m-j)!)*(v^j)*((1-v)^(m-j))*n!/(k!*(n-k)!)*(u^k)*((1-u)^(n-k))*W[k+1][j+1], k=0..n), j=0..m)]: bb:=plot3d([b[1], b[2],b[3]], u=r..s, v=p..q); end: ***** これを用いて,8分の1球面を描いてみましょう. ***** cpoly:= [[[1,0, 0],[1, 0, 1], [0, 0, 1]], [[1, 1, 0], [1, 1, 1], [0, 0, 1]], [[0, 1, 0], [0, 1, 1], [0, 0, 1]]]; weight:=[[1,1,2], [1,1,2], [2,2,4]]; rationalbeziersurface1(cpoly, weight, 0,1, 0,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), rationalbeziersurface1(cpoly, weight, 0,1, 0,1)); ***** 半球面を描いてみましょう. ***** rationalbeziersurface1(cpoly, weight, -1,1, -1,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), rationalbeziersurface1(cpoly, weight, -1,1, -1,1)); ***** トーラスの一部を描いてみましょう. ***** cpoly:= [[[8, 0, 0],[8, 0, 2], [6, 0, 2]], [[8, 8, 0],[8, 8, 2], [6, 6, 2]], [[0, 8, 0],[0, 8, 2], [0, 6, 2]]]; weight:=[[1,1,2], [1,1,2], [2,2,4]]; AA1:=rationalbeziersurface1(cpoly, weight, -1,1, -1,1): ***** ***** cpoly:= [[[4, 0, 0],[4, 0, 2], [6, 0, 2]], [[4, 4, 0],[4, 4, 2], [6, 6, 2]], [[0, 4, 0],[0, 4, 2], [0, 6, 2]]]; weight:=[[1,1,2], [1,1,2], [2,2,4]]; AA2:=rationalbeziersurface1(cpoly, weight, -1,1, -1,1): ***** ***** display(AA1, AA2); ***** ベジエネットを加えます. ***** display(beznet(cpoly), AA1, AA2); ***** 1葉の双曲面の一部を描いてみましょう. ***** cpoly:= [[[-3,0, -2*2^(1/2)],[-3, 3, -2*2^(1/2)], [0, 3, -2*2^(1/2)]], [[-1/3, 0, 0], [-1/3, 1/3, 0], [0, 1/3, 0]], [[-3,0, 2*2^(1/2)],[-3, 3, 2*2^(1/2)], [0, 3, 2*2^(1/2)]]]; weight:=[[1,1,2], [3,3,6], [1,1,2]]; rationalbeziersurface1(cpoly, weight, 0,1, -1,1); ***** ベジエネットを加えます. ***** display(beznet(cpoly), rationalbeziersurface1(cpoly, weight, 0,1, -1,1)); ***** いろいろなベジエ点を与えて,ベジエ曲面を作って見ましょう. 何かおもしろそうなものができたら、教えて下さい.