adjust angle->proper-range based on Neil's advice

This commit is contained in:
Robby Findler 2014-05-13 15:20:37 -05:00
parent 1b5dbcbca8
commit 0358d7079b
2 changed files with 18 additions and 13 deletions

View File

@ -705,6 +705,7 @@
(max ay by cy dy))))
(define (rotate-points in-points θ)
(printf "θ ~s\n" θ)
(let* ([cs (map point->c in-points)]
[vectors (points->vectors cs)]
[rotated-vectors (map (λ (c) (rotate-c c θ)) vectors)]

View File

@ -16,6 +16,7 @@
(require htdp/error
racket/class
racket/contract
lang/posn
(except-in racket/draw
make-pen make-color)
@ -347,24 +348,27 @@
(not (or (= arg +inf.0)
(= arg -inf.0)
(equal? arg +nan.0)))))
(define (angle->proper-range α)
(define eα (inexact->exact α))
(define rα (round eα))
(define whole-part (modulo rα 360))
(define decimal-part (- eα rα))
(if (and (zero? whole-part)
(negative? decimal-part))
(+ 360 decimal-part)
(+ whole-part decimal-part)))
(define/contract (angle->proper-range α)
(-> real? (between/c 0 360))
(let loop ([θ (- α (* 360 (floor (/ α 360))))])
(cond [(negative? θ) (+ θ 360)]
[(>= θ 360) (- θ 360)]
[else θ])))
(module+ test
(require rackunit)
(check-equal? (angle->proper-range 1) 1)
(check-equal? (angle->proper-range 361) 1)
(check-equal? (angle->proper-range 0.5) 0.5)
(check-equal? (angle->proper-range 1/2) 1/2)
(check-equal? (angle->proper-range -1) 359)
(check-equal? (angle->proper-range #e-1.5) #e358.5)
(check-equal? (angle->proper-range #e-.1) #e359.9)
(check-equal? (angle->proper-range 1.0) 1.0)
(check-equal? (angle->proper-range 361.0) 1.0)
(check-equal? (angle->proper-range 0.5) 0.5)
(check-equal? (angle->proper-range -1.0) 359.0)
(check-equal? (angle->proper-range -1.5) 358.5)
(check-equal? (angle->proper-range -.1) 359.9)
(check-equal? (angle->proper-range #i-7.347880794884119e-016)
(+ 360 #i-7.347880794884119e-016)))
(check-equal? (angle->proper-range #i-7.347880794884119e-016) 0.0))