前のステップに基づいて、各ステップでマップを更新しようとしています。数値のベクトルのベクトルである参照があり、世界地図をぼかすために、左、右、上、下に回転させてから、4 つの新しい世界地図を平均します。この更新は、メイン ループの「変更」として行います。最初は速いですが、どんどん遅くなります。知らないうちに頭を手放していませんか?各ステップで以前のすべての計算を行っているようです。これが私のコードです:
マップを定義します。
(def gradient-map
(ref( vec (repeat columns (vec (repeat rows 0))))))
これが私の更新機能です:
(defn rotate-grid-up [grid]
(map #(concat (rest %) [(last %)]) grid))
(defn rotate-grid-down [grid]
(map #(concat [(first %)] (drop-last %)) grid))
(defn rotate-grid-right [grid]
(concat [(first grid)] (drop-last grid)))
(defn rotate-grid-left [grid]
(concat (rest grid) [(last grid)]))
(defn blur [grid]
(let [g1 (rotate-grid-up grid)
g2 (rotate-grid-down grid)
g3 (rotate-grid-left grid)
g4 (rotate-grid-right grid)]
(vec (map
(fn [r1 r2 r3 r4 r5]
(vec (map
#(/ (+ %1 %2 %3 %4 %5) 5)
r1 r2 r3 r4 r5)))
g1 g2 g3 g4 grid))))
次に、描画ループで各ティックをぼかします
(dosync (alter gradient-map blur))
描画ループはクロールに遅くなります。