-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenws-dirs.scm
48 lines (42 loc) · 1.36 KB
/
enws-dirs.scm
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
; enws-dirs.scm
; Pyöristää astesuunnan lähimmäksi ilmansuunnaksi
; (tai sen vastasuunnaksi, mikäli 2. argumentti = 'behind)
(define (nearest-enws-dir dir ahead/behind?)
(let ((the-dir (mod (if (eq? ahead/behind? 'ahead)
dir
(+ dir pi))
2pi)))
(cond ((or (< the-dir (* 0.25 pi))
(> the-dir (* 1.75 pi)))
'e)
((< the-dir (* 0.75 pi))
'n)
((< the-dir (* 1.25 pi))
'w)
(else 's))))
(define (turn-left enws-dir)
(cond ((eq? enws-dir 'e) 'n)
((eq? enws-dir 'n) 'w)
((eq? enws-dir 'w) 's)
(else 'e)))
(define (turn-right enws-dir)
(cond ((eq? enws-dir 'e) 's)
((eq? enws-dir 'n) 'e)
((eq? enws-dir 'w) 'n)
(else 'w)))
(define (turn-back enws-dir)
(cond ((eq? enws-dir 'e) 'w)
((eq? enws-dir 'n) 's)
((eq? enws-dir 'w) 'e)
(else 'n)))
; Siirtyy loc-x.y -paikasta yhden askeleen annettuun
; ilmansuuntaan ja palauttaa uuden sijainnin x.y -parina
(define (one-step-to-enws-dir loc-x.y enws-dir)
(cons (+ (car loc-x.y)
(cond ((eq? enws-dir 'w) -1)
((eq? enws-dir 'e) 1)
(else 0)))
(+ (cdr loc-x.y)
(cond ((eq? enws-dir 's) -1)
((eq? enws-dir 'n) 1)
(else 0)))))