mwz has asked for the wisdom of the Perl Monks concerning the following question:

Hello fellow monks,

I am working on a Perl/Tk application and I need to draw ribbons from one side of a canvas to the other. To make it easier for users to follow the ribbons, I would like the areas where they intersect to be darker and/or blend the ribbon colors.

I believe that this can be done with GD by using the alpha channels to add transparency. Unfortunately, I haven't been able to find anything on the subject for Perl/Tk, either in "Mastering Perl/Tk" or by googling.

Is there a simple way to add transparency or otherwise color the overlapping region of canvas items (without having to work out where the overlapping regions are myself)?

Here is sample code with overlapping canvas items that do not have the overlapping portions of the items colored.

#!/usr/bin/perl -w use strict; use Tk; my $MW = MainWindow->new(); my $canvas = $MW->Canvas( -background => 'white', ); $canvas->createPolygon( ( 10, 20 ), ( 20, 10 ), ( 250, 240 ), ( 240, 250 ), -fill => 'pink', ); $canvas->createPolygon( ( 250, 20 ), ( 240, 10 ), ( 10, 240 ), ( 20, 250 ), -fill => 'pink', ); $canvas->pack(); MainLoop();
Thank you for any insight that you can give me.

Replies are listed 'Best First'.
Re: Coloring Intesecting Canvas Items in Perl/Tk
by zentara (Cardinal) on Jan 05, 2007 at 20:45 UTC
    If you want to use Perl/Tk, you can only use bitmap stipples for now ( I hear the next release will support transparency). Tk::Zinc does have good alpha transparency. See my posts on Venn diagrams, where I give examples for Tk, Zinc, and Gtk2. Drawing venn diagrams

    But you would do something like this. I shown how to define your own stipple, as well as the predefined ones.

    #!/usr/bin/perl -w use strict; use Tk; my $MW = MainWindow->new(); my $canvas = $MW->Canvas( -background => 'white', ); $canvas->createPolygon( ( 10, 20 ), ( 20, 10 ), ( 250, 240 ), ( 240, 250 ), -fill => 'pink', -stipple => 'gray50', ); $canvas->createPolygon( ( 250, 20 ), ( 240, 10 ), ( 10, 240 ), ( 20, 250 ), -fill => 'blue', -stipple => 'gray12', ); my $stipple_bits = []; # important foreach my $b (1 .. 8) { push @$stipple_bits, pack('b8', '1' x $b . '.' x (8 - $b)); $MW->DefineBitmap("stipple$b" => 8, 1, $stipple_bits->[$b-1]); }; $canvas->createPolygon( ( 150, 20 ), ( 140, 10 ), ( 20, 240 ), ( 30, 250 ), -fill => 'green', -stipple => 'stipple8', ); $canvas->pack(); MainLoop();

    I'm not really a human, but I play one on earth. Cogito ergo sum a bum
      Thanks Zentara. That helped a lot.

      I'm going to use the stippling idea for now but I'm going to take a good look into Zinc (because it looks pretty nice).