lilypond-devel
[Top][All Lists]
Advanced

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

Re: Oval stencil and oval markup suggestions


From: Pierre Perol-Schneider
Subject: Re: Oval stencil and oval markup suggestions
Date: Fri, 5 Apr 2019 21:32:30 +0200

On the other hand, it gives the same output as "ellipse", so I can
understand the lack of interest.

%%%
#(define-public (make-oval-stencil-pps x-radius y-radius thickness fill)
  "Make an oval from four Bezier curves, of address@hidden @var{x-radius},
  address@hidden @code{y-radius}, and thickness @var{thickness} with fill
  defined by @code{fill}."
    (let*
        ((k 0.551915)
         (x-out-radius (+ x-radius (/ thickness 2.0)))
         (y-out-radius (+ y-radius (/ thickness 2.0)))
         (x-max x-radius)
         (x-min (- x-radius))
         (y-max y-radius)
         (y-min (- y-radius))
         (commands `(,(list 'moveto x-max 0)
                     ,(list 'curveto x-max (* y-max k) (* x-max k) y-max 0
y-max)
                     ,(list 'curveto (* x-min k) y-max x-min (* y-max k)
x-min 0)
                     ,(list 'curveto x-min (* y-min k) (* x-min k) y-min 0
y-min)
                     ,(list 'curveto (* x-max k) y-min x-max (* y-min k)
x-max 0)
                     ,(list 'closepath)))
         (command-list (fold-right append '() commands)))
      ;; after Harm:
      (make-path-stencil
       command-list
       thickness 1 1 fill)))

%% test:
\markup \translate #'(15 . 0) {
  \scale #'(5 . 5) {
    \combine
    \with-color #blue
    \stencil #(make-oval-stencil-pps 3 2 .2 #f)
    \with-color #red
    \stencil #(make-ellipse-stencil 3 2 .1 #f)
  }
}

%%%
Cheers,
Pierre

Le ven. 5 avr. 2019 à 08:58, Pierre Perol-Schneider <
address@hidden> a écrit :

> (I meen the ovals, not the combination).
>
> Le ven. 5 avr. 2019 à 08:55, Pierre Perol-Schneider <
> address@hidden> a écrit :
>
>> Hi Harm,
>> Not getting a perfect circle is no issue. What I found not neet is that:
>>
>> \markup {
>>   \combine
>>   \stencil #(make-oval-stencil 3 2 .13 #f)
>>   \stencil #(make-oval-stencil 2 3 .13 #f)
>> }
>>
>> have no axis of symmetry.
>> Cheers,
>> Pierre
>>
>>
>> Le jeu. 4 avr. 2019 à 22:03, Thomas Morley <address@hidden> a
>> écrit :
>>
>>> Am Do., 4. Apr. 2019 um 17:34 Uhr schrieb Pierre Perol-Schneider
>>> <address@hidden>:
>>> >
>>> > Hi Dev Team,
>>> > Here's some thougts:
>>> >
>>> > %%%%%%
>>> > \version "2.19.83"
>>> >
>>> > %% The oval stencil commands uses beziers curves that cause some side
>>> > effects:
>>> > \markuplist {
>>> >   \line\vcenter {
>>> >     "Circle, radius = 2 : "
>>> >     \stencil #(make-circle-stencil 2 .13 #f)
>>> >   }
>>> >   \line\vcenter {
>>> >     "Oval, x-radius = y-radius = 2 : "
>>> >     \stencil #(make-oval-stencil 2 2 .13 #f)
>>> >   }
>>> >   \line\vcenter {
>>> >     "Oval extents, x-radius = y-radius = 2 : "
>>> >     \box\stencil #(make-oval-stencil 2 2 .13 #f)
>>> >   }
>>> > }
>>> >
>>> > %% Here's a suggestion with a corrected y-radius in order to reach a
>>> quasi
>>> > circle:
>>> [...]
>>>
>>> Hi Pierre,
>>>
>>> current `make-oval-stencil´, used via `oval-stencil´ in the
>>> `oval´-markup-command uses beziers, yes.
>>> Though, you will never get a perfect circle using beziers. I don't
>>> understand why you see this as an issue.
>>> Maybe the naming x-radius/y-radius is misleading, because x-radius
>>> mirrors the final x-extent, but y-radius the y-extent of the
>>> control-points, not of the final oval.
>>> Ofcourse this has impact an the final dimensions, which you
>>> demonstrated by applying \box.
>>> If we think this is a problem I'd rather suggest to do:
>>>
>>> #(define-public (make-oval-stencil-harm x-radius y-radius thickness fill)
>>>   "Make an oval from two Bezier curves, of address@hidden @var{x-radius},
>>> address@hidden @code{y-radius}, and thickness @var{thickness} with fill
>>> defined by @code{fill}."
>>>   (let*
>>>       ((x-out-radius (+ x-radius (/ thickness 2.0)))
>>>        (y-out-radius (+ y-radius (/ thickness 2.0)))
>>>        (x-max x-radius)
>>>        (x-min (- x-radius))
>>>        (y-max y-radius)
>>>        (y-min (- y-radius))
>>>        (commands `(,(list 'moveto x-max 0)
>>>                    ,(list 'curveto x-max y-max x-min y-max x-min 0)
>>>                    ,(list 'curveto x-min y-min x-max y-min x-max 0)
>>>                    ,(list 'closepath)))
>>>        (command-list (fold-right append '() commands)))
>>>     ;(ly:make-stencil
>>>     ; `(path ,thickness `(,@',command-list) 'round 'round ,fill)
>>>     ; (cons (- x-out-radius) x-out-radius)
>>>     ; (cons (- y-out-radius) y-out-radius))
>>>     (make-path-stencil
>>>       command-list
>>>       thickness 1 1 fill)))
>>>
>>> Cheers,
>>>   Harm
>>>
>>


reply via email to

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