Location : Home > Languages > Perl > Package
Title : Math::Bezier
Toolbox Logo

名称

 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]);

# 曲線をパラメータ表示
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);

説明

 本モジュールは"Quick and Simple Bezier Curve Drawing"(Robert D. Miller 著)の Graphics Gems V で説明されているアルゴリズムにしたがってベジェ曲線を計算するアルゴリズムを実装したものである。
 新たなベジェ曲線はコンストラクタ new() で定義され、通過する点(コントロール・ポイント)の座標 (x, y) のリストを与えることで計算を行う。

use Math::Bezier;

my @control = ( 0, 0, 10, 20, 30, -20, 40, 0 );
my $bezier  = Math::Bezier->new(@control);

 または通過する点(コントロール・ポイント)のリストへの参照で与える。

my $bezier  = Math::Bezier->new(\@control);

 曲線に沿って定義された 0 から 1 までのパラメータ theta によって記述される場合に、 point($theta) メソッドを用いれば対応する座標を返す。

my ($x, $y) = $bezier->point(0.5);
print "x: $x  y: $y\n

それぞれの座標を取り出したい場合は以下のように記述する。

my $point = $bezier->point(0.5);
print "x: $point->[0]  y: $point->[1]\n";

 curve($n) メソッドは曲線の長さ方向に沿った(0 <= $theta <= 1 の範囲)、曲線上の $n 個の点の座標の組 ($x1,$y1, $x2, $y2, ..., $xn, $yn) を返す。パラメータ $n はサンプル点のインデックスにもなっている。また、省略した場合のデフォルト値は20である。本メソッドは点の座標のリストまたはリストへの参照を返す。

my @points = $bezier->curve(10);

while (@points) {
	my ($x, $y) = splice(@points, 0, 2);
	print "x: $x  y: $y\n";
}

my $points = $bezier->curve(10);

while (@$points) {
	my ($x, $y) = splice(@$points, 0, 2);
	print "x: $x  y: $y\n";
}

著者

 Andy Wardley, <abw@kfs.org>


参考資料

 Graphics Gems 5, edited by Alan W. Paeth, Academic Press, 1995, ISBN 0-12-543455-3. Section IV.8, 'Quick and Simple Bezier Curve Drawing' by Robert D. Miller, pages 206-209.


【訳注と解説】

  1. ベジェ曲線とは、曲線を近似する場合によく用いる方法で、通過する点(上記では「コントロールポイント」という言い方をしている)点とその点における接線の向きを用いて近似する。用いる通過点を多くして、近似式に用いる多項式の次数を高くすれば理論上いくらでも精緻に近似できるが、通常、3次のものが用いられる。こうして近似された曲線を「3次ベジェ曲線」と言う。とは言うものの、ソースまで確認してないので、本モジュールが何次のベジェ曲線から知らん。誰か奇特な人は確かめて教えてくれい。
  2. 例えば Q1,Q2,Q3,Q4の4点(それぞれが位置ベクトルを表すとする)が与えられた場合、これを通る曲線を3次ベジェ曲線で記述すると
    P(t) = (1-t)3Q1+3t(1-t)2Q2+3(1-t)t2Q3+t3Q4
    となる。ただし、0 <= t <= 1 の範囲。
  3. 上のような表示の仕方は、「曲線の媒介変数表示」と呼ばれる方法で、よくやる手である。というか、こうしておくと曲線長の計算なんかがすっごく楽になる。
Toolbox Logo
Updated : 2006/07/04