Home > Archives > September 2014

September 2014

Postscript で放物線を書く

簡単に書けると思ってたら意外と手間がかかった.検索しても答えが見つからんし.

ということで,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)は指定した放物線になっている.

Home > Archives > September 2014

Search
Feeds

Page Top