It seems that the ming library up to at least v0.4.2 has some rounding issues with rendering the arc. This is most evident as the radius of the arc gets smaller (try drawing a circle/arc with radius 1 using ming, better yet, try 0.5). The following code renders a much more accurate arc at smaller radii. It also does range checking/normalization on the angles passed in that ming doesn't do.
<?php
function drawArc( $shape, $r, $startAngle, $endAngle ) {
$delta = $endAngle - $startAngle;
if ( abs($delta) >= 360)
$delta = 360;
else if ($delta < 0)
$delta += 360;
else if ($delta == 0)
return;
$startAngle = fmod($startAngle, 360);
$nSegs = 1 + (int)round(7 * ($delta / 360));
$subangle = M_PI * $delta / $nSegs / 360;
$angle = M_PI * $startAngle / 180;
$x = $r * sin($angle);
$y = -$r * cos($angle);
$shape->movePen($x, $y);
$controlRadius = $r / cos($subangle);
for ( $i=0; $i<$nSegs; ++$i )
{
$angle += $subangle;
$controlx = $controlRadius * sin($angle);
$controly = -$controlRadius * cos($angle);
$angle += $subangle;
$anchorx = ($r*sin($angle));
$anchory = (-$r*cos($angle));
$shape->drawCurve($controlx-$x, $controly-$y,
$anchorx-$controlx, $anchory-$controly);
$x = $anchorx;
$y = $anchory;
}
}
function drawCircle( $shape, $r ) {
drawArc( $shape, $r, 0, 360 );
}
ming_setScale(20);
ming_useswfversion(7);
$movie = new SWFMovie();
$movie->setBackground( 0xff, 0xff, 0xff );
$movie->setRate(31);
$sprite = new SWFSprite();
$shape = new SWFShape();
$shape->setLine( 0, 0, 0xff, 0 );
$shape->movePenTo( 50, 50 );
$shape->drawCircle( 5 );
$shape->movePenTo( 50, 50 );
$shape->drawCircle( 3 );
$shape->movePenTo( 50, 50 );
$shape->drawCircle( 1 );
$shape->movePenTo( 50, 50 );
$shape->drawCircle( 0.5 );
$shape->setLine( 0, 0, 0, 0 );
$shape->movePenTo( 50, 50 );
drawCircle( $shape, 5 );
$shape->movePenTo( 50, 50 );
drawCircle( $shape, 3 );
$shape->movePenTo( 50, 50 );
drawCircle( $shape, 1 );
$shape->movePenTo( 50, 50 );
drawCircle( $shape, 0.5 );
$sprite->add($shape);
$sprite->nextFrame();
$d = $movie->add($sprite);
$movie->setDimension( 100, 100 );
$movie->save( "test.swf" );
?>