JS: как алгоритмически выделить ромбовидную выборку координат x / y? - PullRequest
1 голос
/ 17 октября 2010

Если задан массив массивов, создающих карту плиток n x n, есть ли способ перебрать алгоритм, который выделит плитки, которые образуют ромбовидную форму? (ключевая проблема не в том, чтобы жестко закодировать его, чтобы он мог работать на карте любого размера)

Например: если на карте было 5x5 плиток, например:

XXXXX  
XXXXX  
XXXXX  
XXXXX  
XXXXX  

Как алгоритм может выделить форму ромба, например:

XXOXX  
XOOOX  
OOOOO  
XOOOX  
XXOXX  

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Я знаю, что это старая тема, но мне кажется, я только что нашел лучший метод.

Если 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.

1 голос
/ 17 октября 2010

[ Рабочий пример ]

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 голос
/ 17 октября 2010
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;

}

>> Пример: (массив 9x9)

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
...