(define (make-radius-list x-radius y-radius)
"Makes a list of angle/radius pairs at intervals of PI/2 for
the partial ellipse until 7*PI/2. For example, in pseudo-code:
-> (make-radius-list 2 3)
-((0.0 . 2) (PI/2 . 3) (PI . -2) (3*PI/2 . -3)
- (2*PI . 2) (5*PI/2 . 3) (3*PI . -2) (7*PI/2 . -3))
+> (make-radius-list 2 3)\
+\n((0.0 . 2) (PI/2 . 3) (PI . -2) (3*PI/2 . -3)\
+\n(2*PI . 2) (5*PI/2 . 3) (3*PI . -2) (7*PI/2 . -3))
"
(apply append
(map (lambda (adder)
(helper ordering-function value left-list right-list cutl? cutr?)
(if (null? right-list)
(append
- (if cutl? '() left-list)
- (list value)
- (if cutr? '() right-list))
+ (if cutl? '() left-list)
+ (list value)
+ (if cutr? '() right-list))
(if (ordering-function value (car right-list))
(append
- (if cutl? '() left-list)
- (list value)
- (if cutr? '() right-list))
+ (if cutl? '() left-list)
+ (list value)
+ (if cutr? '() right-list))
(helper
- ordering-function
- value
- (append left-list (list (car right-list)))
- (cdr right-list)
- cutl?
- cutr?))))
+ ordering-function
+ value
+ (append left-list (list (car right-list)))
+ (cdr right-list)
+ cutl?
+ cutr?))))
(helper ordering-function value '() inlist cutl? cutr?))
(define (ordering-function-1 a b) (car< a b))
;; we want the end angle to always be bigger than the start angle
;; so we redefine it here just in case it is less
(new-end-angle
- (if (<= new-end-angle new-start-angle)
- (+ TWO-PI new-end-angle)
- new-end-angle))
+ (if (<= new-end-angle new-start-angle)
+ (+ TWO-PI new-end-angle)
+ new-end-angle))
;; all the points that may be extrema of the arc
;; this is the 90 degree points plus the beginning and end points
;; we use this to calculate extents
(possible-extrema
+ (insert-in-ordered-list
+ ordering-function-2
+ (cons new-end-angle rectangular-end-radius)
(insert-in-ordered-list
- ordering-function-2
- (cons new-end-angle rectangular-end-radius)
- (insert-in-ordered-list
- ordering-function-1
- (cons new-start-angle rectangular-start-radius)
- radius-list
- #t
- #f)
- #f
- #t)))
+ ordering-function-1
+ (cons new-start-angle rectangular-start-radius)
+ radius-list
+ #t
+ #f)
+ #f
+ #t)))
(ly:make-stencil
- (list
- 'partial-ellipse
- x-radius
- y-radius
- start-angle
- end-angle
- thick
- connect
- fill)
- ;; we know the extrema points by crawling through the
- ;; list of possible extrema and finding the min and max
- ;; for x and y
- (cons (min-max-crawler min cadr possible-extrema)
- (min-max-crawler max cadr possible-extrema))
- (cons (min-max-crawler min cddr possible-extrema)
- (min-max-crawler max cddr possible-extrema)))))
+ (list
+ 'partial-ellipse
+ x-radius
+ y-radius
+ start-angle
+ end-angle
+ thick
+ connect
+ fill)
+ ;; we know the extrema points by crawling through the
+ ;; list of possible extrema and finding the min and max
+ ;; for x and y
+ (cons (min-max-crawler min cadr possible-extrema)
+ (min-max-crawler max cadr possible-extrema))
+ (cons (min-max-crawler min cddr possible-extrema)
+ (min-max-crawler max cddr possible-extrema)))))
(define (line-part-min-max x1 x2)
(list (min x1 x2) (max x1 x2)))
;; should be superfluous, but leaking "too many open files"?
(close-port output))
-