Location : Home > Languages > Perl > Package
Title : Math::Curve::Hilbert
Toolbox Logo

名称

 Math::Curve::Hilbert - ヒルベルト曲線を描く


概要

use Math::Curve::Hilbert;

# 10ステップで 8x8 の大きさを示すオブジェクトを取得する。(つまり 80x80 ピクセルの図を描く)
my $hilbert = Math::Curve::Hilbert->new( direction=>'up', max=>3, clockwise=>1, step=>10);

# 座標から点を取得
my $point = $hilbert->PointFromCoordinates(20,60);

# 点から座標を取得
my ($x,$y) = $hilbert->CoordinatesFromPoint($point);

# ボックスから range(s) を取得
my @ranges = $hilbert->RangeFromCoordinates($x1,$y1,$x2,$y2);

# 曲線を示す画像を生成

use GD;
# 新規画像を生成
my $im = new GD::Image(300,300);
my $black = $im->colorAllocate(0,0,0);
my $blue = $im->colorAllocate(0,0,255);

my $count = 0;
my ($x1,$y1) = $hilbert->CoordinatesFromPoint($count++);
while ( ($hilbert->CoordinatesFromPoint($count))[0] ) {
   my ($x2,$y2) = $hilbert->CoordinatesFromPoint($count++);
       $im->line($x1,$y1,$x2,$y2,$black);
      ($x1,$y1) = ($x2,$y2);
}

説明

 Hilbert Curve モジュールはヒルベルト空間充填曲線を用いるいくつかの有用な関数を提供する。これはディザリング・n次元データのフラッタリング・フラクタルなどを扱うのに役に立つ。

 空間充填曲線(Space Filling Curve)とは、以下の特徴を有する特別なフラクタル曲線である:

定義:Multiple Range Query Optimization in Spatial Databases, Apostolos N. Papadopoulos and Yannis Manolopoulos

 これ以外の空間充填曲線にはペアノ(Peano)曲線・モートン(Morton)曲線・Z-order曲線がある。U 字型というよりむしろ S 字型をしているHilbert II 曲線もある。ヒルベルト曲線は3次元にも適用可能であるが、本モジュールは2次元しかサポートしていない。
 他の空間充填曲線と同様、領域は 8, 16, 32 …のように2のべき乗個の部分に分割される。

エクスポート

 デフォルトではなし


メソッド

new

# 10ステップで 8x8 の曲線を示す(すなわち 80x80 ピクセルで描く)オブジェクトを取得する。
my $hilbert = Math::Curve::Hilbert->new( direction=>'up', max=>3, clockwise=>1, step=>10);

 方向は曲線の進む方向に従う。

up (clockwise) : up, right, down
down (clockwise ) : down, right, up
left (clockwise) : left, up, right
right (clockwise) : right, down, left

 clockwise は曲線が時計回りか反時計回りか指定する。デフォルトは時計回りである。
 max は格子の大きさを 2 のべき乗で示す。− max=>2 であれば 4x4 の格子を、 max=>4 であれば 16 x 16 の格子であることを示す。
 step は(曲線描画時の)ステップの大きさを指定する。デフォルトは1である。
 X 及び Y は値への参照により通過する始点の座標を指定する。

PointFromCoordinates

my $point = $hilbert->PointFromCoordinates(20,60);

CoordinatesFromPoint

my ($x1,$y1) = $hilbert->CoordinatesFromPoint($point);

RangeFromCoordinates

# ボックスから range(s) を取得
my @ranges = $hilbert->RangeFromCoordinates($x1,$y1,$x2,$y2);

著者

 A. J. Trevena <teejay@droogs.org>


参考資料

 Perl, http://mathworld.wolfram.com/HilbertCurve.html

Toolbox Logo
Updated : 2006/11/14