<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="../coverage.css"/> <title> walkmap/vertex.clj </title> </head> <body> <span class="covered" title="1 out of 1 forms covered"> 001 (ns walkmap.vertex </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 002 "Essentially the specification for things we shall consider to be vertices. </span><br/> <span class="blank" title="0 out of 0 forms covered"> 003 </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 004 Note that there's no `distance` function here; to find the distance between </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 005 two vertices, create an edge from them and use `walkmap.edge/length`." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 006 (:require [clojure.math.numeric-tower :as m] </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 007 [clojure.string :as s] </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 008 [walkmap.geometry :refer [=ish]])) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 009 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 010 (defn vertex-key </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 011 "Making sure we get the same key everytime we key a vertex with the same </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 012 coordinates. `o` must have numeric values for `:x`, `:y`, and optionally </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 013 `:z`; it is an error and an exception will be thrown if `o` does not </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 014 conform to this specification. </span><br/> <span class="blank" title="0 out of 0 forms covered"> 015 </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 016 **Note:** these keys can be quite long. No apology is made: it is required </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 017 that the same key can *never* refer to two different locations in space." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 018 [o] </span><br/> <span class="covered" title="2 out of 2 forms covered"> 019 (keyword </span><br/> <span class="covered" title="4 out of 4 forms covered"> 020 (s/replace </span><br/> <span class="partial" title="2 out of 3 forms covered"> 021 (cond </span><br/> <span class="partial" title="15 out of 17 forms covered"> 022 (and (:x o) (:y o) (:z o)) </span><br/> <span class="covered" title="14 out of 14 forms covered"> 023 (str "vert_" (:x o) "_" (:y o) "_" (:z o)) </span><br/> <span class="partial" title="9 out of 10 forms covered"> 024 (and (:x o) (:y o)) </span><br/> <span class="covered" title="10 out of 10 forms covered"> 025 (str "vert_" (:x o) "_" (:y o)) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 026 :else </span><br/> <span class="not-covered" title="0 out of 2 forms covered"> 027 (throw (IllegalArgumentException. </span><br/> <span class="not-covered" title="0 out of 13 forms covered"> 028 (subs (str "Not a vertex: " (or o "nil")) 0 80)))) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 029 "." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 030 "-"))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 031 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 032 (defn vertex? </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 033 "True if `o` satisfies the conditions for a vertex. That is, essentially, </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 034 that it must rerpresent a two- or three- dimensional vector. A vertex is </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 035 shall be a map having at least the keys `:x` and `:y`, where the value of </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 036 those keys is a number. If the key `:z` is also present, its value must also </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 037 be a number. </span><br/> <span class="blank" title="0 out of 0 forms covered"> 038 </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 039 The name `vector?` was not used as that would clash with a function of that </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 040 name in `clojure.core` whose semantics are entirely different." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 041 [o] </span><br/> <span class="partial" title="23 out of 26 forms covered"> 042 (and </span><br/> <span class="covered" title="3 out of 3 forms covered"> 043 (map? o) </span><br/> <span class="covered" title="3 out of 3 forms covered"> 044 (:id o) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 045 (number? (:x o)) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 046 (number? (:y o)) </span><br/> <span class="covered" title="14 out of 14 forms covered"> 047 (or (nil? (:z o)) (number? (:z o))) </span><br/> <span class="covered" title="9 out of 9 forms covered"> 048 (or (nil? (:kind o)) (= (:kind o) :vertex)))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 049 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 050 (defn vertex= </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 051 "True if vertices `v1`, `v2` represent the same vertex." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 052 [v1 v2] </span><br/> <span class="covered" title="3 out of 3 forms covered"> 053 (every? </span><br/> <span class="covered" title="8 out of 8 forms covered"> 054 #(=ish (% v1) (% v2)) </span><br/> <span class="covered" title="4 out of 4 forms covered"> 055 [:x :y :z])) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 056 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 057 (defn vertex </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 058 "Make a vertex with this `x`, `y` and (if provided) `z` values. Returns a map </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 059 with those values, plus a unique `:id` value, and `:kind` set to `:vertex`. </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 060 It's not necessary to use this function to create a vertex, but the `:id` </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 061 must be present and must be unique." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 062 ([x y] </span><br/> <span class="covered" title="8 out of 8 forms covered"> 063 (let [v {:x x :y y :kind :vertex}] </span><br/> <span class="covered" title="7 out of 7 forms covered"> 064 (assoc v :id (vertex-key v)))) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 065 ([x y z] </span><br/> <span class="covered" title="9 out of 9 forms covered"> 066 (let [v (assoc (vertex x y) :z z)] </span><br/> <span class="covered" title="7 out of 7 forms covered"> 067 (assoc v :id (vertex-key v))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 068 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 069 (defn canonicalise </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 070 "If `o` is a map with numeric values for `:x`, `:y` and optionally `:z`, </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 071 upgrade it to something we will recognise as a vertex." </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 072 [o] </span><br/> <span class="covered" title="1 out of 1 forms covered"> 073 (if </span><br/> <span class="partial" title="13 out of 17 forms covered"> 074 (and </span><br/> <span class="covered" title="3 out of 3 forms covered"> 075 (map? o) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 076 (number? (:x o)) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 077 (number? (:y o)) </span><br/> <span class="covered" title="9 out of 9 forms covered"> 078 (or (nil? (:z o)) (number? (:z o)))) </span><br/> <span class="covered" title="9 out of 9 forms covered"> 079 (assoc o :kind :vertex :id (vertex-key o)) </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 080 (throw </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 081 (IllegalArgumentException. </span><br/> <span class="not-covered" title="0 out of 4 forms covered"> 082 (subs </span><br/> <span class="not-covered" title="0 out of 3 forms covered"> 083 (str "Not a proto-vertex: must have numeric `:x` and `:y`: " </span><br/> <span class="not-covered" title="0 out of 6 forms covered"> 084 (or o "nil")) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 085 0 80))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 086 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 087 (def ensure3d </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 088 "Given a vertex `o`, if `o` has a `:z` value, just return `o`; otherwise </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 089 return a vertex like `o` but having thie `dflt` value as the value of its </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 090 `:z` key, or zero as the value of its `:z` key if `dflt` is not specified. </span><br/> <span class="blank" title="0 out of 0 forms covered"> 091 </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 092 If `o` is not a vertex, throws an exception." </span><br/> <span class="covered" title="2 out of 2 forms covered"> 093 (memoize </span><br/> <span class="covered" title="1 out of 1 forms covered"> 094 (fn </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 095 ([o] </span><br/> <span class="covered" title="4 out of 4 forms covered"> 096 (ensure3d o 0.0)) </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 097 ([o dflt] </span><br/> <span class="covered" title="3 out of 3 forms covered"> 098 (cond </span><br/> <span class="partial" title="5 out of 6 forms covered"> 099 (not (vertex? o)) (throw </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 100 (IllegalArgumentException. </span><br/> <span class="not-covered" title="0 out of 13 forms covered"> 101 (subs (str "Not a vertex: " (or o "nil")) 0 80))) </span><br/> <span class="covered" title="4 out of 4 forms covered"> 102 (:z o) o </span><br/> <span class="covered" title="5 out of 5 forms covered"> 103 :else (assoc o :z dflt)))))) </span><br/> <span class="blank" title="0 out of 0 forms covered"> 104 </span><br/> <span class="covered" title="1 out of 1 forms covered"> 105 (def ensure2d </span><br/> <span class="not-tracked" title="0 out of 0 forms covered"> 106 "If `o` is a vertex, set its `:z` value to zero; else throw an exception." </span><br/> <span class="covered" title="2 out of 2 forms covered"> 107 (memoize </span><br/> <span class="covered" title="1 out of 1 forms covered"> 108 (fn [o] </span><br/> <span class="covered" title="1 out of 1 forms covered"> 109 (if </span><br/> <span class="covered" title="3 out of 3 forms covered"> 110 (vertex? o) </span><br/> <span class="covered" title="5 out of 5 forms covered"> 111 (assoc o :z 0.0) </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 112 (throw </span><br/> <span class="not-covered" title="0 out of 1 forms covered"> 113 (IllegalArgumentException. </span><br/> <span class="not-covered" title="0 out of 13 forms covered"> 114 (subs (str "Not a vertex: " (or o "nil")) 0 80))))))) </span><br/> </body> </html>