Hello.

I've tried to translate nice Hilbert-curve-index calculating function
to clojure (http://blog.notdot.net/2009/11/Damn-Cool-Algorithms-
Spatial-indexing-with-Quadtrees-and-Hilbert-Curves).

I've got sth like that:

(def hilbert-map {
  :a {[0 0] [0 :d], [0 1] [1 :a], [1 0] [3 :b], [1 1] [2 :a]}
  :b {[0 0] [2 :b], [0 1] [1 :b], [1 0] [3 :a], [1 1] [0 :c]}
  :c {[0 0] [2 :c], [0 1] [3 :d], [1 0] [1 :c], [1 1] [0 :b]}
  :d {[0 0] [0 :a], [0 1] [3 :c], [1 0] [1 :d], [1 1] [2 :d]} } )

(defn point-to-hilbert
  "Return index of point (x,y) on Hilbert curve defined on square
(2^order)*(2^order).
    x,y should be in 0 .. (2^order)-1
    result will be in 0 .. (2^(order*2))-1"
  [x y order]
  (let [step-inside (fn [x i] (if (== 0 (bit-and x (bit-shift-left 1
i))) 0 1))
         step (fn [square i] ((hilbert-map square) [(step-inside x i)
(step-inside y i)]))]
    (loop [ square :a, position 0, i (dec order)]
      (if (< i (int 0))
        position
        (let [ v (step square i)]
          (recur (v 1), (-> position (bit-shift-left 2) (bit-or (v
0))), (dec i)))))))

(time (dotimes [ _ (int 1000)] (point-to-hilbert (rand-int (int
-1000)) (int 1) (int 16))))


I would like to somehow hide the global hilbert-map into my function,
but I can't see how to do that.

Is this possible? I know that I can just inert literal into my let,
but that degrades performance, when function is called many times.

I would like to have something like static local variable in C++, or
just regular constant local variable in my function.

Besides, if you see a way to improve my code, please, tell how.

Greetings.

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to