| Bio-Graphics documentation | Contained in the Bio-Graphics distribution. |
Bio::Graphics::Glyph::triangle - The "triangle" glyph
See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>.
This glyph draws an equilateral triangle when -point is defined. It draws an isoceles triangle otherwise. It is possible to draw the triangle with the base on the N, S, E, or W side.
In addition to the common options, the following glyph-specific options are recognized:
Option Description Default
------ ----------- -------
-point If true, the triangle 0
will drawn at the center
of the range, and not scaled
to the feature width.
-orient On which side shall the S
base be? (NSEW)
Please report them.
Bio::Graphics::Panel, Bio::Graphics::Glyph, Bio::Graphics::Glyph::arrow, Bio::Graphics::Glyph::cds, Bio::Graphics::Glyph::crossbox, Bio::Graphics::Glyph::diamond, Bio::Graphics::Glyph::dna, Bio::Graphics::Glyph::dot, Bio::Graphics::Glyph::ellipse, Bio::Graphics::Glyph::extending_arrow, Bio::Graphics::Glyph::generic, Bio::Graphics::Glyph::graded_segments, Bio::Graphics::Glyph::heterogeneous_segments, Bio::Graphics::Glyph::line, Bio::Graphics::Glyph::pinsertion, Bio::Graphics::Glyph::primers, Bio::Graphics::Glyph::rndrect, Bio::Graphics::Glyph::segments, Bio::Graphics::Glyph::ruler_arrow, Bio::Graphics::Glyph::toomany, Bio::Graphics::Glyph::transcript, Bio::Graphics::Glyph::transcript2, Bio::Graphics::Glyph::translation, Bio::Graphics::Glyph::triangle, Bio::DB::GFF, Bio::SeqI, Bio::SeqFeatureI, Bio::Das, GD
Allen Day <day@cshl.org>.
Copyright (c) 2001 Cold Spring Harbor Laboratory
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See DISCLAIMER.txt for disclaimers of warranty.
| Bio-Graphics documentation | Contained in the Bio-Graphics distribution. |
package Bio::Graphics::Glyph::triangle; # DAS-compatible package to use for drawing a triangle use strict; use base qw(Bio::Graphics::Glyph::generic); sub pad_left { my $self = shift; my $left = $self->SUPER::pad_left; return $left unless $self->option('point'); my $extra = $self->option('height')/3; return $extra > $left ? $extra : $left; } sub pad_right { my $self = shift; my $right = $self->SUPER::pad_right; return $right unless $self->option('point'); my $extra = $self->option('height')/3; return $extra > $right ? $extra : $right; } sub orient { my $self = shift; my $o = $self->option('orient'); $o = $self->option('direction') unless defined $o; return $o || 'S'; } sub draw_component { my $self = shift; my $gd = shift; my $fg = $self->fgcolor; my $orient = $self->option('orient') || 'S'; # find the center and vertices my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries(@_); my $xmid = ($x1+$x2)/2; my $ymid = ($y1+$y2)/2; my ($vx1,$vy1,$vx2,$vy2,$vx3,$vy3); #make an equilateral my ($p,$q) = ($self->option('height'),($x2-$x1)/2); if ($self->option('point')){ $q = $p/sqrt(3); #2; $x1 = $xmid - $q; $x2 = $xmid + $q; $y1 = $ymid - $q; $y2 = $ymid + $q; } if ($orient eq 'S'){$vx1=$x1;$vy1=$y1;$vx2=$x2;$vy2=$y1;$vx3=$xmid;$vy3=$y2;} elsif($orient eq 'N'){$vx1=$x1;$vy1=$y2;$vx2=$x2;$vy2=$y2;$vx3=$xmid;$vy3=$y1;} elsif($orient eq 'W'){$vx1=$x2;$vy1=$y1;$vx2=$x2;$vy2=$y2;$vx3=$x2-$q*2;$vy3=$ymid;} elsif($orient eq 'E'){$vx1=$x1;$vy1=$y1;$vx2=$x1;$vy2=$y2;$vx3=$x1+$q*2;$vy3=$ymid;} # now draw the triangle my $poly_pkg = $self->polygon_package; my $poly = $poly_pkg->new(); $poly->addPt($vx1,$vy1); $poly->addPt($vx2,$vy2); $poly->addPt($vx3,$vy3); if (my $c = $self->bgcolor){ $gd->filledPolygon($poly,$c); } $gd->polygon($poly,$fg); } 1; __END__