-
Notifications
You must be signed in to change notification settings - Fork 1
/
math.lisp
29 lines (26 loc) · 953 Bytes
/
math.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
(cl:in-package :notalone)
;; https://codereview.stackexchange.com/a/86428
(defun intersect-p (segment-start segment-end circle-center circle-radius)
(let* ((p1 segment-start)
(p2 segment-end)
(q circle-center)
(r circle-radius)
(v (subt p2 p1))
(a (ge.ng:dot v v))
(b (* 2 (ge.ng:dot v (subt p1 q))))
(c (+ (ge.ng:dot p1 p1) (ge.ng:dot q q)
(- (* 2 (ge.ng:dot p1 q)))
(- (expt r 2))))
(disc (- (expt b 2) (* 4 a c))))
(if (< disc 0)
nil
(let* ((sqrt-disc (sqrt disc))
(t1 (/ (+ (- b) sqrt-disc)
(* 2 a)))
(t2 (/ (- (- b) sqrt-disc)
(* 2 a))))
(or (<= 0 t1 1)
(<= 0 t2 1))))))
(defun rotate-vec (vec angle)
(vec2 (- (* (x vec) (cos angle)) (* (y vec) (sin angle)))
(+ (* (x vec) (sin angle)) (* (y vec) (cos angle)))))