Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

Math::Bezier - Perlでベジェ曲線の座標を求める

Perlでベジェ曲線の座標を求めるにはMath::Bezierモジュールを使用します。制御点を指定して、それに沿った曲線の座標を分割して取得することができます。

use Math::Bezier;
 
# (x, y)制御点のリストを渡して曲線を作成
my $bezier = Math::Bezier->new($x1, $y1, $x2, $y2, ..., $xn, $yn);
 
# 代わりにリファレンスを渡す
my $bezier = Math::Bezier->new([ $x1, $y1, $x2, $y2, ..., $xn, $yn]);
 
# 曲線の中の点(x, y)を決定する。0~1の範囲を指定。
my ($x, $y) = $bezier->point(0.5);
 
# スカラコンテキストにおいて、リストを返す
my $xy = $bezier->point(0.5);
 
# 曲線にそって20個に分割された (x, y)の点を返す。
my @curve = $bezier->curve(20);
 
# リファレンスで受け取る
my $curve = $bezier->curve(20);

3次元ベジェ曲線を書いて100個の点に分割するサンプル

ベジェ曲線は3次元で利用されることが多いので、3次元ベジェ曲線を書いて100個の点に分割するサンプルを示します。

制御点は(0, 0), (10, 10), (20, 40)です。3次元ベジェ曲線の場合は、3つの点を制御点として指定します。

一つ目の制御点と二つ目の制御点を結んだ直線は、一つ目の制御点における曲線の接線になります。

二つ目の制御点と三つ目の制御点を結んだ直線は、三つ目の制御点における曲線の接線になります。

use strict;
use warnings;

use Math::Bezier;

# 制御点の(x, y)のリスト
my $bezier = Math::Bezier->new(0, 0, 10, 10, 20, 40);

my $curve_points = $bezier->curve(100);

for (my $i = 0; $i < @$curve_points; $i += 2) {
  my $x = $curve_points->[$i];
  my $y = $curve_points->[$i + 1];
  
  print "($x, $y)\n";
}

出力結果は、3次元ベジェ曲線に沿った100個の点が表示されます。

(0, 0)
(0.202020202020202, 0.204060810121416)
(0.404040404040404, 0.412202836445261)
(0.606060606060606, 0.624426078971533)
(0.808080808080808, 0.840730537700235)
(1.01010101010101, 1.06111621263136)
(1.21212121212121, 1.28558310376492)
(1.41414141414141, 1.51413121110091)
(1.61616161616162, 1.74676053463932)
(1.81818181818182, 1.98347107438017)
(2.02020202020202, 2.22426283032344)
(2.22222222222222, 2.46913580246914)
(2.42424242424242, 2.71808999081726)
(2.62626262626263, 2.97112539536782)
(2.82828282828283, 3.2282420161208)
(3.03030303030303, 3.48943985307622)
(3.23232323232323, 3.75471890623406)
(3.43434343434343, 4.02407917559433)
(3.63636363636364, 4.29752066115702)
(3.83838383838384, 4.57504336292215)
(4.04040404040404, 4.8566472808897)
(4.24242424242424, 5.14233241505969)
(4.44444444444444, 5.4320987654321)
(4.64646464646465, 5.72594633200694)
(4.84848484848485, 6.02387511478421)
(5.05050505050505, 6.3258851137639)
(5.25252525252525, 6.63197632894603)
(5.45454545454545, 6.94214876033058)
(5.65656565656566, 7.25640240791756)
(5.85858585858586, 7.57473727170697)
(6.06060606060606, 7.89715335169881)
(6.26262626262626, 8.22365064789307)
(6.46464646464647, 8.55422916028977)
(6.66666666666667, 8.88888888888889)
(6.86868686868687, 9.22762983369044)
(7.07070707070707, 9.57045199469442)
(7.27272727272727, 9.91735537190083)
(7.47474747474747, 10.2683399653097)
(7.67676767676768, 10.6234057749209)
(7.87878787878788, 10.9825528007346)
(8.08080808080808, 11.3457810427507)
(8.28282828282828, 11.7130905009693)
(8.48484848484848, 12.0844811753903)
(8.68686868686869, 12.4599530660137)
(8.88888888888889, 12.8395061728395)
(9.09090909090909, 13.2231404958678)
(9.29292929292929, 13.6108560350985)
(9.49494949494949, 14.0026527905316)
(9.6969696969697, 14.3985307621671)
(9.8989898989899, 14.7984899500051)
(10.1010101010101, 15.2025303540455)
(10.3030303030303, 15.6106519742883)
(10.5050505050505, 16.0228548107336)
(10.7070707070707, 16.4391388633813)
(10.9090909090909, 16.8595041322314)
(11.1111111111111, 17.283950617284)
(11.3131313131313, 17.7124783185389)
(11.5151515151515, 18.1450872359963)
(11.7171717171717, 18.5817773696562)
(11.9191919191919, 19.0225487195184)
(12.1212121212121, 19.4674012855831)
(12.3232323232323, 19.9163350678502)
(12.5252525252525, 20.3693500663198)
(12.7272727272727, 20.8264462809917)
(12.9292929292929, 21.2876237118661)
(13.1313131313131, 21.752882358943)
(13.3333333333333, 22.2222222222222)
(13.5353535353535, 22.6956433017039)
(13.7373737373737, 23.173145597388)
(13.9393939393939, 23.6547291092746)
(14.1414141414141, 24.1403938373635)
(14.3434343434343, 24.6301397816549)
(14.5454545454545, 25.1239669421488)
(14.7474747474747, 25.621875318845)
(14.9494949494949, 26.1238649117437)
(15.1515151515152, 26.6299357208448)
(15.3535353535354, 27.1400877461483)
(15.5555555555556, 27.6543209876543)
(15.7575757575758, 28.1726354453627)
(15.959595959596, 28.6950311192735)
(16.1616161616162, 29.2215080093868)
(16.3636363636364, 29.7520661157025)
(16.5656565656566, 30.2867054382206)
(16.7676767676768, 30.8254259769411)
(16.969696969697, 31.3682277318641)
(17.1717171717172, 31.9151107029895)
(17.3737373737374, 32.4660748903173)
(17.5757575757576, 33.0211202938476)
(17.7777777777778, 33.5802469135802)
(17.979797979798, 34.1434547495154)
(18.1818181818182, 34.7107438016529)
(18.3838383838384, 35.2821140699929)
(18.5858585858586, 35.8575655545352)
(18.7878787878788, 36.4370982552801)
(18.989898989899, 37.0207121722273)
(19.1919191919192, 37.608407305377)
(19.3939393939394, 38.2001836547291)
(19.5959595959596, 38.7960412202836)
(19.7979797979798, 39.3959800020406)
(20, 40)

Math::Bezierのドキュメント

Math::Bezierのドキュメント

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。