如果給出一個陣列來創建一個n×n的貼圖,那麼是否有一種方法可以循環一個算法來突出顯示形成菱形的貼圖? (關鍵問題不是硬編碼,因此它可以爲任何規模的地圖工作)JS:如何在算法上突出顯示菱形選擇的x/y座標?
例如:如果地圖爲5x5的磚,像這樣:
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
怎麼可能算法亮點菱形像這樣:
XXOXX
XOOOX
OOOOO
XOOOX
XXOXX
如果給出一個陣列來創建一個n×n的貼圖,那麼是否有一種方法可以循環一個算法來突出顯示形成菱形的貼圖? (關鍵問題不是硬編碼,因此它可以爲任何規模的地圖工作)JS:如何在算法上突出顯示菱形選擇的x/y座標?
例如:如果地圖爲5x5的磚,像這樣:
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
怎麼可能算法亮點菱形像這樣:
XXOXX
XOOOX
OOOOO
XOOOX
XXOXX
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;
}
請注意,您沒有爲偶數定義的預期行爲
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
我知道這是一個老話題,但我想我只是想出了最好的方法。
如果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增加/減小菱形大小。
這正是我想要的,有沒有辦法在鑽石的中間切一個洞?比如添加一個偏移參數? – 2013-03-19 07:47:06
因爲我沒有得到迴應,所以我想通了,並將代碼放入JSFiddle。隨意玩這裏http://jsfiddle.net/truefreestyle/Suww8/ – 2013-04-03 23:36:51
您是否需要一種簡單地生成nxn鑽石數組的算法,標記,還是您正在用「高亮」步驟掙扎,對此您沒有給出真實的描述? – 2010-10-17 05:33:05