flash as3使用curveTo绘制圆环楔(具有内外半径的圆弧)

flash as3使用curveTo绘制圆环楔(具有内外半径的圆弧),flash,actionscript-3,actionscript,drawing,Flash,Actionscript 3,Actionscript,Drawing,我试图用最少的代码/迭代在flash中画一条弧。下面我从一个旧的AS2示例移植了这个方法,但是它需要一个循环,通过许多步骤使它看起来平滑,我宁愿避免这种情况。我看到AS3有一个“curveTo”命令,但它实际上并没有画圆弧,而是画了一条贝塞尔曲线。flash中是否有arc命令?还是画一段圆的方法 这是我的旧代码: function drawSolidArc (drawObj:Object, centerX:Number,centerY:Number,innerRadius:Number,oute

我试图用最少的代码/迭代在flash中画一条弧。下面我从一个旧的AS2示例移植了这个方法,但是它需要一个循环,通过许多步骤使它看起来平滑,我宁愿避免这种情况。我看到AS3有一个“curveTo”命令,但它实际上并没有画圆弧,而是画了一条贝塞尔曲线。flash中是否有arc命令?还是画一段圆的方法

这是我的旧代码:

function drawSolidArc (drawObj:Object, centerX:Number,centerY:Number,innerRadius:Number,outerRadius:Number,startAngle:Number,arcAngle:Number,steps:int=20):void {
    if (Math.abs(startAngle)>360)startAngle%=360
    if (Math.abs(arcAngle)>360)arcAngle%=360
    startAngle/=360,arcAngle/=360
    var twoPI:Number = 2 * Math.PI;
    var angleStep:Number = arcAngle/steps;
    var angle:Number, i:int, endAngle:Number;
    var xx:Number = centerX + Math.cos(startAngle * twoPI) * innerRadius;
    var yy:Number = centerY + Math.sin(startAngle * twoPI) * innerRadius;
    var xxInit:Number=xx;
    var yyInit:Number=yy;
    drawObj.graphics.moveTo(xx,yy);
    for(i=1; i<=steps; i++) {
        angle = (startAngle + i * angleStep) * twoPI;
        xx = centerX + Math.cos(angle) * innerRadius;
        yy = centerY + Math.sin(angle) * innerRadius;
        drawObj.graphics.lineTo(xx,yy);
    }
    endAngle = startAngle + arcAngle;
    for(i=0;i<=steps;i++) {
        angle = (endAngle - i * angleStep) * twoPI;
        xx = centerX + Math.cos(angle) * outerRadius;
        yy = centerY + Math.sin(angle) * outerRadius;
        drawObj.graphics.lineTo(xx,yy);
    }

    drawObj.graphics.lineTo(xxInit,yyInit);
};

var myArc:Shape = new Shape(); //or another DisplayObject

myArc.graphics.beginFill(0xcccccc, 0.50);
//objName, centerX,centerY, innerRadius, outerRadius, startAngle (12 o'clock is -90), arcAngle (degrees from startAngle), steps (smoothness)
drawSolidArc (myArc,250, 250, 180, 200, -90, 65, 100);
myArc.graphics.endFill();
this.addChild(myArc);
函数drawSolidArc(drawObj:Object,centerX:Number,centerY:Number,innerRadius:Number,outerRadius:Number,startAngle:Number,arcAngle:Number,steps:int=20):无效{
如果(数学abs(startAngle)>360)startAngle%=360
如果(数学绝对值(弧角)>360)弧角%=360
startAngle/=360,arcAngle/=360
var twoPI:Number=2*Math.PI;
var angleStep:数值=弧角/步数;
变量角度:Number,i:int,endAngle:Number;
变量xx:Number=centerX+Math.cos(startAngle*twoPI)*内半径;
变量yy:Number=centerY+Math.sin(startAngle*twoPI)*内半径;
变量xxInit:Number=xx;
var yyInit:Number=yy;
drawObj.graphics.moveTo(xx,yy);

因为(i=1;i比
curveTo
能更好地近似圆弧。但它仍然不完美。

我就是这样做的:

画一个甜甜圈并遮住它:

_foreground = new Sprite();
_foreground.graphics.beginFill(_colour)
_foreground.graphics.drawCircle(0, 0, _outerRadius);
_foreground.graphics.drawCircle(0, 0, _innerRadius);
_foreground.graphics.endFill();
_container.addChild(_foreground);

_mask = new Sprite();
_mask.graphics.beginFill(0xff0000);
_foreground.mask = _mask;
然后用这种方法画它——在遮罩上画一个楔子

private function draw(e:Event):void //Called each frame (if animating)
{
// No need to draw more than 360
if (Math.abs(_arc) > _endAngle) 
{
    _arc = _endAngle;
    stop();
}

_numOfSegs = Math.ceil(Math.abs(_arc) / 45);
_segAngle = _arc / _numOfSegs;
_segAngle = (_segAngle / 180) * Math.PI;
_angle = (_startAngle / 180) * Math.PI;

// Calculate the start point
_ax = Math.cos(_angle) * _outerRadius;
_ay = Math.sin(-_angle) * _outerRadius;

// Draw the first line
_mask.graphics.lineTo(_ax, _ay);

for (var i:int=0; i<_numOfSegs; i++) 
{
    _angle += _segAngle;
    _angleMid = _angle - (_segAngle / 2);
    _bx = Math.cos(_angle) * _outerRadius;
    _by = Math.sin(_angle) * _outerRadius;
    _cx = Math.cos(_angleMid) * (_outerRadius / Math.cos(_segAngle / 2));
    _cy = Math.sin(_angleMid) * (_outerRadius / Math.cos(_segAngle / 2));
    _mask.graphics.curveTo(_cx, _cy, _bx, _by);
}

// Close the wedge
_mask.graphics.lineTo(0, 0);
_arc += 3.6; //This gives a 100 steps to complete the circle
}
私有函数draw(e:Event):void//调用每个帧(如果设置动画)
{
//不需要绘制超过360的图形
if(数学绝对值(_弧)>端角)
{
_弧=_端角;
停止();
}
_numOfSegs=Math.ceil(Math.abs(_-arc)/45);
_segAngle=_弧/_numosegs;
_segAngle=(_segAngle/180)*Math.PI;
_角度=(_startAngle/180)*Math.PI;
//计算起点
_ax=数学cos(_角度)*_外表面;
_ay=数学正弦(-u角)*\u外圆;
//画第一条线
_mask.graphics.lineTo(_ax,_ay);

对于(var i:int=0;i那么就有了。但是它几乎和你发布的一样凌乱。恐怕没有优雅的方式(几行左右)绘制圆弧的方法。

下面是我编写的几个不同形状绘制类的链接。通过绘制楔块并用第二个圆形状遮住圆心,可以获得所需的圆段


我做了一些与Jeremy的解决方案类似的事情,尽管我没有掩盖它。显然,如果从同一个中心点创建另一个半径较小的圆弧,它将从现有形状中减去,因此我只是在第一个之后,在endFill之前,再次调用drawSolidArc,以零为中心点,外半径为t他希望第一个楔块的内径:

var myArc:Sprite = new Sprite();
myArc.graphics.beginFill(0xcccccc, 1);
drawArc(myArc, 275, 200, 60, 150, 35); //spriteName, startX, startY, innerRadius, radius, arcAngle, startAngle
drawArc(myArc, 275, 200, 0, 60, 35); //subtract out the middle by drawing a new circle over the top of it
myArc.graphics.endFill();
this.addChild(myArc);

我在文档中没有看到任何名为cubicCurveTo的函数,当我尝试使用该函数时,会出现错误。只需按照链接;)语言版本:ActionScript 3.0运行时版本:Flash Player 11,AIR 3I甚至无法在CS5中发布到Flash Player 11-目前对我来说不是一个可行的选项。我看到一个MXP添加了此功能,但你必须以管理员的身份在计算机上运行才能安装它,这对我来说也不是一个工作选项。但如果你能安装它,我会很高兴在更新版本的flash中有一个更精确的曲线方法。哦,对不起,我不知道你是用flash编译的。谢谢-这是一个很好的库。