Algorithm::Line::Bresenham
はじめに
Perlで円を描きたかったんですが、ディスプレイに「円」を描くときにドットで近似するわけですけどもその具体的なアルゴリズムを全然知らなかったんです。そこで、調べたら「ブレセンハムのアルゴリズム」を知りました。CPANにあがっているか探してたらあったんでここで紹介します。
実装する上で僕がつまずいた点
配列の仕組みを僕が良く分かってなくって、そのままアウトプットしたら、「ARRAY(数値)」の形式でだーって画面に出てきたんでこれはまずい。ということで、策を探しました。どうやら、下記コードの@pointsが多重配列になっていて取り出し方が分かってなかったということでした。
コード
use strict; use warnings; use Algorithm::Line::Bresenham qw/circle/; my $y = 10; my $x = 10; my $radius = 10; my @points = circle ($x, $y, $radius); foreach my $point (@points) { my ($px, $py) = ($point->[0], $point->[1]); print "\[$px, $py\]"; }
出力
[20, 10][20, 10][0, 10][0, 10][10, 20][10, 0][10, 20][10, 0][20, 11][20, 9][0, 11][0, 9][11, 20][11, 0][9, 20][9, 0][20, 12][20, 8][0, 12][0, 8][12, 20][12, 0][8, 20][8, 0][20, 13][20, 7][0, 13][0, 7][13, 20][13, 0][7, 20][7, 0][19, 14][19, 6][1, 14][1, 6][14, 19][14, 1][6, 19][6, 1][19, 15][19, 5][1, 15][1, 5][15, 19][15, 1][5, 19][5, 1][18, 16][18, 4][2, 16][2, 4][16, 18][16, 2][4, 18][4, 2][17, 17][17, 3][3, 17][3, 3][17, 17][17, 3][3, 17][3, 3]
まとめ
まだ、具体的にプロットしてpng等に出力してないですが、とりあえず値を求めるのは終了しました。
参考文献
- Algorithm::Line::Bresenham - search.cpan.org, http://search.cpan.org/~osfameron/Algorithm-Line-Bresenham-0.11/lib/Algorithm/Line/Bresenham.pm