X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FSet%2FArc.pm;fp=lib%2FLaTeX%2FTikZ%2FSet%2FArc.pm;h=3ac58e01d6536ee27449076ea18f05de6422ac81;hb=1918fdf5100058cd6a4281bc8b04ec8977841e5e;hp=0000000000000000000000000000000000000000;hpb=d823d115ca3d3718e078dbb986d2c7eb5750df24;p=perl%2Fmodules%2FLaTeX-TikZ.git diff --git a/lib/LaTeX/TikZ/Set/Arc.pm b/lib/LaTeX/TikZ/Set/Arc.pm new file mode 100644 index 0000000..3ac58e0 --- /dev/null +++ b/lib/LaTeX/TikZ/Set/Arc.pm @@ -0,0 +1,101 @@ +package LaTeX::TikZ::Set::Arc; + +use strict; +use warnings; + +=head1 NAME + +LaTeX::TikZ::Set::Arc - A combined set object representing an arc. + +=head1 VERSION + +Version 0.01 + +=cut + +our $VERSION = '0.01'; + +use Carp (); +use Math::Complex (); +use Math::Trig (); + +use LaTeX::TikZ::Point; + +use LaTeX::TikZ::Set::Circle; +use LaTeX::TikZ::Set::Polyline; + +use LaTeX::TikZ::Tools; + +use Any::Moose 'Util::TypeConstraints' => [ 'find_type_constraint' ]; + +my $ltp_tc = find_type_constraint('LaTeX::TikZ::Point::Autocoerce'); + +use LaTeX::TikZ::Interface arc => sub { + shift; + Carp::confess('Tikz->arc($first_point, $second_point, $center)') if @_ < 3; + my ($a, $b, $c) = @_; + + for ($a, $b, $c) { + my $p = $ltp_tc->coerce($_); + $_ = Math::Complex->make($p->x, $p->y); + } + + my $r = abs($a - $c); + Carp::confess("The two first points aren't on a circle of center the last") + unless LaTeX::TikZ::Tools::numeq(abs($b - $c), $r); + + my $set = LaTeX::TikZ::Set::Circle->new( + center => $c, + radius => $r, + ); + + my $factor = 1/32; + + my $theta = (($b - $c) / ($a - $c))->arg; + my $points = int(abs($theta) / abs(Math::Trig::acos(0.95))); + $theta /= $points + 1; + my $rho = (1 / cos($theta)) / (1 - $factor); + + my $ua = ($a - $c) * (1 - $factor) + $c; + my $ub = ($b - $c) * (1 - $factor) + $c; + + my @outside = map { $_ * $rho + $c } ( + $a - $c, + (map { ($a - $c) * Math::Complex->emake(1, $_ * $theta) } 1 .. $points), + $b - $c, + ); + + $set->clip( + LaTeX::TikZ::Set::Polyline->new( + points => [ $ua, @outside, $ub ], + closed => 1, + ), + ); +}; + +=head1 AUTHOR + +Vincent Pit, C<< >>, L. + +You can contact me by mail or on C (vincent). + +=head1 BUGS + +Please report any bugs or feature requests to C, or through the web interface at L. +I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command. + + perldoc LaTeX::TikZ + +=head1 COPYRIGHT & LICENSE + +Copyright 2010 Vincent Pit, all rights reserved. + +This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. + +=cut + +1; # End of LaTeX::TikZ::Set::Arc