App-WIoZ
view release on metacpan or search on metacpan
lib/App/WIoZ.pm view on Meta::CPAN
read words form file : C<word;weight>
Usage:
my @words = $wioz->read_words($File);
=cut
sub read_words {
my ($self, $filename) = @_;
my ($weight_min, $weight_max) = (1000000000, 0);
my @res = ();
my $fh;
open $fh, '<:utf8', $filename;
my @L = <$fh>;
close $fh;
foreach my $l (@L) {
my ($t,$n) = split /;/,$l;
if ( $t && $n ) {
$t =~ s/\s*$//g; $n =~ s/\s*$//g;
#$all_weight += $n;
$weight_max = $n if ( $n >$weight_max );
$weight_min = $n if ( $n <$weight_min );
my $w = new App::WIoZ::Word(text => $t, weight => $n, font => $self->font);
push @res, $w;
} else {
warn "error line: $_";
}
}
# set initial size and color
my @color = Color::Mix->new->analogous($self->basecolor, 12, 12);
foreach my $v (@res) {
$v->size( (($v->weight - $weight_min) / ($weight_max - $weight_min)) *
($self->font_max - $self->font_min) +
$self->font_min );
$v->color($color[int(rand(12))]);
}
return @res;
}
=head2 update_colors
Read words position from file and update colors.
Usage:
$wioz->update_colors("file.sl.txt");
=cut
sub update_colors{
my ($self, $filename) = @_;
open my $fh, '<:utf8', $filename or die $filename . ' : ' .$!;
my @L = <$fh>;
close $fh;
my @color = Color::Mix->new->analogous($self->basecolor, 12, 12);
# reset background
$self->cr->rectangle (0, 0, $self->width, $self->height);
my $po = Graphics::ColorNames->new;
my @rgb = $po->rgb($self->backcolor);
$self->cr->set_source_rgb ($rgb[0]/255.0, $rgb[1]/255.0, $rgb[2]/255.0);
$self->cr->fill;
foreach my $l (@L) {
my ($show,$text,$size,$x,$y,$angle) = split /\t/,$l;
#say "$text - $size - $angle";
my $w = App::WIoZ::Word->new(text => $text, size => $size, angle => $angle, show => $show, color => $color[int(rand(12))], font => $self->font);
my $newc = App::WIoZ::Point->new( x => $x, y => $y);
$w->update_size($self,$size);
$w->update_c($newc);
$self->_show_word($w);
}
$self->_save_to_png if (!$self->svg);
}
=head2 do_layout
Compute words position, save result to svg or png image, save in C<filename.sl.txt> words positions to update colors.
Usage :
$wioz->do_layout(@words);
=cut
sub do_layout {
my ($self,@words) = @_;
my $c = 0;
my $current = undef;
my @dx = (1, 1, 0, 0,-1,-1,-1,-1, 0, 0, 1, 1);
my @dy = (0, 1, 1, 1, 1, 0, 0,-1,-1,-1,-1, 0);
#foreach my $w (@words) {
foreach my $w (sort {$b->weight cmp $a->weight} @words) {
# init
$w->show(1);
$w->update_size($self,$w->size) if (!$w->height && !$w->width);
$current = $w if (! $current);
# process
my $inside;
my @ranges;
my ($x1, $y1) = my ($x, $y) = (int($self->width/2), int($self->height/2));
my $step = $self->scale;
my $dir = 0;
my $i = 0;
do {
# spiral
my $newc = App::WIoZ::Point->new( x => int($x), y => int($y));
$x1 = $x1 + $dx[$i%12] * $step;
$y1 = $y1 + $dy[$i%12] * $step;
$x = $x1; $y = $y1;
$step += 2 ;
$w->update_c($newc);
# is in free space
$inside = ($w->p->x > 0 && $w->p->x <= $self->width &&
$w->p2->x > 0 && $w->p2->x <= $self->width &&
( run in 1.633 second using v1.01-cache-2.11-cpan-d8267643d1d )