您的位置:首页 > 其它

外螺旋矩阵排列

2009-09-01 11:16 260 查看
外螺旋矩阵排列效果:

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;

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: