255 lines
15 KiB
HTML
255 lines
15 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> walkmap/edge.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns walkmap.edge
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 "Essentially the specification for things we shall consider to be an edge.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 An edge is a line segment having just a start and an end, with no intervening
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 nodes."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 (:require [clojure.math.numeric-tower :as m]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 [walkmap.path :refer [path? polygon->path]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 [walkmap.polygon :refer [polygon?]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 [walkmap.vertex :refer [ensure3d vertex?]]))
|
|
</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 edge?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 "True if `o` satisfies the conditions for a path. A path shall be a map
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 having the keys `:start` and `:end`, such that the values of each of those
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 keys shall be a vertex."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 [o]
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 9 forms covered">
|
|
015 (and
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
016 (map? o)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
017 (vertex? (:start o))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
018 (vertex? (:end o))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
019
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
020 (defn path->edges
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 "if `o` is a path, a polygon, or a sequence of vertices, return a sequence of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 edges representing that path, polygon or sequence."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 [o]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
024 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
025 (seq? o)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
026 (when
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
027 (and
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
028 (vertex? (first o))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
029 (vertex? (first (rest o))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
030 (cons
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
031 {:start (first o)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
032 :end (first (rest o))}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
033 (path->edges (rest o))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
034 (path? o)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
035 (path->edges (:nodes o))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
036 (polygon? o)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
037 (path->edges (polygon->path o))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
038
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
039 (defn length
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 "Return the length of the edge `e`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 [e]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
042 (let [start (ensure3d (:start e))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
043 end (ensure3d (:end e))]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
044 (m/sqrt
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
045 (reduce
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
046 +
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
047 (map
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
048 #(m/expt (- (% end) (% start)) 2)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
049 [:x :y :z])))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
050
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
051 (defn unit-vector
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 "Return an vertex parallel to `e` starting from the coordinate origin. Two
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 edges which are parallel will have the same unit vector."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 [e]
|
|
</span><br/>
|
|
<span class="covered" title="14 out of 14 forms covered">
|
|
055 (let [e' {:start (ensure3d (:start e)) :end (ensure3d (:end e))}
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
056 l (length e')]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
057 (reduce
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
058 merge
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
059 {}
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
060 (map
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
061 (fn [k]
|
|
</span><br/>
|
|
<span class="covered" title="17 out of 17 forms covered">
|
|
062 {k (/ (- (k (:end e')) (k (:start e'))) l)})
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
063 [:x :y :z]))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
064
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
065 (defn parallel?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 "True if all `edges` passed are parallel with one another."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 ;; TODO: this bears being wary about, dealing with floating point arithmetic.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
068 ;; Keep an eye out for spurious errors.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 [& edges]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
070 (let [uvs (map unit-vector edges)]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
071 (every?
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
072 #(= % (first uvs))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
073 (rest uvs))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
074
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
075 (defn collinear?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
076 "True if edges `e1` and `e2` are collinear with one another."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
077 [e1 e2]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
078 (parallel?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
079 e1
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
080 e2
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
081 {:start (:start e1) :end (:start e2)}))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
082
|
|
</span><br/>
|
|
</body>
|
|
</html>
|