Skip to content

Instantly share code, notes, and snippets.

@saikyun
Created April 7, 2022 07:45
Show Gist options
  • Save saikyun/a21986630ba573eb9566e7ee4a6f9969 to your computer and use it in GitHub Desktop.
Save saikyun/a21986630ba573eb9566e7ee4a6f9969 to your computer and use it in GitHub Desktop.
Sector overlap / collision in freja with visualization.
(use freja/flow)
(defn tau->deg
[t]
(math/round (* 180 t)))
(defn rad->tau
[r]
(/ r math/pi))
(defn normalize
[t]
(mod t 2))
(defn between
[start stop v]
(and (>= v start)
(< v stop)))
(defn angle-diff
``
Returns shortest angle between angles a1 and a2.
Is negative if a2 is counter-clockwise of a1.
``
[a1 a2]
(let [v (- a1 a2)]
(cond
(> v 1)
(- v 2)
(< v -1)
(+ v 2)
v)))
(defn overlap
``
Takes two sectors with angles start and stop.
Returns true if they overlap, otherwise false.
``
[[start1 stop1] [start2 stop2]]
(comptime
(defn radius [start stop]
(* 0.5 (math/abs (- stop start)))))
(comptime
(defn middle-angle [start stop radius]
(+ (normalize (min start stop)) radius)))
(let [r1 (radius start1 stop1)
a1 (middle-angle start1 stop1 r1)
r2 (radius start2 stop2)
a2 (middle-angle start2 stop2 r2)
ad (math/abs (angle-diff a1 a2))]
(<= ad (+ r1 r2))))
(var mp [0 0])
(var start 2.5)
(var stop 1)
(defn render
[{:width rw :height rh}]
(clear-background :white)
(let [seg1 [start stop]
rel-mouse-pos (-> mp
(v/v- (v/v* [rw rh] 0.5)))
start-pos (+ (rad->tau
(math/atan2 (- (rel-mouse-pos 1))
(rel-mouse-pos 0)))
0.5)
seg2 [start-pos
(+ start-pos
0.3)]]
(draw-text "Mouse to move purple sector." [10 10])
(draw-text "(Left Control +) Scroll: Change red sector." [10 35])
(draw-text (string "Overlaps: " (overlap seg1 seg2)) [10 60])
(rl-translatef (* 0.5 rw) (* 0.5 rh) 0)
(draw-circle 0 0 200 :blue)
(draw-circle-sector [0 0] 175 ;(map tau->deg seg1) 10 :red)
(draw-circle-sector [0 0] 150 ;(map tau->deg seg2) 10 :purple)))
(defn on-event
[_ ev]
(match ev
{:mouse/scroll v}
(if (key-down? :left-control)
(+= stop (* 0.01 v))
(+= start (* 0.01 v)))
{:mouse/pos p}
(set mp p)))
(start-game {:render render
:on-event on-event})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment