Seems I was misunderstanding the interactions between atan2's +-Pi returns and Tk::Canvas' +-360° inputs. I was trying too hard.
The results of the simplification look like this
I'll update the original post, but here is the modified code and updated test
#! perl -slw use strict; use Tk; use constant PI => 3.1415926535897932384626433832795; use constant RAD => 180 / PI; sub curvedArrow { my( $cnv, $x1, $y1, $x2, $y2, $color ) = @_; ## set the radius to the distance between p1 & p2 my $rad = sqrt( abs( $x1 - $x2 )**2 + abs( $y1 - $y2 )**2 ); my $q = sqrt( ( $x2 - $x1 )**2 + ( $y2 - $y1 )**2 ); my( $x3, $y3 ) = ( ( $x1 + $x2 ) / 2, ( $y1 + $y2 ) / 2 ); my $xc = $x3 + sqrt( $rad**2 - ( $q / 2 )**2 ) * ( $y1 - $y2 ) / $ +q; my $yc = $y3 + sqrt( $rad**2 - ( $q / 2 )**2 ) * ( $x2 - $x1 ) / $ +q; my $a1 = atan2( ( $yc - $y1 ), -( $xc - $x1 ) ) * RAD; my $a2 = atan2( ( $yc - $y2 ), -( $xc - $x2 ) ) * RAD; $cnv->createArc( $xc - $rad, $yc - $rad, $xc + $rad, $yc + $rad, -style => 'arc', -start => $a1, -extent => -60, -outline=> $color ); my $r2 = $rad / 15; $cnv->createArc( $x1-$r2, $y1-$r2, $x1+$r2, $y1+$r2, -start=>$a1-77, -extent=> -30, -fill=> $color ); $cnv->createArc( $x2-$r2, $y2-$r2, $x2+$r2, $y2+$r2, -start=> ( $a2+107 ) %360, -extent=> -30, -fill=> $color ); return $xc, $yc; } our $W //= 1000; our $H //= 1000; my $mw = new MainWindow(-title => 'Test'); my $canvas = $mw->Canvas(-width => $W, -height => $H )->pack; for my $radius ( 500, 100 ) { for( my $a = 0; $a < 180; $a += 10 ) { my( $x, $y ) = ( sin( $a / RAD )*$radius, cos( $a / RAD )*$rad +ius ); my( $x1, $y1, $x2, $y2 ) = ( 500-$x, 500-$y, 500+$x, 500+$y, +); $canvas->createLine( $x1-5, $y1, $x1+5, $y1, -fill => 'blue' ) +; $canvas->createLine( $x1, $y1-5, $x1, $y1+5, -fill => 'blue' ) +; $canvas->createLine( $x2-5, $y2, $x2+5, $y2, -fill => 'green' +); $canvas->createLine( $x2, $y2-5, $x2, $y2+5, -fill => 'green' +); my( $xc, $yc ) = curvedArrow( $canvas, $x1, $y1, $x2, $y2, 'bl +ack' ); $canvas->createLine( $xc-5, $yc, $xc+5, $yc, -fill => 'red' ); $canvas->createLine( $xc, $yc-5, $xc, $yc+5, -fill => 'red' ); ( $xc, $yc ) = curvedArrow( $canvas, $x2, $y2, $x1, $y1, 're +d' ); $canvas->createLine( $xc-5, $yc, $xc+5, $yc, -fill => 'red' ); $canvas->createLine( $xc, $yc-5, $xc, $yc+5, -fill => 'red' ); } } MainLoop;
In reply to Re: My math error or Perl's? (Solved:mine)
by BrowserUk
in thread My math error or Perl's?
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |