#! perl -slw use strict; use Tk; our $W = our $H = 600; ## 2012-07-31-18:49:09 use constant PI => 3.1415926535897932384626433832795; use constant RAD => 180 / PI; sub curvedArrow { my $tag = 'thetag my( $cnv, $x1, $y1, $x2, $y2, $color ) = ( ' . join(', ', @_ ).')'; my( $cnv, $x1, $y1, $x2, $y2, $color ) = @_; my $rad = sqrt( abs( $x1 - $x2 )**2 + abs( $y1 - $y2 )**2 ); my $q = sqrt( ( $x2 - $x1 )**2 + ( $y2 - $y1 )**2 ); my( $x3, $y3 ) = ( ( $x1 + $x2 ) / 2, ( $y1 + $y2 ) / 2 ); my $xc = $x3 + sqrt( $rad**2 - ( $q / 2 )**2 ) * ( $y1 - $y2 ) / $q; my $yc = $y3 + sqrt( $rad**2 - ( $q / 2 )**2 ) * ( $x2 - $x1 ) / $q; my $a1 = atan2( ( $yc - $y1 ) , -( $xc - $x1 ) ) * RAD; my $a2 = atan2( ( $yc - $y2 ) , -( $xc - $x2 ) ) * RAD; my @one = ( $xc - $rad, $yc - $rad, $xc + $rad, $yc + $rad, -style => 'arc', -start => $a1, -extent => $a2 - $a1, ); $cnv->createArc( @one, -outline=> $color, -tags => ["one $tag ", "one @one"], ); my $r2 = $rad / 15; $cnv->createArc( $x1-$r2, $y1-$r2, $x1+$r2, $y1+$r2, -start=>$a1-77, -extent=>($a2-$a1)/2, -fill=> $color, -tags => ["two $tag "], ); $cnv->createArc( $x2-$r2, $y2-$r2, $x2+$r2, $y2+$r2, -start=> ( $a2+107 ) %360, -extent=>($a2-$a1)/2, -fill=> $color, -tags => ["three $tag "], ); return $xc, $yc; } our $W //= 1000; our $H //= 800; my $mw = new MainWindow(-title => 'Test'); my $canvas = $mw->Canvas(-width => $W, -height => $H )->pack; for( 1 .. 10 ) { my( $x1, $y1 ) = ( int( rand( $W ) ), int( rand( $H ) ) ); $canvas->createLine( $x1-5, $y1, $x1+5, $y1, -fill => 'blue' ); $canvas->createLine( $x1, $y1-5, $x1, $y1+5, -fill => 'blue' ); my( $x2, $y2 ) = ( int( rand $W ), int( rand $H ) ); $canvas->createLine( $x2-5, $y2, $x2+5, $y2, -fill => 'green' ); $canvas->createLine( $x2, $y2-5, $x2, $y2+5, -fill => 'green' ); my( $xc, $yc ) = curvedArrow( $canvas, $x1, $y1, $x2, $y2, 'black' ); $canvas->createLine( $xc-5, $yc, $xc+5, $yc, -fill => 'red' ); $canvas->createLine( $xc, $yc-5, $xc, $yc+5, -fill => 'red' ); ( $xc, $yc ) = curvedArrow( $canvas, $x2, $y2, $x1, $y1, 'red' ); $canvas->createLine( $xc-5, $yc, $xc+5, $yc, -fill => 'red' ); $canvas->createLine( $xc, $yc-5, $xc, $yc+5, -fill => 'red' ); } #~ $canvas->bind( '<<1>>', \&tagsUnderMouse ); #~ $canvas->bind( '', \&tagsUnderMouse ); #~ $canvas->bind( '' , \&tagsUnderMouse ); $mw->bind( ref( $canvas ), '' , \&tagsUnderMouse ); MainLoop; sub tagsUnderMouse { warn "@_"; #~ my $canvas = $Tk::event->W; my $x = $Tk::event->X; my $y = $Tk::event->Y; my( $canvas ) = @_; use Data::Dump; my @closest = $canvas->find( closest => $x, $y ) ; #~ my %ccget = map { $_ => [ $canvas->itemconfigure($_) ] } @closest; my %ccget = map { $_ => [ $canvas->itemcget($_, '-tags') ] } @closest; dd [ "$canvas", \@closest , \%ccget ]; }