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

名称

 Math::Polygon - ポリゴンデータの管理クラス


概要

my $poly = Math::Polygon->new( [1,2], [2,4], [5,7], [1,2] );
print $poly->nrPoints;
my @p    = $poly->points;

my ($xmin, $ymin, $xmax, $ymax) = $poly->bbox;

my $area = $poly->area;
my $l    = $poly->perimeter;
if($poly->isClockwise) { ... };

my $rot  = $poly->startMinXY;

my $boxed = $poly->lineClip($xmin, $xmax, $ymin, $ymax);

説明

 本クラスは Math::Polygon::Calc|Math::Polygon::Calc 及び Math::Polygon::Clip|Math::Polygon::Clip に対するオブジェクト指向インタフェースを提供する。


メソッド

コンストラクタ

$obj->new([OPTIONS], [POINTS], [OPTIONS])
Math::Polygon->new([OPTIONS], [POINTS], [OPTIONS])

 POINTS の前後に OPTIONS を追加することもできる。点のリストを取得するために points オプションを使うこともできる。POINTS は X 及び Y の配列への参照である。
 new がインスタンスメソッドとして呼び出された場合は、呼び出された側は新しいポリゴンと見なされ、いくつかの事実(時計回り・反時計周りなど)は異議が出されるまでコピーされる。

Option     Defined in       Default
bbox                        undef  
clockwise                   undef  
points                      undef  

. bbox ARRAY

 通常は図形から自動的に計算するが、[xmin,ymin,xmax, ymax] から指定してもよい。bbox()|Math::Polygon/"Simple calculations" を見よ。

. clockwise BOOLEAN

 指定されなければ必要に応じて isClockwise()|Math::Polygon/"Simple calculations" メソッドで計算される。

. points ARRAY-OF-POINTS

 points()|Math::Polygon/"Attributes" 及び nrPoints()|Math::Polygon/"Attributes" を見よ。

例:新しいポリゴンの生成

my $p = Math::Polygon->new([1,0],[1,1],[0,1],[0,0],[1,0]);

my @p = ([1,0],[1,1],[0,1],[0,0],[1,0]);
my $p = Math::Polygon->new(points => \@p);

属性

$obj->nrPoints

 点の数を返す。

$obj->order

 ユニークな点の数を返す。nrPoints()|Math::Polygon/"Attributes" よりも小さい。

$obj->point(INDEX, [INDEX, ...])

 INDEX または INDEXES で指定される点を返す。スカラコンテキストでは最初の INDEX のみ利用される。

$obj->points

 リストコンテキストでは点はリストを返し、そうでなければ配列への参照として返す。

簡単な計算

$obj->area

 ポリゴンで囲まれた面積を返す。正しい答えを得るためには最後の点は最初の点と一致していなければならない。計算結果はキャッシュされる。
 関数は Math::Polygon::Calc::polygon_area()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->bbox

 ポリゴンのバウンディングボックス(ポリゴンの全ての点をその内部に包含する四角形)を記述する4点 (xmin, ymin, xmax, ymax) を返す。計算に時間がかかるので結果はキャッシュされる。
 関数は Math::Polygon::Calc::polygon_bbox()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->beautify(OPTIONS)

 新しい、美しくしたポリゴンを返す。
 関数は Math::Polygon::Calc::polygon_beautify()|Math::Polygon::Calc/"FUNCTIONS" である。
 ポリゴンは、計算した場合、点が重複していたり、角が尖っていたりするなどしているのでこれを美しくする。

 Option         Defined in  Default
 remove_spikes               false
. remove_spikes BOOLEAN

$obj->clockwise

 点が時計回り順であることを確認する。

$obj->contains(POINT)

 引数として渡された点がポリゴンの内部にあるか否かを示す真値を返す。辺(稜線)上の点は内部とする。

$obj->counterClockwise

 点が反時計回り順であることを確認する。

$obj->equal((OTHER|ARRAY, [TOLERANCE])|POINTS)

 2つのポリゴンを点のレベルで比較する。ポリゴンが同一でも回転している場合は false を返す。same()|Math::Polygon/"Simple calculations" を見よ。
 関数は Math::Polygon::Calc::polygon_equal()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->isClockwise

 点を時計回りの方向に並べる。
 この計算は極めて時間がかかるので(ポリゴンの面積を求めるのと同様)、結果はキャッシュされる。

$obj->perimeter

 ポリゴンの線分の長さを求める。任意の辺の長さを求めることができる。最後の点は最初の点と一致していなくてもよい。その場合は線分と見なす。
 関数は Math::Polygon::Calc::polygon_perimeter()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->same((OTHER|ARRAY, [TOLERANCE])|POINTS)

 2つのポリゴンを比較し、互いに回転された状態であるかを確認する。これは equal()|Math::Polygon/"Simple calculations" よりかなり遅いが、他のアルゴリズムでは結果が信用できない場合もあるのでこれを採用している。
 関数は Math::Polygon::Calc::polygon_same()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->startMinXY

 バウンディングボックスび左下の点を基点として回転した新しいオブジェクトを返す。
 関数は Math::Polygon::Calc::polygon_start_minxy()|Math::Polygon::Calc/"FUNCTIONS" である。

$obj->string

 

変換

 Math::Polygon::Transform|Math::Polygon::Transform を実装し、クリッピングを除いてポリゴンの構造を変換する。全ての関数は新しいポリゴンオブジェクトまたは undef を返す。

$obj->grid(OPTIONS)

 グリッド点にあわせたポリゴンオブジェクトを返す。
 Math::Polygon::Transform::polygon_grid()|Math::Polygon::Transform/"FUNCTIONS" を見よ。

 Option  Defined in  Default
 raster              1.0    

. raster FLOAT

 点の周りのラスタのサイズを返す。原点 [0,0] は常にグリッド点である。ラスタ値が0であれば変換は行われない。

$obj->mirror(OPTIONS)

 線分でポリゴンの鏡像を返す。オプションの定義は1つのみである。
 これを "flip" または "flop" と呼ぶこともある。

 Option  Defined in       Default 
 b                        0    
 line                     undef
 rc                       undef
 x                        undef
 y                        undef

. b FLOAT

 線分を記述するためにオプション rc との組み合わせを使う。

. line [POINT, POINT]

 鏡像射線を特定する。rc 及び b は線分の2点から計算される。

. rc FLOAT

 鏡像射線を指定する。線分は y = rc * x + b で表される。rc は -dy/dx に等しい。b に明示的に undef を指定すると x 軸に垂直な線分と見なす。

. x FLOAT

 y の値はそのままで x = value に対し鏡像をとる。

. y FLOAT

 x の値はそのままで y = value に対し鏡像をとる。

$obj->move(OPTIONS)

 移動したポリゴンオブジェクトを返す。全ての点は指定された距離だけ移動する。
 Math::Polygon::Transform::polygon_move()|Math::Polygon::Transform/"FUNCTIONS" を見よ。

 Option  Defined in       Default
 dx                       0      
 dy                       0      

. dx FLOAT

 水平方向に移動する。

. dy FLOAT

 垂直方向に移動する。

$obj->resize(OPTIONS)

 サイズ変更されたポリゴンオブジェクトを返す。
 Math::Polygon::Transform::polygon_resize()|Math::Polygon::Transform/"FUNCTIONS" を見よ。

 Option  Defined in       Default 
 center                   [0,0]
 scale                    1.0  
 xscale                   scale 
 yscale                   scale 

. center POINT
. scale FLOAT

 指定されたファクタに従いポリゴンをサイズ変更する。ファクタの値が1よりも大きければ元の図形より大きくなり、小さいと小さくなる。スケールは中心からみたものとなる。

. xscale FLOAT

 水平方向のスケールファクタを指定する。

. yscale FLOAT

 垂直方向のスケールファクタを指定する。

$obj->rotate(OPTIONS)

 回転されたポリゴンオブジェクトを返す。全ての点は指定された距離だけ移動する。
 Math::Polygon::Transform::polygon_rotate()|Math::Polygon::Transform/"FUNCTIONS" を見よ。

 Option   Defined in       Default 
 center                    [0,0]
 degrees                   0       
 radians                   0       

. center POINT
. degrees FLOAT

 回転角を度で指定する。( -180 と 360 の間)

. radians FLOAT

 回転角をラジアンで指定する。( -pi と 2*pi の間)

$obj->simplify(OPTIONS)

 点を削除したポリゴンオブジェクトを返す。
 Math::Polygon::Transform::polygon_simplify()|Math::Polygon::Transform/"FUNCTIONS" を見よ。

 Option      Defined in       Default  
 max_points                   undef 
 same                         0.0001
 slope                        undef 

. max_points INTEGER

 まず same と slope は点の数を減らす。特定の点の数を残したいなら指定した最大数に達するまで最大角の点が削除される。

. same FLOAT

 2つの点の間の距離を「同じ」と見なす。値は円の半径として用いられる。

. slope FLOAT

 3点 X(n), X(n+1), X(n+2) について、点 X(n+1) が X(n) と X(n+2) の間の直接パスよりも長い slope よりも3点からのパスが短ければ削除される。.
 slope はポリゴンの始点からは削除されない。
 点を削除すればポリゴンの面積は変わる。

クリッピング

$obj->fillClip1(BOX)

 ポリゴンを様々な方法で長方形にクリッピングする。
 このアルゴリズムでは BOX の外になるポリゴンの部分は境界にマップされる。 ポリゴンは1ピースのままであるが、頂点は2方向を向く。
 返り値は1つのポリゴンであるか undef である。ポリゴンの場合は2点・スパイクと中間点で綺麗になったものである。

$obj->lineClip(BOX)

 返り値は入力ポリゴンからの線分を含むf ARRAYS-OF-POINTS のリストである。
 関数は Math::Polygon::Clip::polygon_line_clip()|Math::Polygon::Clip/"FUNCTIONS" である。


参考資料

 詳しくはt http://perl.overmeer.net/geo を見よ。


著作権

 Module version 0.003.
 Mark Overmeer (polygon@overmeer.net) により書かれた。他の貢献については変更履歴を見よ。

 Copyright (c) 2004 by the author(s). All rights reserved.

 本プログラムはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。

Toolbox Logo
Updated : 2008/06/27