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 )