Flash动态生成扇形

来源:互联网 发布:spyder导入mysql包 编辑:程序博客网 时间:2024/04/28 03:32

Flash并没有提供可以直接生成扇形的API。使用curveTo画的也只是贝塞尔曲线,不是圆弧线,

所以只能自己手动用微积分的原理生成了。

 

////////////////////////////////////////////////////////////////////////////////
//
//  GiantJadder@gmail.com
//    This class is designed to generate dynamic sectors.
//
////////////////////////////////////////////////////////////////////////////////
package  {
    import flash.display.Sprite;
    import flash.display.Graphics;

    public class Sector extends Sprite {

         private var innerRadius:Number;
        private var outterRadius:Number;
        private var angle:Number;
        private var startXAngle:Number;
           private var quality:int;
           private var color:uint;
           private var sectorAlpha:Number;
  
           private var n:int;
           private var smallAngle:Number;
  
           private var g:Graphics;
  
        public function reDraw(
            _innerRadius:Number,
            _outterRadius:Number,
            _angle:Number,
            _startXAngle:Number,
            _color:uint,
            _alpha:Number,
            _quality:int  // from 0 ~ 4;
        ):void{
            innerRadius = _innerRadius;
            outterRadius = _outterRadius;
            angle  = _angle;
            startXAngle = _startXAngle;
            quality = _quality;
            color = _color;
            sectorAlpha = _alpha;
           
            g = graphics;
            g.clear();
           
            n = 20*(quality+1);
           
            smallAngle = angle/n;
           
            var i:int = 0;
           
            g.beginFill(color,sectorAlpha);
   
            g.moveTo( outterRadius*Math.cos( startXAngle), -outterRadius*Math.sin(startXAngle) );
            for(i=1;i<=n;i++){
                g.lineTo(
                outterRadius*Math.cos( startXAngle+i*smallAngle),
                -outterRadius*Math.sin( startXAngle+i*smallAngle)
                );
            }
           
            g.lineTo( innerRadius*Math.cos( startXAngle+angle), -innerRadius*Math.sin(startXAngle+angle) );
            for(i=1;i<=n;i++){
                g.lineTo(
                innerRadius*Math.cos( startXAngle+angle-i*smallAngle),
                -innerRadius*Math.sin( startXAngle+angle-i*smallAngle)
                );
            } 
            g.endFill();
        }
    }
}
这个类使用上面的Sector来生成一个双层圆环。 
package  {
    import flash.display.MovieClip;
    import flash.events.Event;
   
    [SWF(backgroundColor=0xfffff0,width=700,height=700,frameRate=30)]
    public class SectorDemo extends MovieClip {
        private var innerR:Number = 100;
        private var mediateR:Number = 200;
        private var outterR:Number = 300;
         
        private var colors:Array = [ 0xffffff*Math.random(),
                                    0xffffff*Math.random(),
                                    0xffffff*Math.random(),
                                    0xffffff*Math.random(),
                                    0xffffff*Math.random()
                                    ];
        private var innerSectors:Array;
        private var outterSectors:Array;
         
        public function SectorDemo() {
            addEventListener(Event.ENTER_FRAME,animating);
            innerSectors = new Array();
            outterSectors = new Array();
            var i:int = 0;
            for(i=0;i<4;i++){
                var innerSector:Sector = new Sector();
                 addChild(innerSector);
                 innerSector.x = 350;
                 innerSector.y = 350;
                 innerSectors[i] = innerSector;
            }
            for(i=0;i<4;i++){
                var outterSector:Sector = new Sector();
                addChild(outterSector);
                outterSector.x = 350;
                outterSector.y = 350;
                outterSectors[i] = outterSector;
            } 
           
        }
       
        private var angle:Number = 0;
       
        private function animating(e:Event):void{
            angle+= 0.01;
            var i:int = 0;
            for(i=0;i<4;i++){
                 innerSectors[i].reDraw( innerR,mediateR, Math.PI*0.5, angle+i*Math.PI*0.5,colors[i] ,1.0,4);  
            }
            for(i=0;i<4;i++){
                outterSectors[i].reDraw( mediateR,outterR,Math.PI*0.5, -angle+i*Math.PI*0.5+Math.PI*0.25, colors[i] ,1.0,4);
            } 
        }
    }
}