X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=05875b2da2ec5915d7d4c99ae5c89489e9a13986;hb=90e4d7057f3857da049dfda3d130017d4719bd6b;hp=c5bf8cc59de12066e1f4bbf7e6aa88e321ef883e;hpb=e2e1656c9d0897fb45a215bdcb96b146100c33e2;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index c5bf8cc59d..05875b2da2 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -707,20 +707,16 @@ right (@var{dir}=+1)." (define-public (coord-scale coordinate amount) (coord-operation * amount coordinate)) -(define-public (coord-rotate coordinate degrees-in-radians) - (let* - ((coordinate - (cons - (exact->inexact (coord-x coordinate)) - (exact->inexact (coord-y coordinate)))) - (radius - (sqrt - (+ (* (coord-x coordinate) (coord-x coordinate)) - (* (coord-y coordinate) (coord-y coordinate))))) - (angle (angle-0-2pi (atan (coord-y coordinate) (coord-x coordinate))))) - (cons - (* radius (cos (+ angle degrees-in-radians))) - (* radius (sin (+ angle degrees-in-radians)))))) +(define-public (coord-rotate coordinate angle-in-radians) + (coord-rotated coordinate (/ angle-in-radians PI-OVER-180))) + +(define-public (coord-rotated coordinate direction) + ;; Same, in degrees or with a given direction + (let ((dir (ly:directed direction))) + (cons (- (* (car dir) (car coordinate)) + (* (cdr dir) (cdr coordinate))) + (+ (* (car dir) (cdr coordinate)) + (* (cdr dir) (car coordinate)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; trig @@ -735,11 +731,11 @@ right (@var{dir}=+1)." (define-public (cyclic-base-value value cycle) "Take @var{value} and modulo-maps it between 0 and base @var{cycle}." - (if (< value 0) - (cyclic-base-value (+ value cycle) cycle) - (if (>= value cycle) - (cyclic-base-value (- value cycle) cycle) - value))) + (cond ((< value 0) + (cyclic-base-value (+ value cycle) cycle)) + ((>= value cycle) + (cyclic-base-value (- value cycle) cycle)) + (else value))) (define-public (angle-0-2pi angle) "Take @var{angle} (in radians) and maps it between 0 and 2pi." @@ -766,14 +762,8 @@ right (@var{dir}=+1)." (define-public (polar->rectangular radius angle-in-degrees) "Return polar coordinates (@var{radius}, @var{angle-in-degrees}) -as rectangular coordinates @ode{(x-length . y-length)}." - - (let ((complex (make-polar - radius - (degrees->radians angle-in-degrees)))) - (cons - (real-part complex) - (imag-part complex)))) +as rectangular coordinates @code{(x-length . y-length)}." + (ly:directed angle-in-degrees radius)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; string @@ -788,9 +778,9 @@ as rectangular coordinates @ode{(x-length . y-length)}." (define-public (remove-whitespace strg) "Remove characters satisfying @code{char-whitespace?} from string @var{strg}" - (string-delete - strg - char-whitespace?)) + (if (guile-v2) + (string-delete char-whitespace? strg) + (string-delete strg char-whitespace?))) (define-public (string-encode-integer i) (cond @@ -898,6 +888,29 @@ and will be applied to NUM." (fancy-format #f (car custom-format) num)) (else (fancy-format #f "~(~@r~)" num)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; lilypond version + +(define (lexicographic-list-compare? op a b) + "Lexicographically compare two lists @var{a} and @var{b} using + the operator @var{op}. The types of the list elements have to + be comparable with @var{op}. If the lists are of different length + the trailing elements of the longer list are ignored." + (let* ((ca (car a)) + (iseql (op ca ca))) + (let loop ((ca ca) (cb (car b)) (a (cdr a)) (b (cdr b))) + (let ((axb (op ca cb))) + (if (and (pair? a) (pair? b) + (eq? axb iseql (op cb ca))) + (loop (car a) (car b) (cdr a) (cdr b)) + axb))))) + +(define (ly:version? op ver) + "Using the operator @var{op} compare the currently executed LilyPond + version with a given version @var{ver} which is passed as a list of + numbers." + (lexicographic-list-compare? op (ly:version) ver)) + ;;;;;;;;;;;;;;;; ;; other