From 5c9fb09e2bc790fdd7d5a9f90e59d03263909603 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 3 Sep 2014 00:08:45 -0700 Subject: [PATCH] scaling = faster. --- desktop/project.clj | 3 +- desktop/resources/pathfind-test-big.png | Bin 12427 -> 11155 bytes desktop/src-common/advent/core.clj | 2 +- desktop/src-common/advent/pathfind.clj | 96 ++++++++++++++---------- 4 files changed, 61 insertions(+), 40 deletions(-) diff --git a/desktop/project.clj b/desktop/project.clj index 2215da1e..13da26f0 100644 --- a/desktop/project.clj +++ b/desktop/project.clj @@ -12,7 +12,8 @@ [com.badlogicgames.gdx/gdx-platform "1.3.0" :classifier "natives-desktop"] [org.clojure/clojure "1.6.0"] - [play-clj "0.3.9"]] + [play-clj "0.3.9"] + [org.clojure/data.priority-map "0.0.5"]] :source-paths ["src" "src-common"] :javac-options ["-target" "1.6" "-source" "1.6" "-Xlint:-options"] diff --git a/desktop/resources/pathfind-test-big.png b/desktop/resources/pathfind-test-big.png index 38611a98b11072d9c5bc7a298aaf685a8173a179..eccd3afea600eb346d211d18d6b1db3afae7f84c 100644 GIT binary patch delta 10135 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 EFSWxkZ~y=R delta 11417 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 diff --git a/desktop/src-common/advent/core.clj b/desktop/src-common/advent/core.clj index 96d06c0e..ff438347 100644 --- a/desktop/src-common/advent/core.clj +++ b/desktop/src-common/advent/core.clj @@ -33,7 +33,7 @@ (defn left-click [screen entities] (let [{:keys [x y]} (input->screen screen {:x (:input-x screen) :y (:input-y screen)})] - (assoc-in entities [:ego :target-path] (take-nth 10 (advent.pathfind/visit-all + (assoc-in entities [:ego :target-path] (take-nth 2 (advent.pathfind/visit-all (:collision (:background entities)) [(int (:x (:ego entities))) (int (:y (:ego entities)))] [(int x) (int y)]))))) diff --git a/desktop/src-common/advent/pathfind.clj b/desktop/src-common/advent/pathfind.clj index c58ae5e9..17f051aa 100644 --- a/desktop/src-common/advent/pathfind.clj +++ b/desktop/src-common/advent/pathfind.clj @@ -3,7 +3,8 @@ [play-clj.ui :refer :all] [play-clj.utils :refer :all] [play-clj.g2d :refer :all] - [clojure.pprint]) + [clojure.pprint] + [clojure.data.priority-map :refer [priority-map]]) (:import [com.badlogic.gdx.files FileHandle] [com.badlogic.gdx Files] [com.badlogic.gdx.graphics Camera Color GL20 OrthographicCamera @@ -13,52 +14,66 @@ (defn printmap [my-map & [skip]] (let [skip (or skip 1)] (doseq [row (take-nth skip my-map)] - (println (take-nth skip (map {0 \space 1 "W" "X" "X" "." "."} row)))))) + (println (take-nth skip (map {1 \space 0 "W" "X" "X" "." "."} row)))))) (defn random-map [] (-> (vec (take (/ 240 2) (repeatedly (fn [] (vec (take (/ 320 2) (repeatedly (fn [] (rand-nth [0 0 1 ]))))))))) (update-in [1 1] (constantly 0)) (update-in [50 50] (constantly 0)))) -(defn neighbors [x y my-map] +(defn neighbors [[x y] my-map] (let [candidates [[(dec x) (dec y)] [x (dec y)] [(inc x) (dec y)] [(dec x) y] [(inc x) y] [(dec x) (inc y)] [x (inc y)] [(inc x) (inc y)]]] - (remove #(= 1 (get-in my-map (reverse %))) + (remove #(= 0 (get-in my-map (reverse %))) (filter (fn [[x y]] (and (< -1 x (count (first my-map))) (< -1 y (count my-map)))) candidates)))) (defn resolve [came-from play-loc target-loc] - (loop [path [] - current-node target-loc] - (if (or (= current-node play-loc) - (nil? current-node)) - (reverse (conj path current-node)) - (recur - (conj path current-node) - (came-from current-node))))) - -(defn visit-all [my-map play-loc target-loc ] - (if (= 1 (get-in my-map (reverse target-loc))) + (if (nil? (came-from target-loc)) nil - (loop [came-from {} - fronteir [play-loc]] - (let [[current-x current-y] (first fronteir)] - (if (or (empty? fronteir) - (= [current-x current-y] target-loc)) - (if (nil? (came-from target-loc)) - nil - (resolve came-from play-loc target-loc)) - (let [neighbors (neighbors current-x current-y my-map) - [came-from fronteir] (reduce (fn [[came-from fronteir] neighbor] - (if (came-from neighbor) - [came-from (vec fronteir)] - [(assoc came-from neighbor [current-x current-y]) - (vec (conj fronteir neighbor))])) - [came-from fronteir] - neighbors)] - (recur came-from (vec (rest fronteir))))))))) + (loop [path [] + current-node target-loc] + (if (or (= current-node play-loc) + (nil? current-node)) + (reverse (map (fn [[x y]] [(* x 2) (* y 2)]) (conj path current-node))) + (recur + (conj path current-node) + (came-from current-node)))))) + +(defn heuristic [[goal-x goal-y] [current-x current-y]] + (+ (Math/abs (- goal-x current-x )) + (Math/abs (- goal-y current-y)))) + +(defn ->scale [loc] + (vec (map (fn [x] (int (/ x 2))) loc))) +(defn visit-all [my-map play-loc target-loc] + (let [play-loc (->scale play-loc) + target-loc (->scale target-loc)] + (if (= 0 (get-in my-map (reverse target-loc))) + nil + (loop [cost-so-far {play-loc 0} + came-from {} + fronteir (priority-map play-loc 0)] + (let [current-loc (first (keys fronteir))] + (if (or (empty? fronteir) + (= current-loc target-loc)) + (resolve came-from play-loc target-loc) + (let [neighbors (neighbors current-loc my-map) + [cost-so-far came-from fronteir] (reduce (fn [[cost-so-far came-from fronteir] neighbor] + (let [new-cost (+ (cost-so-far current-loc) (get-in my-map (reverse neighbor)))] + (if (or (nil? (cost-so-far neighbor)) + (< new-cost (cost-so-far neighbor))) + [(assoc cost-so-far neighbor new-cost) + (assoc came-from neighbor current-loc) + (assoc fronteir neighbor (+ new-cost (heuristic target-loc neighbor)))] + [cost-so-far came-from fronteir] + ))) + [cost-so-far came-from fronteir] + neighbors)] + + (recur cost-so-far came-from (dissoc fronteir current-loc))))))))) (defn print-resolved [path my-map] @@ -69,12 +84,17 @@ my-map path)] - (println (map {0 \space 1 "W" "X" "X"} row))) + (println (map {1 \space 2 "." 0 "W" "X" "X"} row))) nil) (defn map-from-resource [filename] - (let [pm (pixmap filename)] - (vec (for [y (reverse (range (pixmap! pm :get-height)))] - (vec (for [x (range (pixmap! pm :get-width))] - (if (color! (color (pixmap! pm :get-pixel x y)) :equals (color 0 0 0 255)) - 1 0))))))) + (let [pm (pixmap filename) + black (color 0 0 0 255) + painful (color 255 0 0 255)] + (vec (take-nth 2 (for [y (reverse (range (pixmap! pm :get-height)))] + (vec (take-nth 2 (for [x (range (pixmap! pm :get-width)) + :let [current-color (color (pixmap! pm :get-pixel x y))]] + (cond + (color! current-color :equals black) 0 + (color! current-color :equals painful) 10 + :else 1)))))))))