Line intersection looking good.
This commit is contained in:
parent
79174af2c1
commit
1ab35dbe7d
29 changed files with 1725 additions and 853 deletions
|
|
@ -1,5 +1,6 @@
|
|||
(ns walkmap.edge-test
|
||||
(:require [clojure.test :refer :all]
|
||||
(:require [clojure.math.numeric-tower :as m]
|
||||
[clojure.test :refer :all]
|
||||
[walkmap.edge :refer :all]
|
||||
[walkmap.vertex :refer [vertex]]))
|
||||
|
||||
|
|
@ -19,6 +20,32 @@
|
|||
:end {:x 3 :y 4 :z 0.0 :id 'bar}})) "Value of x in start is not a number")
|
||||
(is (false? (edge? "I am not an edge")) "Edge mustbe a map.")))
|
||||
|
||||
(deftest collinear-test
|
||||
(testing "collinearity"
|
||||
(is (collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3.0 :y 4.0 :z 0.0 :id 'bar}}
|
||||
{:start {:x 3.0 :y 4.0 :z 0.0 :id 'foo} :end {:x 9.0 :y 12.0 :z 0.0 :id 'bar}})
|
||||
"Should be")
|
||||
(is (not
|
||||
(collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3 :y 4 :z 0.0 :id 'bar}}
|
||||
{:start {:x 1.0 :y 2.0 :z 3.5 :id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :id 'bar}}))
|
||||
"Should not be!")
|
||||
(is (collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3.0 :y 4.0 :z 0.0 :id 'bar}}
|
||||
{:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 9.0 :y 12.0 :z 0.0 :id 'bar}})
|
||||
"Edge case: same start location")
|
||||
(is (collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 9.0 :y 12.0 :z 0.0 :id 'bar}}
|
||||
{:start {:x 3.0 :y 4.0 :z 0.0 :id 'foo} :end {:x 9.0 :y 12.0 :z 0.0 :id 'bar}})
|
||||
"Edge case: same end location")
|
||||
))
|
||||
|
||||
(deftest collinear2d-test
|
||||
(testing "Collinearity when projected onto the x,y plane."
|
||||
(is (collinear2d? (edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
(edge (vertex 4.0 4.0) (vertex 6.0 6.0)))
|
||||
"Collinear, overlapping.")
|
||||
(is (collinear2d? (edge (vertex 1.0 1.0 0.0) (vertex 5.0 5.0 5.0))
|
||||
(edge (vertex 4.0 4.0 79.3) (vertex 6.0 6.0 0.2)))
|
||||
"Separated in the z axis, but collinear in x, y.")))
|
||||
|
||||
(deftest construction-test
|
||||
(testing "Construction of edges."
|
||||
(is (edge? (edge (vertex 1.0 2.0 3.0) (vertex 4.0 8.0 12.0)))
|
||||
|
|
@ -28,18 +55,46 @@
|
|||
(is (thrown? IllegalArgumentException (edge (vertex 1 2) "Not a vertex"))
|
||||
"If second argument is not a vertex, we should get an exception.")))
|
||||
|
||||
(deftest intersection2d-test
|
||||
(testing "intersection of two edges projected onto the x,y plane."
|
||||
(is (thrown? IllegalArgumentException
|
||||
(intersection2d
|
||||
(edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
"This is not an edge"))
|
||||
"Not an edge (second arg) -> exception.")
|
||||
(is (thrown? IllegalArgumentException
|
||||
(intersection2d
|
||||
"This is not an edge"
|
||||
(edge (vertex 1.0 1.0) (vertex 5.0 5.0))))
|
||||
"Not an edge (first arg) -> exception.")
|
||||
(is (nil? (intersection2d (edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
(edge (vertex 1.0 2.0) (vertex 5.0 6.0))))
|
||||
"Parallel but not intersecting.")
|
||||
(is (:x (intersection2d (edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
(edge (vertex 4.0 4.0) (vertex 6.0 6.0)))
|
||||
5.0)
|
||||
"Collinear, overlapping, should choose the overlapping end of the first edge.")
|
||||
(is (= (:x (intersection2d (edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
(edge (vertex 1.0 5.0) (vertex 5.0 1.0))))
|
||||
3.0)
|
||||
"Crossing, should intersect at 3.0, 3.0: x coord.")
|
||||
(is (= (:y (intersection2d (edge (vertex 1.0 1.0) (vertex 5.0 5.0))
|
||||
(edge (vertex 1.0 5.0) (vertex 5.0 1.0))))
|
||||
3.0)
|
||||
"Crossing, should intersect at 3.0, 3.0: y coord.")
|
||||
(is (= (:y (intersection2d (edge (vertex 1.0 1.0 0.0) (vertex 5.0 5.0 0.0))
|
||||
(edge (vertex 1.0 5.0 999) (vertex 5.0 1.0 379))))
|
||||
3.0)
|
||||
"Crossing, presence of z coordinate should make no difference")))
|
||||
|
||||
(deftest length-test
|
||||
(testing "length of an edge"
|
||||
(is (= (length {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3.0 :y 4.0 :z 0.0 :id 'bar}}) 5.0))))
|
||||
|
||||
(deftest unit-vector-test
|
||||
(testing "deriving the unit vector"
|
||||
(is (=
|
||||
(unit-vector {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3 :y 4 :z 0.0 :id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))
|
||||
(is (=
|
||||
(unit-vector {:start {:x 1.0 :y 2.0 :z 3.5 :id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))))
|
||||
(deftest minimad-test
|
||||
(testing "finding minimum and maximum coordinates of edges."
|
||||
(is (= (minimaxd (edge (vertex 1.0 2.0 3.0) (vertex 4.0 8.0 12.0)) :x min) 1.0))
|
||||
(is (= (minimaxd (edge (vertex 1.0 2.0 3.0) (vertex 4.0 8.0 12.0)) :y max) 8.0))))
|
||||
|
||||
(deftest parallel-test
|
||||
(testing "parallelism"
|
||||
|
|
@ -51,12 +106,16 @@
|
|||
{:start {:x 1.0 :y 2.0 :z 3.5 :id 'foo} :end {:x 4.0 :y 6.0 :z 3.49 :id 'bar}}))
|
||||
"Should not be!")))
|
||||
|
||||
(deftest collinear-test
|
||||
(testing "collinearity"
|
||||
(is (collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3.0 :y 4.0 :z 0.0 :id 'bar}}
|
||||
{:start {:x 3.0 :y 4.0 :z 0.0 :id 'foo} :end {:x 9.0 :y 12.0 :z 0.0 :id 'bar}})
|
||||
"Should be")
|
||||
(is (not
|
||||
(collinear? {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3 :y 4 :z 0.0 :id 'bar}}
|
||||
{:start {:x 1.0 :y 2.0 :z 3.5 :id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :id 'bar}}))
|
||||
"Should not be!")))
|
||||
(deftest overlaps2d-test
|
||||
(testing "whether two edges are in the same area of the x,y plane."
|
||||
(is (false? (overlaps2d? (edge (vertex 1 1) (vertex 4 4)) (edge (vertex 5 5) (vertex 8 8)))))
|
||||
(is (overlaps2d? (edge (vertex 1 1) (vertex 4 4)) (edge (vertex 4 4) (vertex 1 1))))))
|
||||
|
||||
(deftest unit-vector-test
|
||||
(testing "deriving the unit vector"
|
||||
(is (=
|
||||
(unit-vector {:start {:x 0.0 :y 0.0 :z 0.0 :id 'foo} :end {:x 3 :y 4 :z 0.0 :id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))
|
||||
(is (=
|
||||
(unit-vector {:start {:x 1.0 :y 2.0 :z 3.5 :id 'foo} :end {:x 4.0 :y 6.0 :z 3.5 :id 'bar}})
|
||||
{:x 0.6, :y 0.8, :z 0.0}))))
|
||||
|
|
|
|||
14
test/walkmap/geometry_test.clj
Normal file
14
test/walkmap/geometry_test.clj
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
(ns walkmap.geometry-test
|
||||
(:require [clojure.test :refer :all]
|
||||
[walkmap.geometry :refer :all]))
|
||||
|
||||
(deftest =ish-tests
|
||||
(testing "Rough equality"
|
||||
(is (=ish 5.00000001 5.00000002) "Close enough.")
|
||||
(is (=ish 5 5) "Perfect.")
|
||||
(is (not (=ish 5.01 5.02)) "Not close enough.")
|
||||
(is (=ish 22/7 3.142857) "We hope so!")
|
||||
(is (=ish 0 0.0) "Tricky conrer case!")
|
||||
(is (=ish :foo :foo) "Fails over to plain old equals for non-numbers.")
|
||||
(is (=ish 6 5 10000) "If tolerance is wide enough, anything can be equal.")
|
||||
(is (=ish "hello" "goodbye" 10000) "Well, except non-numbers, of course.")))
|
||||
Loading…
Add table
Add a link
Reference in a new issue