X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FLaTeX-TikZ.git;a=blobdiff_plain;f=lib%2FLaTeX%2FTikZ%2FSet%2FArc.pm;h=9039cf02232b72144468a8352af48c7b619d12d0;hp=3bbe83d83074b8d3fc8d7009b1f9da7a8b624927;hb=af7d6a5aef3bf5fec0c187b3a13a14adc88251fd;hpb=92147217516a40b35ca00c8e08939e8aa5478426 diff --git a/lib/LaTeX/TikZ/Set/Arc.pm b/lib/LaTeX/TikZ/Set/Arc.pm index 3bbe83d..9039cf0 100644 --- a/lib/LaTeX/TikZ/Set/Arc.pm +++ b/lib/LaTeX/TikZ/Set/Arc.pm @@ -24,55 +24,59 @@ use LaTeX::TikZ::Point; use LaTeX::TikZ::Set::Circle; use LaTeX::TikZ::Set::Polyline; +use LaTeX::TikZ::Interface; + 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) = @_; +LaTeX::TikZ::Interface->register( + 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($_); - $ltp_tc->assert_valid($p); - $_ = Math::Complex->make($p->x, $p->y); - } + for ($a, $b, $c) { + my $p = $ltp_tc->coerce($_); + $ltp_tc->assert_valid($p); + $_ = 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") + 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, - ), - ); -}; + 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