Reviewers: ,
Message:
please review
Description:
modify coord-rotate to get exact values for (sin PI) etc
issue 4640
Done by switching to appropiate values for the angle and/or switching
sin to cos and vice versa
Please review this at https://codereview.appspot.com/269530043/
Affected files (+41, -5 lines):
M scm/lily-library.scm
Index: scm/lily-library.scm
diff --git a/scm/lily-library.scm b/scm/lily-library.scm
index
0bfce9eb0c8a748099b3af053cf29d822de8a4b6..27be8220300eb3b5a8cc5f5eccdf55a2d610a960
100644
--- a/scm/lily-library.scm
+++ b/scm/lily-library.scm
@@ -707,11 +707,29 @@ right (@var{dir}=+1)."
(define-public (coord-scale coordinate amount)
(coord-operation * amount coordinate))
-(define-public (coord-rotate coordinate angle)
- (let ((c (cos angle))
- (s (sin angle))
- (x (coord-x coordinate))
- (y (coord-y coordinate)))
+(define-public (coord-rotate coordinate angle-in-radians)
+ ;; getting around (sin PI) not being exactly zero by switching to cos at
+ ;; appropiate angles and/or taking the negative value (vice versa for
cos)
+ (let* ((angle (angle-0-2pi angle-in-radians))
+ (octant (get-octants angle))
+ ;; get the PI/4 rotated quadrants
+ (quadrant
+ (cond ((= octant 7) 0)
+ ((even? octant) (/ octant 2))
+ (else (/ (1+ octant) 2))))
+ (moved-angle (- angle (/ (* quadrant PI) 2)))
+ (cm (cos moved-angle))
+ (sm (sin moved-angle))
+ (c (cond ((= 1 quadrant) (- sm))
+ ((= 2 quadrant) (- cm))
+ ((= 3 quadrant) sm)
+ (else cm)))
+ (s (cond ((= 1 quadrant) cm)
+ ((= 2 quadrant) (- sm))
+ ((= 3 quadrant) (- cm))
+ (else sm)))
+ (x (coord-x coordinate))
+ (y (coord-y coordinate)))
(cons (- (* c x) (* s y))
(+ (* s x) (* c y)))))
@@ -768,6 +786,24 @@ as rectangular coordinates @ode{(x-length .
y-length)}."
(real-part complex)
(imag-part complex))))
+(define (get-octants radians)
+ "Return octant of @var{radians}"
+ ;; 0PI/4 >= radians > 1PI/4 ->0
+ ;; 1PI/4 >= radians > 2PI/4 ->1
+ ;; 2PI/4 >= radians > 3PI/4 ->2
+ ;; 3PI/4 >= radians > 4PI/4 ->3
+ ;; 4PI/4 >= radians > 5PI/4 ->4
+ ;; 5PI/4 >= radians > 6PI/4 ->5
+ ;; 6PI/4 >= radians > 7PI/4 ->6
+ ;; 7PI/4 >= radians > 8PI/4 ->0
+ ;;
+ ;; other radians are transformed to fit into TWO-PI-range
+ (cond ((>= radians TWO-PI)
+ (get-octants (- radians TWO-PI)))
+ ((< radians 0)
+ (get-octants (+ radians TWO-PI )))
+ (else (truncate (/ radians (/ PI 4))))))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; string
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel