Created
April 7, 2022 07:45
-
-
Save saikyun/a21986630ba573eb9566e7ee4a6f9969 to your computer and use it in GitHub Desktop.
Sector overlap / collision in freja with visualization.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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