外螺旋矩阵排列

外螺旋矩阵排列效果:

fla:
var max_x:Number=10;
var max_y:Number=10;
var a:loopMatrix=new loopMatrix(max_x,max_y);
for (var x_n:uint=0; x_n<max_x; x_n++) {
    
for (var y_n:uint=0; y_n<max_y; y_n++) {
        
var mask_mc:Mc=new Mc();
        addChild(mask_mc);
        mask_mc.x
=x_n*25;
        mask_mc.y
=y_n*20;
        mask_mc.id.text
=String(a.getDotCount(x_n,y_n));
    }
}
loopMatrix.as
/*
* 基本思路:采用数学方法直接计算出矩阵元素P(x,y)的值.
* 将整个矩阵看成由一个一个的矩形圈组成,矩阵中某一矩形圈上任意一点P(x,y)的值=
* 位于外圈的所有点数+本圈处于点p(x,y)前面的所有点数
* 使用说明:
* var max_x:Number=10;
* var max_y:Number=10;
* var LM:loopMatrix=new loopMatrix(max_x,max_y,false);
* for (var x_n:uint=0; x_n<max_x; x_n++) {
     for (var y_n:uint=0; y_n<max_y; y_n++) {
         var mask_mc:Mc=new Mc();
         addChild(mask_mc);
         mask_mc.x=x_n*25;
         mask_mc.y=y_n*20;
         mask_mc.id.text=String(LM.getDotCount(x_n,y_n));
     }
* }
*/
package {
    public class loopMatrix {
        private 
var _w:int;//最大列号
        private var _h:int;//最大行号
        private var in_out:Boolean;
        public 
function loopMatrix(max_w:int,max_h:int,inout:Boolean=true):void {
            
//行、列的序号从0开始计算;
            _w=max_w-1;
            _h
=max_h-1;
            in_out
=inout;

        }
        
//计算点p(x,y)的值
        public function getDotCount(x:int,y:int):int {
            
//序号从1开始排列
            //return getDotCount1(_w,_h,x,y)+getDotCount2(_w,_h,x,y)+1;

            
//序号从0开始排列,in_out区分由里到外,还是有外到里
            if (in_out) {
                
return getDotCount1(_w,_h,x,y)+getDotCount2(_w,_h,x,y);
            }
            
return (_w+1)*(_h+1)-(getDotCount1(_w,_h,x,y)+getDotCount2(_w,_h,x,y)+1);
        }
        
//计算点P(x,y)外围矩形圈数
        private function getN(_w:int,_h:int,x:int,y:int):int {
            
return Math.min(Math.min(x,y),Math.min(_w-x,_h-y));
        }
        
//计算点P(x,y)外围矩形圈上的点数 (等差数列,这个等差数列的公差为-8)
        private function getDotCount1(_w:int,_h:int,x:int,y:int):int {
            
var N:int=getN(_w,_h,x,y);//等差数列的项数
            var S1:int=2*(_w+_h);//等差数列的第一项,即最外围矩形上的点数
            var S2:int=2*(_w+_h)-8*N+8;//等差数列的第N项,即最后一圈矩形上的点数
            return (S1+S2)/2*N;//返回等差数列的和
        }

        
//计算与点P(x,y)处于同一个矩形圈上,且在点P前面的所有点数 (分段函数)
        private function getDotCount2(_w:int,_h:int,x:int,y:int):int {
            
//矩形圈从左上角开始,按照顺时针方向排列
            var N:int=getN(_w,_h,x,y);
            
var x1:int=x-N;//点P(x,y)在所处矩形圈中的列号:从0开始计算
            var y1:int=y-N;//点P(x,y)在所处矩形圈中的行号:从0开始计算
            var W:int=_w-2*N;//点P(x,y)所在矩形圈的最大列号:从0开始计算
            var H:int=_h-2*N;//点P(x,y)所在矩形圈的最大行号:从0开始计算
            try {
                
var count:int=0;

                
if (H==0) {//特例:点P(x,y)所在矩形圈只有一行
                    return x1;
                }
                
if (W==0) {//特例:点P(x,y)所在矩形圈只有一列
                    return y1;
                }
                
if (y1==0) {//一般情况:点P(x,y)在矩形圈的最上面一行
                    return count=x1;
                }
                
if (x1==W) {//一般情况: 点P(x,y)在矩形圈的最右边一列
                    return count=W+y1;
                }
                
if (y1==H) {//一般情况: 点P(x,y)在矩形圈的最下面一行
                    return count=W+H+(W-x1);
                }
                
if (x1==0) {//一般情况: 点P(x,y)在矩形圈的最左边一列
                    return count=2*(W+H)-y1;
                }
            } 
catch (error) {
                trace(
"错误");
            }
            
return count;

        }
    }
}

posted @ 2009-09-01 11:16  ddw1997  阅读(1022)  评论(0编辑  收藏  举报