I do not really understand what you desire to get. May be my response is not helpful but silly.

#(define pts-list
  '((12 . 8)
    (5 . 8)
    (2 . 2)
    (15 . 2)))

In your List you have the start point defined with ay (x.y)= (2,2) and the end point (15,2) - that is the last pair of coordinates.

Looks like I need to calculate the actual X/Y-extents of the resulting
bezier-curve.

The x extent of your curve therefore is 15-2 = 13.
The y extent is harder to calculate as it depends on the parameters of the bezier definition. A good description is here:
http://www.math.ucla.edu/~baker/149.1.02w/handouts/bb_bezier.pdf

The line override does nothing?

         \override #'(box-padding . 0)

If you set (0,0) instead of (2.2) the starting point is at (0.0) and this is the rotation center. (You rotate in your example around this point.) Then you have to change the last corrdinate pair to (13,0) for to get the seme base length and to stay in the box.

The first coordinate pair of the definition in

#(define pts-list

controls the steepness of the start and end of the curve and the form, please see the link above for details.

May be I missed the point?

Regards





On 06.10.2015 13:37, Thomas Morley wrote:
Hi all,

I'm going to write a generic bow-stencil.
Below you'll find a boiled down example.

The main problem: how to determine the correct extents.
Looks like I need to calculate the actual X/Y-extents of the resulting
bezier-curve.
Though, obviously my maths-skills are not sufficient.

Any hints?

\version "2.18.2"

%% `overlay' is in the source for 2.19.28
%% for lower versions use:
#(define-markup-command (overlay layout props args) (markup-list?)
   (apply ly:stencil-add (interpret-markup-list layout props args)))

#(define (make-simple-bezier-stencil coords)
   (let* ((command-list `(moveto
                         ,(car (list-ref coords 3))
                         ,(cdr (list-ref coords 3))
                         curveto
                         ,(car (list-ref coords 0))
                         ,(cdr (list-ref coords 0))
                         ,(car (list-ref coords 1))
                         ,(cdr (list-ref coords 1))
                         ,(car (list-ref coords 2))
                         ,(cdr (list-ref coords 2))
                         )))
   (ly:make-stencil
     `(path 0.1 `(,@' ,command-list) 'round 'round #f)
     ;;;; TODO
     ;;;; How to get correct extents?
     ;; xext:
     (cons
       (car (list-ref coords 2))
       (car (list-ref coords 3)))
     ;;yext:
     (cons
       (cdr (list-ref coords 2))
       (cdr (list-ref coords 1)))
     )))

%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%

#(define pts-list
   '((12 . 8)
     (5 . 8)
     (2 . 2)
     (15 . 2)))

#(define (rotated-pts-list degree)
   (map
     (lambda (c)
       ;;;; TODO
       ;; coord-rotate rotates around '(0 . 0)
       ;; make it generic
       (coord-rotate c (degrees->radians degree)))
     pts-list))

\markup
   \column {
     \vspace #3
      \fill-line {
        \overlay {
          \circle \null %% representing point '(0 . 0)
          \override #'(box-padding . 0)
          \box \with-color #red {
            \stencil
              #(make-simple-bezier-stencil pts-list)
            \stencil
              #(make-simple-bezier-stencil (rotated-pts-list 90))
            \stencil
              #(make-simple-bezier-stencil (rotated-pts-list 60))
          }
        }
      }
   }



Cheers,
   Harm

_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to