Viewing file: triangle.pl (4.45 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
=pod
=head1 NAME
examples/triangle.pl - Escher's Impossible Triangle
=head1 FEATURES
Demonstrates the basic usage of the Prima toolkit.
=cut
use strict; use warnings; use Prima qw(Buttons); use constant PI => 4.0 * atan2 1, 1; use constant D2R => PI / 180; use constant Cos_120 => cos(D2R*(-120)); use constant Sin_120 => sin(D2R*(-120));
use Prima::Application name => "Escher's Impossible Triangle";
sub recalc_coordinates { my $me = $_[0]; $me-> {angle} = 0 unless exists $me-> {angle}; delete $me-> {line1}; delete $me-> {line2}; delete $me-> {line3}; my ($w, $h) = $me-> size; my $sz = ($w > $h ? $h : $w) * 0.8 * 0.5; my ($x, $y) = (25*$sz/34,$sz); my ($fx, $fy) = ($x,$y); ($w,$h) = ($w/2,$h/2); my $angle = $me-> {angle}; for (1..3) { my $cos = cos(D2R*$angle); my $sin = sin(D2R*$angle); my @lines = (); ($x,$y) = ($fx, $fy); push @lines, $cos*$x-$sin*$y+$w, $sin*$x+$cos*$y+$h; $y = -$y; push @lines, $cos*$x-$sin*$y+$w, $sin*$x+$cos*$y+$h; # rotate -120 $x = Cos_120*$fx - Sin_120*$fy; $y = Sin_120*$fx + Cos_120*$fy; push @lines, $cos*$x-$sin*$y+$w, $sin*$x+$cos*$y+$h; $y = -$y/2; push @lines, $cos*$x-$sin*$y+$w, $sin*$x+$cos*$y+$h; ($x, $y) = ($x-sqrt(3)*$y,0); push @lines, $cos*$x-$sin*$y+$w, $sin*$x+$cos*$y+$h; $me-> {'line' . $_} = [@lines]; $angle += 120; } }
my $w = Prima::MainWindow-> create( #my $w = Window-> create( text => $::application-> name, left => 200, bottom => 300, width => 400, height => 250, borderIcons => 0, windowState => ws::Maximized, borderStyle => bs::None, backColor => cl::Black, hiliteColor => cl::LightCyan, lineWidth => 2, # onSize => \&recalc_coordinates, onCreate => sub { $_[0]-> {r} = $_[0]-> {g} = $_[0]-> {b} = $_[0]-> {c} = 0; my $t = $_[0]-> insert( Timer => timeout => 10, name => 'Timer', onTick => sub { my $me = $_[0]-> owner; my $back = $me-> backColor; # my $fore = $me-> hiliteColor; $me-> {c} = 255 if $me-> {c} >= 1785; $me-> {c}++; if ( $me-> {c} <= 255) { $me-> {r}++; $me-> {g}++; $me-> {b}++; } elsif ( $me-> {c} <= 510) { $me-> {g}--; $me-> {b}--; } elsif ( $me-> {c} <= 765) { $me-> {g}++; } elsif ( $me-> {c} <= 1020) { $me-> {r}--; } elsif ( $me-> {c} <= 1275) { $me-> {b}++; } elsif ( $me-> {c} <= 1530) { $me-> {g}--; } else { $me-> {g}++; $me-> {r}++;} $me-> {c} = 255 if $me-> {c} >= 1785; $me-> {c}++; if ( $me-> {c} <= 255) { $me-> {r}++; $me-> {g}++; $me-> {b}++; } elsif ( $me-> {c} <= 510) { $me-> {g}--; $me-> {b}--; } elsif ( $me-> {c} <= 765) { $me-> {g}++; } elsif ( $me-> {c} <= 1020) { $me-> {r}--; } elsif ( $me-> {c} <= 1275) { $me-> {b}++; } elsif ( $me-> {c} <= 1530) { $me-> {g}--; } else { $me-> {g}++; $me-> {r}++;} $me-> {c} = 255 if $me-> {c} >= 1785; $me-> {c}++; if ( $me-> {c} <= 255) { $me-> {r}++; $me-> {g}++; $me-> {b}++; } elsif ( $me-> {c} <= 510) { $me-> {g}--; $me-> {b}--; } elsif ( $me-> {c} <= 765) { $me-> {g}++; } elsif ( $me-> {c} <= 1020) { $me-> {r}--; } elsif ( $me-> {c} <= 1275) { $me-> {b}++; } elsif ( $me-> {c} <= 1530) { $me-> {g}--; } else { $me-> {g}++; $me-> {r}++;} my $fore = $me-> {b} | ($me-> {g}<<8) | ($me-> {r}<<16); my $l1 = $me-> {line1}; my $l2 = $me-> {line2}; my $l3 = $me-> {line3}; # ($l1,$l2,$l3) = (); $me-> {angle} += 1; $me-> {angle} -= 360 if $me-> {angle} > 360; &recalc_coordinates($me); $me-> begin_paint; #$me-> color( $back); #$me-> polyline( $l1) if defined $l1; $me-> color( $fore); $me-> bar(0,0,30,30); $me-> polyline( $me-> {line1}) if exists $me-> {line1}; $me-> color( $back); $me-> polyline( $l2) if defined $l2; $me-> color( $fore); $me-> polyline( $me-> {line2}) if exists $me-> {line2}; #$me-> fillpoly( $me-> {line2}) if exists $me-> {line2}; #$me-> color( $back); #$me-> polyline( $l3) if defined $l3; $me-> color( $fore); $me-> polyline( $me-> {line1}) if exists $me-> {line1}; $me-> polyline( $me-> {line2}) if exists $me-> {line2}; $me-> polyline( $me-> {line3}) if exists $me-> {line3}; $me-> end_paint; }); $t-> start; &recalc_coordinates($_[0]); }, onPaint => sub { my ($me,$canvas) = @_; $canvas-> color( $me-> backColor); $canvas-> bar( 0, 0, $canvas-> size); }, );
$w-> insert( Button => text => "Install PRIMA now!", width => $w-> get_text_width( "Install PRIMA now!") * 1.2, # centered => 1, growMode => gm::Center, onClick => sub { $::application-> close}, );
run Prima;
|