Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defn quad-tree
- ([c l] {:mid c :len l})
- ([c l v] (assoc (quad-tree c l) :value v)))
- (defn next-mid
- [qt quad]
- (let [[x y] (:mid qt)
- d (/ (:len qt) 2)]
- (case quad
- :I [(+ x d) (+ y d)]
- :II [(- x d) (+ y d)]
- :III [(- x d) (- y d)]
- :IV [(+ x d) (- y d)]
- :else (println "Invalid quadrant"))))
- (defn next-quad [[x y] [px py]]
- (cond
- (and (> px x) (> py y)) :I
- (and (< px x) (> py y)) :II
- (and (< px x) (< py y)) :III
- (and (> px x) (< py y)) :IV))
- (declare add-points)
- (defn add-point
- [qt point]
- (let [[x y] (:mid qt)
- [px py] point
- quad (next-quad [x y] point)
- val (:value qt)
- loc (quad qt)]
- (cond
- val (-> qt (dissoc :value) (add-points [val point]))
- loc (assoc qt quad (add-point loc point))
- :else (assoc qt quad (quad-tree (next-mid qt quad) (/ (:len qt) 2) point)))))
- (defn add-points
- [qt pts] (reduce add-point qt pts))
Advertisement
Add Comment
Please, Sign In to add comment