App-GUI-Juliagraph
view release on metacpan or search on metacpan
lib/App/GUI/Juliagraph/Compute/Image.pm view on Meta::CPAN
steps => $gradient_part_length,
in => $set->{'mapping'}{'gradient_space'},
tilt => $set->{'mapping'}{'gradient_dynamic'} );
pop @color_object if $color_nr != $end_nr;
}
$background_color = (substr($set->{'mapping'}{'background_color'}, 0, 5) eq 'color')
? $set->{'color'}{'11'}
: $set->{'mapping'}{'background_color'};
$background_color = '#001845' if $background_color eq 'blue';
$background_color = color( $background_color );
} else {
@color_object = color('white')->gradient( to => 'black', steps => $max_iter,
in => $set->{'mapping'}{'gradient_space'},
dynamic => $set->{'mapping'}{'gradient_dynamic'} );
$background_color = $color_object[ -1 ];
}
if ($set->{'mapping'}{'use_subgradient'}){
push @color_object, $color_object[-1];
my %subgradient_mapping = %{ App::GUI::Juliagraph::Compute::Mapping::scales(
$set->{'mapping'}{'subgradient_distro'},
$set->{'mapping'}{'subgradient_size'},
$set->{'mapping'}{'subgradient_steps'},
)};
for my $subgradient_nr (1 .. $max_iter) {
my @subgradient = $color_object[$subgradient_nr - 1]->gradient(
to => $color_object[$subgradient_nr],
steps => $set->{'mapping'}{'subgradient_steps'},
in => $set->{'mapping'}{'subgradient_space'},
tilt => $set->{'mapping'}{'subgradient_dynamic'} );
my @subcolor = map { [$_->values( 'RGB' )] } @subgradient;
$color_value[$subgradient_nr - 1][$_] = $subcolor[ $subgradient_mapping{$_} ]
for 0 .. $set->{'mapping'}{'subgradient_size'} - 1;
}
} else {
@color_value = map { [$_->values( 'RGB' )] } @color_object;
if (%gradient_mapping){
my @temp_color = @color_value;
$color_value[$_] = $temp_color[ $gradient_mapping{$_} ] for 0 .. $max_iter-1;
}
}
return \@color_value, [ $background_color->values( 'RGB' ) ];
}
sub from_settings {
my( $set, $size, $sketch ) = @_;
my $img = Wx::Image->new( $size->{'x'}, $size->{'y'} );
my $sketch_factor = (defined $sketch) ? SKETCH_FACTOR : 0;
#my $t0 = Benchmark->new();
my $max_iter = int $set->{'constraint'}{'stop_nr'} ** 2;
my $max_value = int $set->{'constraint'}{'stop_value'} ** 2;
my $zoom = 140 * $set->{'constraint'}{'zoom'};
my $schranke = $max_value;
my $color_index_max = $schranke + $set->{'mapping'}{'subgradient_size'};
my ($colors, $background_color) = compute_colors( $set, $max_iter );
for my $bar_name (keys %progress_bar){
my $bar = $progress_bar{$bar_name};
my $gradient_percent = 100 / @$colors;
$bar->reset;
next if $bar_name eq 'pen' and $sketch_factor;
if ($bar_name eq 'background'){
$bar->set_start_color( @$background_color );
$bar->add_percentage( 100, $background_color );
} else {
if ($set->{'mapping'}{'use_subgradient'}){
$bar->set_start_color( @{$colors->[0][0]} );
my $subgradient_length = @{$colors->[0]};
$gradient_percent /= $subgradient_length;
my $color_counter = 0;
for my $gradient_nr (0 .. $#$colors) {
for my $subgradient_pos (0 .. $subgradient_length - 1) {
$bar->add_percentage( $color_counter++ * $gradient_percent ,
$colors->[$gradient_nr][$subgradient_pos] );
}
}
} else {
$bar->set_start_color( @{$colors->[0]} );
$bar->add_percentage( $_ * $gradient_percent , $colors->[$_] ) for 1 .. $#$colors;
}
}
$bar->paint();
}
my $max_pixel_x = $size->{x}-1;
my $max_pixel_y = $size->{y}-1;
my $offset_x = (- $size->{'x'} / 2 / $zoom) + $set->{'constraint'}{'center_x'};
my $offset_y = (- $size->{'y'} / 2 / $zoom) - $set->{'constraint'}{'center_y'};
my $delta_x = 1 / $zoom;
my $delta_y = 1 / $zoom;
my $start_a = $set->{'constraint'}{'start_a'};
my $start_b = $set->{'constraint'}{'start_b'};
my $const_a = $set->{'constraint'}{'const_a'};
my $const_b = $set->{'constraint'}{'const_b'};
if ($sketch_factor){
$delta_x *= $sketch_factor;
$delta_y *= $sketch_factor;
$max_pixel_x /= $sketch_factor;
$max_pixel_y /= $sketch_factor;
}
my $max_power = 2;
my %needed_power = ();
my %existing_power = (1 => 1, 2 => 1);
for my $monomial_nr (1 .. 4){
next unless $set->{'monomial'}{$monomial_nr}{'active'};
$needed_power{ $set->{'monomial'}{ $monomial_nr }{'exponent'} }++;
$max_power = $set->{'monomial'}{ $monomial_nr }{'exponent'} if $max_power < $set->{'monomial'}{ $monomial_nr }{'exponent'};
}
my @monomial_code = '';
for (my $power = 4; $power <= $max_power;$power *= 2){
$existing_power{$power}++;
my $half = $power / 2;
push @monomial_code, ' $z['.$power.'][0] = ($z['.$half.'][0] * $z['.$half.'][0]) - ($z['.$half.'][1] * $z['.$half.'][1])'
, ' $z['.$power.'][1] = 2 * ($z['.$half.'][0] * $z['.$half.'][1])';
delete $needed_power{$power} if exists $needed_power{$power};
}
for my $power (4, 2){
for my $factor (3, 5, 7) {
my $possible_power = $power * $factor;
last if $possible_power > $max_power;
for my $needed_power (keys %needed_power){
if ($needed_power >= $possible_power and $needed_power < $possible_power + $factor){
my $base_power = $possible_power - $power;
push @monomial_code, ' $z['.$possible_power.'][0] = ($z['.$base_power.'][0] * $z['.$power.'][0]) - ($z['.$base_power.'][1] * $z['.$power.'][1])'
, ' $z['.$possible_power.'][1] = ($z['.$base_power.'][0] * $z['.$power.'][1]) + ($z['.$base_power.'][1] * $z['.$power.'][0])';
delete $needed_power{ $possible_power } if exists $needed_power{ $possible_power };
$existing_power{ $possible_power }++;
last;
}
}
}
}
for my $power (3,5,7,9,11,13,15){
next unless $needed_power{ $power };
my $base_power = $power - 1;
push @monomial_code, ' $z['.$power.'][0] = ($z['.$base_power.'][0] * $za) - ($z['.$base_power.'][1] * $zb)'
, ' $z['.$power.'][1] = ($z['.$base_power.'][0] * $zb) + ($z['.$base_power.'][1] * $za)';
}
( run in 0.502 second using v1.01-cache-2.11-cpan-39bf76dae61 )