www.Litecode.ru – Сборник рецептов для создания сайтов

Построение графиков

ГлавнаяPerl → Построение графиков

Для построения графиков, можно использовать метод Draw. Если точнее, его параметр primitive со значением line, с помощью которого можно строить прямые линии между двумя заданными точками. Цвет линии задается параметром stroke. Координаты параметром points, от верхнего левого угла. Например, проведем прямую линию из вернего левого угла в нижний правый:

my $img = Image::Magick->new(size=>'400x300');
$img->ReadImage('xc:#DDD7C7');
$img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => '0,0 400,300'
            );

$img->Write( '/full_path/line1.jpg' );



На одном изображении, возможно провести несколько линий, причем разного цвета. Для этого, для одного и того же объекта $img, несколько раз вызвать метод Draw меняя цвет и координаты.

$img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => '0,0 100,100'
            );

$img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => '100,100 150,90'
            );

$img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => '150,90 400,300'
            );

Если предстоит работать с большим количеством отрезков, логичнее представить координаты в массивах и вызывать Draw в цикле, обращаясь к данным по индексам.

my @x = (0,100,150,400);
my @y = (0,100,90,300);

for ( 0 .. ( scalar @x ) - 1 ) {
    
    $img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => "$x[$_],$y[$_] ".$x[$_+1].",".$y[$_+1]
            ) if $x[$_+1];
    
}



Аналогично накладываем два графика или более:

my @x = (0,100,150,400);
my @y = (0,100,90,300);
my @x2 = (0,170,280,400);
my @y2 = (300,50,90,300);

for ( 0 .. ( scalar @x ) - 1 ) {
    
    $img->Draw(
        stroke => '#980000',
        primitive => 'line',
        points => "$x[$_],$y[$_] ".$x[$_+1].",".$y[$_+1]
            ) if $x[$_+1];
    
    $img->Draw(
        stroke => '#0A844D',
        primitive => 'line',
        points => "$x2[$_],$y2[$_] ".$x2[$_+1].",".$y2[$_+1]
            ) if $x2[$_+1];
    
}