App-GUI-Harmonograph
view release on metacpan or search on metacpan
lib/App/GUI/Harmonograph/Compute/Drawing.pm view on Meta::CPAN
$assign.'1/cos('.$term_var.')' }
elsif ($funct eq 'csc') {push @compute_coor_code, $norm, $next.'sin '.$term_var,
$assign.'1/sin('.$term_var.')' }
elsif ($funct eq 'sinh'){push @compute_coor_code, $norm_double,
$assign.'0.5 * (exp('.$term_var.') - exp(-'.$term_var.'))' }
elsif ($funct eq 'cosh'){push @compute_coor_code, $norm_double,
$assign.'0.5 * (exp('.$term_var.') + exp(-'.$term_var.'))' }
elsif ($funct eq 'tanh'){push @compute_coor_code, $norm_double, @exp, $next.'$explus + $exminus',
$assign.'($explus - $exminus)/($explus + $exminus)'; }
elsif ($funct eq 'coth'){push @compute_coor_code, $norm_double, @exp, $next.'$explus - $exminus',
$assign.'($explus + $exminus)/($explus - $exminus)'; }
elsif ($funct eq 'sech'){push @compute_coor_code, $norm_double, @exp, $next.'$explus + $exminus',
$assign.'1 / ($explus + $exminus)'; }
elsif ($funct eq 'csch'){push @compute_coor_code, $norm_double, @exp, $next.'$explus - $exminus',
$assign.'1 / ($explus - $exminus)'; }
}
push @compute_coor_code, ' $x = '.($set->{'x'}{'on'} ? '$rX * $termX' : '0')
, ' $y = '.($set->{'y'}{'on'} ? '$rY * $termY' : '0');
push @compute_coor_code, ' $x += $rE * $termE' if $set->{'e'}{'on'};
push @compute_coor_code, ' $y += $rF * $termF' if $set->{'f'}{'on'};
push @compute_coor_code, ' ($x, $y) = ($rR * (($x * $termR11) - ($y * $termR12))'
.',$rR * (($x * $termR21) + ($y * $termR22)))' if $set->{'r'}{'on'}
and $set->{'function'}{'first_rotary'} eq 'r';
push @compute_coor_code, ' $x -= $rW * $termWX'
, ' $y -= $rW * $termWY' if $set->{'w'}{'on'};
push @compute_coor_code, ' ($x, $y) = ($rR * (($x * $termR11) - ($y * $termR12))'
.',$rR * (($x * $termR21) + ($y * $termR22)))' if $set->{'r'}{'on'}
and $set->{'function'}{'first_rotary'} eq 'w';
push @compute_coor_code, ' $x += $Cx', ' $y += $Cy';
my $pen_size = $set->{'visual'}{'line_thickness'} == 1 ? 0 : $set->{'visual'}{'line_thickness'};
my $wxpen_style = { dotted => &Wx::wxPENSTYLE_DOT, short_dash => &Wx::wxPENSTYLE_SHORT_DASH,
solid => &Wx::wxPENSTYLE_SOLID, vertical => &Wx::wxPENSTYLE_VERTICAL_HATCH,
horizontal => &Wx::wxPENSTYLE_HORIZONTAL_HATCH, cross => &Wx::wxPENSTYLE_CROSS_HATCH,
diagonal => &Wx::wxPENSTYLE_BDIAGONAL_HATCH, bidiagonal => &Wx::wxPENSTYLE_CROSSDIAG_HATCH};
my $pen_style = $wxpen_style->{ $set->{'visual'}{'pen_style'} };
my $pen_probability = $set->{'visual'}{'dot_probability'} /= 100;
my @code = ('sub {','my ($dc, $Cx, $Cy) = @_');
push @code, 'my $r'.uc($_).' = '.($set->{$_}{'radius'} * $set->{$_}{'radius_factor'}) for qw/x y e f w/;
push @code, 'my $rR = '.$set->{'r'}{'radius'};
push @code, ($set->{'x'}{'on'} ? 'my $max_xr = $rX' : 'my $max_xr = 1');
push @code, ($set->{'y'}{'on'} ? 'my $max_yr = $rY' : 'my $max_yr = 1');
push @code, '$max_xr += $rE' if $set->{'e'}{'on'};
push @code, '$max_yr += $rF' if $set->{'f'}{'on'};
push @code, '$max_xr += $rW', '$max_yr += $rW' if $set->{'w'}{'on'};
push @code, '$max_xr *= 1.4', '$max_yr *= 1.4' if $set->{'r'}{'on'};
push @code, '$Cr /= (($max_xr > $max_yr) ? $max_xr : $max_yr)'; # zoom out so everything is visible
push @code, @init_var_code, 'my ($x, $y)';
push @code, 'my ($x_old, $y_old)','my $line_broke = 1' if $set->{'visual'}{'connect_dots'};
push @code, '$dc->SetPen( Wx::Pen->new( shift @wx_colors, $pen_size, $pen_style ) )',
'my $first_color = shift @colors';
push @code, 'my $color_timer = 0' if $color_swap_time;
push @code, 'for my $i (1 .. $dot_count){';
if ($color_swap_time){
push @code, ' if ($color_timer++ == $color_swap_time){', ' $color_timer = 1',
' $dc->SetPen( Wx::Pen->new( shift @wx_colors, $pen_size, $pen_style) )';
push @code, ' $progress_bar->add_percentage( ($i/ $dot_count*100), [(shift @colors)->values] )' unless exists $args->{'sketch'};
push @code, ' }';
}
push @code, @compute_coor_code, @update_var_code;
push @code, ' next if rand(1) > $pen_probability' if $pen_probability < 1;
push @code, ($set->{'visual'}{'connect_dots'}
? (' if ($line_broke) {$line_broke = 0; ($x_old, $y_old) = ($x, $y) }',
' if ($x < 0 or $x > $board_size or $y < 0 or $y > $board_size) {$line_broke++; next}',
' $dc->DrawLine( $x_old, $y_old, $x, $y)',
' ($x_old, $y_old) = ($x, $y)' )
: ($pen_size ? ' $dc->DrawCircle( $x, $y,$pen_size / 2 )' : ' $dc->DrawPoint( $x, $y )'));
push @code, '}';
push @code, '$progress_bar->add_percentage( 100, [$first_color->values] )' unless exists $args->{'sketch'} or $color_swap_time ;
my $code = join '', map {$_.";\n"} @code, '}'; # say $code;
my $code_ref = eval $code;
die "bug '$@' in drawing code: $code" if $@; # say "comp: ",timestr( timediff( Benchmark->new(), $t) );
say "draw";
return $code_ref;
}
1;
( run in 3.294 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )