App-GUI-Juliagraph
view release on metacpan or search on metacpan
lib/App/GUI/Juliagraph/Compute/Image.pm view on Meta::CPAN
my $metric_code = {
'|var|' => '$zqa + $zqb', '|x*y|' => 'abs($za * $zb)',
'|x|' => 'abs($za)', '|y|' => 'abs($zb)',
'|x+y|' => 'abs($za + $zb)', '|x|+|y|' => 'abs($za) + abs($zb)',
'x+y' => '$za + $zb', 'x*y' => '$za * $zb',
'x-y' => '$za - $zb', 'y-x' => '$za - $zb'}->{ $set->{'constraint'}{'stop_metric'} };
my @bailout_code = (
' $metrik = '.$metric_code,
($set->{'mapping'}{'use_subgradient'})
? (' $metrik = $color_index_max - 1 if $metrik >= $color_index_max',
' $color = $colors->[ $i ][$metrik-$schranke], last if $metrik >= $schranke' )
: ' $color = $colors->[ $i ], last if $metrik >= $schranke'
);
my @paint_code;
if ($sketch_factor){
push @paint_code, ' $px = $pixel_x * '.$sketch_factor, ' $py = $pixel_y * '.$sketch_factor;
for my $x (0 .. $sketch_factor -1){
for my $y (0 .. $sketch_factor -1){
push @paint_code, ' $img->SetRGB( $px+'.$x.', $py+'.$y.', @$color)';
}
}
} else {
push @paint_code, ' $img->SetRGB( $pixel_x, $pixel_y, @$color)';
}
my (@z, $za, $zb, $zqa, $zqb, $color, $px, $py, $metrik);
my $x = $offset_x;
my @code = (
'for my $pixel_x (0 .. $max_pixel_x){',
' my $y = $offset_y',
' for my $pixel_y (0 .. $max_pixel_y){',
($set->{'constraint'}{'coor_as_start'} ?
' ($za, $zb) = ($start_a + $x, $start_b + $y)' :
' ($za, $zb) = ($start_a, $start_b)' ),
' $zqa = $za * $za',
' $zqb = $zb * $zb',
' $color = $background_color',
' for my $i (0 .. $max_iter - 1){',
' ($z[2][0], $z[2][1]) = ($zqa - $zqb, 2 * $za * $zb)',
@monomial_code,
($set->{'constraint'}{'coor_as_const'} ?
(' $za += $x + '.$const_a,
' $zb += $y + '.$const_b) :
(' $za += '.$const_a,
' $zb += '.$const_b, ) ),
' $zqa = $za * $za',
' $zqb = $zb * $zb',
@bailout_code,
' }', @paint_code,
' $y += $delta_y',
' }',
' $x += $delta_x',
'}',
);
my $code = join '', map { $_ . ";\n"} @code;
eval $code;
die "bad iter code - $@ :\n$code" if $@; # say $code;
#say "compile:",timestr(timediff(Benchmark->new, $t0));
return $img;
}
1;
( run in 0.312 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )