简单的as布局算法(包括 圆形,椭圆,弧形)

来源:互联网 发布:阿迪达斯三叶草鞋 淘宝 编辑:程序博客网 时间:2024/06/05 04:08

最近工作需要在学习Flash 编程 工作主要涉及到的是一些元素之间关联连线,布局等算法。经过一段时间的摸索。总结了以下几种项目中常用的算法。废话不多说了。看码.

package com.triman.layout
{
import flash.geom.Point;

/**
* 布局算法 常用的布局算法有
* 圆形布局 ,扇形布局 椭圆布局等。
* 其中圆布局是椭圆布局的一种特例。
* 所以椭圆布局继承了椭圆布局算法
* 而 椭圆布局是弧形的一种特例。

* +Round
*   +Ellipse
*     +Camber 
这个是一个布局的抽象类 所有的布局算法都是继承它的。
* */
public class LayOut

   //布局的类型 
   protected var type:String ;
  
   //要布局的对象数据数组
   protected var layoutEls:Array;
  
   //布局中心点位置
   protected var centerPoint:Point;
  
   //分布开始角度 默认0度开始分布
   protected var startAngle:Number = 0 ;
  
   //每个元素之间的角度间隙
   //通过计算得到
   protected var disAngle:Number ; 
  
   public function layout():void{
    // implements by child class ;
   }
}
}

 package com.triman.layout
{
import com.triman.utils.Tools;

import flash.display.DisplayObject;
import flash.geom.Point;

//圆形布局
public class CircleLayOut extends LayOut
{
   //半径 因为X Y 方向半径都是一样的 
   //为了让这个变量可以让椭圆使用 所以使用 radiusX 好和 radiusY对应
   protected var radiusX:Number;
  
  
   public function CircleLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radius:Number)
   {
    this.centerPoint = centerPoint
    this.layoutEls   = groupEls;
    this.startAngle = startAngle;
    this.radiusX = radius;
   
   
   }
  
  
   override public function layout():void{
    var len:Number = this.layoutEls.length
    this.disAngle = 360 / len;
    for(var i:int=0;i<len;i++){
     var tempRaian:Number = Tools.angle2Radian(this.startAngle); 
     var node:DisplayObject = this.layoutEls[i] as DisplayObject;
     node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX;
     node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusX;
     //角度增加
     this.startAngle+=this.disAngle;
    }
   }
  
}
}

package com.triman.layout
{
import com.triman.utils.Tools;

import flash.display.DisplayObject;
import flash.geom.Point;

//椭圆布局 是圆形布局的一种特殊表现
//区别在于具有 x y 两个方向的半径
public class EllipseLayOut extends CircleLayOut
{
   //Y方向半径
   protected var radiusY:Number;
  
   public function EllipseLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radiusX:Number,radiusY:Number)
   {
    super(centerPoint,groupEls,startAngle,radiusX);
    this.radiusY = radiusY;
   
   
   
   }
  
   //布局算法 基本和圆形一样
   override public function layout():void{
    var len:Number = this.layoutEls.length;
    this.disAngle = 360/len;
    for(var i:int=0;i<len;i++){
     var tempRaian:Number = Tools.angle2Radian(this.startAngle); 
     var node:DisplayObject = this.layoutEls[i] as DisplayObject;
     node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX;
     node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusY;
     //角度增加
     this.startAngle+=this.disAngle;
    }
   }
  
}
}
 package com.triman.layout
{
import com.triman.utils.Tools;

import flash.display.DisplayObject;
import flash.geom.Point;

//扇形布局
public class CamberLayOut extends EllipseLayOut
{
   //分布范围 如果90那么就是指从startAngle 开始到angelRange 这样以一个范围
   protected var angelRange:Number;
  
   public function CamberLayOut(centerPoint:Point,groupEls:Array,startAngle:Number,radiusX:Number,radiusY:Number,angelRange:Number)
   {
    this.type = "CamberLayOut";
    super(centerPoint,groupEls,startAngle,radiusX,radiusY);
    this.angelRange = angelRange;
   }
  
   override public function layout():void{
    var len:Number = this.layoutEls.length;
    this.disAngle = this.angelRange / len;
    for(var i:int=0;i<len;i++){
     var tempRaian:Number = Tools.angle2Radian(this.startAngle); 
     var node:DisplayObject = this.layoutEls[i] as DisplayObject;
     node.x = this.centerPoint.x + Math.cos(tempRaian)*this.radiusX;
     node.y = this.centerPoint.y + Math.sin(tempRaian)*this.radiusY;
     //角度增加
     this.startAngle+=this.disAngle;
    }
   }
  
}
}

原创粉丝点击