2014年09月
Postscript で放物線を書く
- 2014-09-03 (Wed)
- プログラミング
簡単に書けると思ってたら意外と手間がかかった.検索しても答えが見つからんし.
ということで,3次ベジェ曲線の式と放物線の式と2時間くらい格闘した結果が以下の PS ファイル.とりあえず,PSTricks の \parabola に倣ってひとつの端点と放物線の頂点をパラメータに渡す関数 parabola を作ってみた.
%!PS-Adobe-3.0 %%BoundingBox: 0 -10 201 201 newpath 0 0 200 0 moveto lineto stroke /parabola { 4 dict begin /y3 exch def % the top /x3 exch def /y0 exch def % start point /x0 exch def % control point at the start point /x1 x0 x0 x3 sub 3 div sub def /y1 y0 y0 y3 sub 3 div 2 mul sub def % control point at the top /x2 x3 x0 x3 sub 3 div add def /y2 y3 def % end point /x6 x3 x3 x0 sub add def /y6 y0 def % control point at the end point /x4 x3 x6 x3 sub 3 div add def /y4 y3 def % control point at the top point /x5 x6 x6 x3 sub 3 div sub def /y5 y6 y6 y3 sub 3 div 2 mul sub def % now, draw the parabola curve! newpath x0 y0 moveto x1 y1 x2 y2 x3 y3 curveto x3 y3 moveto x4 y4 x5 y5 x6 y6 curveto stroke end } def % specify the start and the top points 0 0 100 150 parabola 0 200 100 150 parabola showpage
結局, P(t) = P0 (1-t)^3 + 3 P1(1-t)^2 t + 3 P2(1-t) t^2 + P3 t^3 という3次ベジェ曲線の式から,端点 P0 = P(0) と P3 = P(1) とそこでの微分 P'(0) と P'(1) とを指定してあげれば,制御点 P1 と P2 は P1 = P0 + P'(0)/3 と P2 = P3 - P'(1)/3 で決定できる.この微分値 P'(0) と P'(1) とを指定して描かせるのは面倒なので,放物線の頂点と他一点を与えることで方程式(y-y0 = a (x-x0)^2)を確定して,その方程式から(t = (x-x0)/(x3-x0)とでもして)計算してあげることにする.それが上のPSファイルの中身.んで,計算された制御点を使ってあげると任意の t in [0,1] でP(t)は指定した放物線になっている.
- Comments: 0
- TrackBack (Close): -