2010-10-17 50 views
1

如果给出一个阵列来创建一个n×n的贴图,那么是否有一种方法可以循环一个算法来突出显示形成菱形的贴图? (关键问题不是硬编码,因此它可以为任何规模的地图工作)JS:如何在算法上突出显示菱形选择的x/y坐标?

例如:如果地图为5x5的砖,像这样:

XXXXX 
XXXXX 
XXXXX 
XXXXX 
XXXXX 

怎么可能算法亮点菱形像这样:

XXOXX 
XOOOX 
OOOOO 
XOOOX 
XXOXX 
+0

您是否需要一种简单地生成nxn钻石数组的算法,标记,还是您正在用“高亮”步骤挣扎,对此您没有给出真实的描述? – 2010-10-17 05:33:05

回答

1

[Working example]

function diamond(arr) { 
    var len = arr.length; 
    var mid = Math.floor(len/2); 
    for (var i = 0; i < len; i++) { 
    var d = Math.abs(i - mid); 
    for (var j = d; j < len - d; j++) { 
     arr[i][j] = arr[i][j] = 1; 
    } 
    } 
    return arr; 
} 

请注意,您没有为偶数定义的预期行为

1
function diamond(arr) { 

var m = Math.floor(arr.length/2); // mid 
var i = 0; 
for (; i < arr.length/2; i ++) { 
    for (var j = 0; j <= i; j ++) { 
    for (var k = 0; k <= j; k ++) { 
     arr[i][m + k] = arr[i][m - k] = 1; 
    } 
    } 
} 

for (; i < arr.length; i ++) { 
    for (var j = arr.length - 1 - i; j >= 0; j --) { 
    for (var k = 0; k <= j; k ++) { 
     arr[i][m + k] = arr[i][m - k] = 1; 
    } 
    } 
} 

return arr; 

} 

> >实施例:(9×9阵列)

diamond((function(n) { var a = []; for (var i = 0; i < n; i ++) { a[i] = []; for (var j = 0; j < n; j ++) { a[i][j] = 0; } }; return a;})(9)).join('\n'); 

=>输出:

0,0,0,0,1,0,0,0,0 
0,0,0,1,1,1,0,0,0 
0,0,1,1,1,1,1,0,0 
0,1,1,1,1,1,1,1,0 
1,1,1,1,1,1,1,1,1 
0,1,1,1,1,1,1,1,0 
0,0,1,1,1,1,1,0,0 
0,0,0,1,1,1,0,0,0 
0,0,0,0,1,0,0,0,0 
3

我知道这是一个老话题,但我想我只是想出了最好的方法。

如果CX,CY是钻石的中心,并且r是 “半径”(不是直径)在循环使用此条件:

if (Math.abs(x-cX)+Math.abs(y-cY)<r) 
    arr[x][y] = 1;  

所以CX = 2,CY = 2,R = 3会画出

0,0,1,0,0 
0,1,1,1,0 
1,1,1,1,1 
0,1,1,1,0 
0,0,1,0,0 

现在您可以将cX和cY设置为您的鼠标位置并使用r增加/减小菱形大小。

+0

这正是我想要的,有没有办法在钻石的中间切一个洞?比如添加一个偏移参数? – 2013-03-19 07:47:06

+0

因为我没有得到回应,所以我想通了,并将代码放入JSFiddle。随意玩这里http://jsfiddle.net/truefreestyle/Suww8/ – 2013-04-03 23:36:51