Perlテックブログ

Perlゼミのはてな出張所。Perlの新着情報、Perlイベントなどの紹介

Imagerでsinのグラフを書く - 実験編1

Perlで二次元グラフをポータブルに書けないかどうかというのを調べていて、Imagerで何とかなるかもしれないと思い、実験をしています。

Cairoは、機能としては、申し分なさそうなんですが、ポータビリティ、環境構築が鬼門ということで、Imagerを調べていて、直線を短くつなぐことで、曲線に見せることができるという情報をGETしたので、やってみようということで。

sinのグラグを書いてみました。




use strict;
use warnings;

use Imager;
use Imager::Color;
use Math::Spline;
use Math::Trig 'pi';

my $xsize = 500;
my $ysize = 500;
my $x_offset = 250;
my $y_offset = 250;

my $img = Imager->new(xsize => $xsize, ysize => $ysize, channels => 4);

my $scale = 100;

my $min = -pi();
my $max = 2*pi();

my $kannkaku = 0.1;

my $points = [];
for (my $x = $min; $x < $max; $x += 0.1) {
my $y = sin($x);
my $point = [$x * $scale + $x_offset, $y * $scale + $y_offset];
push @$points, $point;
}


# my @ys = map { xx($_) } @xs;

# my $spline = Math::Spline->new(\@xs, \@ys);

# my $x = 5;
# my $y = $spline->evaluate($x);

my $blue = Imager::Color->new( 0, 0, 255 );
# my $fill = Imager::Fill->new(hatch=>'stipple');

$img->box(color => Imager::Color->new(255, 255, 255), xmin=>0, ymin=>0, xmax=>400, ymax=>300,
filled=>1);

$img->polyline(points => $points, color => $blue, aa => 1);

$img->flip(dir => 'v');

# Jpeg、画質 90% で保存
$img->write( file => 'graph.png', jpegquality => 90 )
or die $img->errstr;

いい感じじゃないかな。