最初にタイトルについてお詫び申し上げます。それが私が達成しようとしていることを説明しているかどうかはわかりませんが、それは私が持っている最高のものです。
基本的に、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 ]
次に、distributeIntensity アルゴリズムを 1 回実行します (強度の 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 つのパスで作業しています)。これを行うためのより速く/より良い/よりクリーンな方法があることは知っていますが、それは私の能力を超えているので、誰かが私を正しい方向に向けることができることを期待してそこに置きました(注: 私は流暢な数学を話せません。実際には私はかなり数学的に文盲です)。
前もって感謝します
グイド