use Math::Trig qw(atan deg2rad rad2deg); sub _thick_line { my ($image, $thickness, $color, $x1, $y1, $x2, $y2) = @_; my $angle = _angle($x1, $y1, $x2, $y2); my $mirror1 = $angle + 90; my $mirror2 = $angle - 90; my $m1c = $thickness*cos(deg2rad $mirror1)/2; my $m1s = $thickness*sin(deg2rad $mirror1)/2; my $m2c = $thickness*cos(deg2rad $mirror2)/2; my $m2s = $thickness*sin(deg2rad $mirror2)/2; my $x1a = $x1 + $m1c; # bottom left my $y1a = $y1 + $m1s; my $x1b = $x1 + $m2c; # top left my $y1b = $y1 + $m2s; my $x2a = $x2 + $m1c; # bottom right my $y2a = $y2 + $m1s; my $x2b = $x2 + $m2c; # top right my $y2b = $y2 + $m2s; $image->polygon( aa => 1, color => $color, points => [ [$x1a, $y1a], [$x2a, $y2a], [$x2b, $y2b], [$x1b, $y1b], ], ); } sub _angle { my ($x1, $y1, $x2, $y2) = @_; my $x = $x2 - $x1; my $y = $y2 - $y1; # short circuit the extreme cases return 0 if $x > 0 and $y == 0; return 180 if $x < 0 and $y == 0; return 90 if $x == 0 and $y > 0; return 270 if $x == 0 and $y < 0; # calculate the rest return rad2deg atan($y/$x); }