Во-первых, извините за название, я не знаю, описывает ли оно то, чего я пытаюсь достичь, но это лучшее, что у меня есть.
В основном у меня есть массив, описывающий интенсивность в 2D-пространстве. Затем я хочу распределить эту интенсивность среди соседей по заданному набору итераций, т.е. Допустим, у меня есть следующий массив:
intensity = [ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 100, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0 ]
Затем я делаю один проход по моему алгоритму распределенияIntensity (распределяя 50% интенсивности соседям). Я бы тогда:
[ 0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 50, 50, 50, 0,
0, 50, 100, 50, 0,
0, 50, 50, 50, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0 ]
Если я сделаю 2 прохода по исходному массиву, мой результирующий массив будет:
[ 0, 0, 0, 0, 0,
25, 50, 75, 50, 25,
50, 150, 200, 150, 50,
75, 200, 300, 200, 75,
50, 150, 200, 150, 50,
25, 50, 75, 50, 25,
0, 0, 0, 0, 0 ]
Мой текущий код:
this.distributeIntensities = function(passes, shareRatio) {
for (var i = 0; i < passes; i++) { this.distributeIntensity(shareRatio); }
}
this.distributeIntensity = function(shareRatio) {
var tmp = hm.intensity.slice(0); // copy array
for (var i = 0; i < tmp.length; i++) {
if (hm.intensity[i] <= 0) { continue; }
var current = hm.intensity[i];
var shareAmount = current * shareRatio;
this.shareIntensityWithNeighbours(tmp, shareAmount, i);
}
hm.intensity = tmp;
}
this.shareIntensityWithNeighbours = function(arr, heat, i) {
// This should be var x = Math.floor(...) however
// this is slower and without gives satisfactory results
var x = i % hm.columnCount;
var y = i / hm.columnCount;
if (x > 0) {
if (y > 0) arr[i - hm.columnCount - 1] += heat;
arr[i - 1] += heat;
if (y < (hm.rowCount - 1)) arr[i + hm.columnCount - 1] += heat;
}
if (y > 0) arr[i - hm.columnCount] += heat;
if (y < (hm.rowCount - 1)) arr[i + hm.columnCount] += heat;
if (x < (hm.columnCount - 1)) {
if (y > 0) arr[i - hm.columnCount + 1] += heat;
arr[i + 1] += heat;
if (y < (hm.rowCount - 1)) arr[i + hm.columnCount + 1] += heat;
}
}
Теперь это работает, но очень медленно (я работаю с огромным массивом и 8 проходами). Я знаю, что есть более быстрый/лучший/чистый способ сделать это, но это выходит за рамки моих возможностей, поэтому я разместил его там в надежде, что кто-то может указать мне правильное направление (Примечание: я не говорю бегло по математике, на самом деле Я довольно математически неграмотен).
заранее спасибо
Гвидо