lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to calculate visible vertical beam-height


From: karl
Subject: Re: How to calculate visible vertical beam-height
Date: Sun, 2 Jun 2019 17:09:30 +0200 (CEST)

--------
Thomas Morley:
...
> I'm interested in a formula how the length of the red line changes
> with different blot-diameters.
...
> \version "2.19.82"
> 
> #(define-markup-command (beam layout props width slope thickness)
>   (number? number? number?)
>   #:properties ((blot #f))
>   (let* ((y (* slope width))
>          (yext (cons (min 0 y) (max 0 y)))
>          (half (/ thickness 2)))
> 
>     (ly:make-stencil
>      `(polygon ',(list
>                   0 (/ thickness -2)
>                   width (+ (* width slope)  (/ thickness -2))
>                   width (+ (* width slope)  (/ thickness 2))
>                   0 (/ thickness 2))
>                ,(or blot (ly:output-def-lookup layout 'blot-diameter))
>                #t)
>      (cons 0 width)
>      (cons (+ (- half) (car yext))
>            (+ half (cdr yext))))))
> 
> \markup {
>   \overlay {
>     \override #'(blot . 0) \beam #5 #1 #2
>     \translate #'(1 . 0) \with-color #red \draw-line #'(0 . 2)
>   }
> 
>   \overlay {
>     \override #'(blot . 2) \beam #5 #1 #2
>     \translate #'(2.35 . 0) \with-color #red \draw-line #'(0 . 4.7)
>   }
> }

Which seems to be drawn as (in postscript):
/draw_polygon % fill? x(n) y(n) x(n-1) y(n-1) ... x(0) y(0) n blot
{
        setlinewidth %set to blot

        0 setlinecap
        1 setlinejoin

        3 1 roll
        /polygon_x
        currentpoint
        /polygon_y exch def
        def
        rmoveto % x(0) y(0)
        { polygon_x polygon_y vector_add lineto } repeat % n times
        closepath
        stroke_and_fill?
} bind def

So, you defines four points makeing up a filled closed polygon.
You then draw a line with linewidth = blot or blot-diamer, through
thoose points.

Let
 x1 = 0
 x2 = width
 ya = - thickness/2
 yb =   thickness/2
 h  = width * slope

The points are
 (x1, ya)
 (x1, yb)
 (x2, ya+h)
 (x2, yb+h)

I.e.
 thickness = height (in y-direction) of beam without any blot
 slope is tan(angle of beam inclination), i.e. 1 => 45°
 blot = the linewidth of a line (path in postscript jargon) through 
      the above points, i.e. adding to thickness

As one can see, the polygon have four corners and is an
parallelogram, i.e. top/bottom sides are parallel to each
other and the same for left/right siedes.

Then you make the parallelogram lines thicker, thereby extending
the filled area blot/2 units outwards, parallel to the sides.
Round at the corner, and straight along the sides.

But since blot is a linewidth, not a y-height as for the thickness,
the blot/2 distance from the polygon side to the final extent, it 
is measured at 90° to the parallelogram side, which is inclined at an
angle = atan(slope). If you draw a line (A) representing the blot/2 
extension, you'll see that it is also inclined at the same angle;
if you look at the top side and if slope > 0, the line A is inclined
upwards to the left.

So the extension is blot/2 at 90° (normal) to the polygon side.
To get from a polygon side point p1 up in y-direction, we divide
it into two actions:

 . from p1 going normal to poly-side blot/2 units to the line edge 
   point p2

 . the from p2, along the line edge, to the final "straight above p1 
   point" p3

since lines p1-p2 and p2-p3 are at 90° angle to each other, we can use
trigonymetry to find the length of the line p1-p3.

we know that (by makeing some drawings):
 length of line p1-p2 / length of line p1-p3 =
 cos( our inclination angle ) = cos(atan(slope))

So bacically:
 length of p1-p3 = length p1-p2 / cos(atan(slope))

and finally:
 total height = thickness + blot / cos(atan(slope))

Well, you can't blame me for guessing.

Regards,
/Karl Hammar






reply via email to

[Prev in Thread] Current Thread [Next in Thread]