]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bezier-bow.cc
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / bezier-bow.cc
index 06f6cc211846bed34a8be22e211197b00a100f77..e049bd734c244f78c8411324296514e8de219cc1 100644 (file)
@@ -1,17 +1,25 @@
 /*
-  bezier.cc -- implement Bezier and Bezier_bow
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1998--2015 Jan Nieuwenhuizen <janneke@gnu.org>
 
-  (c) 1998--2004 Jan Nieuwenhuizen <janneke@gnu.org>
-*/
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
-#include <math.h>
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #include "misc.hh"
 #include "bezier.hh"
 
-
 static Real
 F0_1 (Real x)
 {
@@ -24,17 +32,15 @@ slur_height (Real width, Real h_inf, Real r_0)
   return F0_1 (width * r_0 / h_inf) * h_inf;
 }
 
-  /*
-
-
-  ^              x                    x                  
+/*
+  ^                x                    x
   |
-height   <indent>
+  height   <indent>
   |
-  v      x                                    x
+  v      x                                       x
+
+
 
-  
-  
   For small w, the height should be proportional to w, for w ->
   infinity, the height should rise to a limit asymptotically.
 
@@ -45,7 +51,7 @@ height   <indent>
 
   h = h_infinity * F (x * r_0 / h_infinity)
 
-  
+
   Examples:
 
   * F (x) = 2/pi * atan (pi x/2)
@@ -59,7 +65,7 @@ height   <indent>
 
   Although this might seem cand_idates to SCM-ify, it is not all clear
   which parameters (ie. h_inf, r_0, F (.)) should be candidates for
-  this.  At present h_inf and r_0 come from paper settings, but we did
+  this.  At present h_inf and r_0 come from layout settings, but we did
   no experiments for determining the best combinations of F, h_inf and
   r_0.
 
@@ -68,39 +74,50 @@ height   <indent>
   slurs.  For large slurs, this gives a certain hookiness at the end,
   so we increase the indent.
 
-  ind = G(w)
+  indent = G (w)
 
-  w -> 0,  G(w) -> .5 h
+  w -> 0,  G (w) -> .33 w
 
-  w -> inf, G(w) -> 2*h
 
-  eg.
+  (due to derivative constraints, we cannot have indent > len/3)
 
+  w -> inf, G (w) -> 2*h_inf
 
-  G(w) = h (w/(w+h_inf) 1.5 + .5 h 
-  
-  
-  */
+  i.e.
 
-void
-get_slur_indent_height (Real * indent, Real *height,
-                       Real width, Real h_inf, Real r_0)
-{
-  *height =  slur_height (width, h_inf, r_0);
-  *indent = (width/(h_inf+ width)*1.5 + 0.5) * (*height);
-}
 
+  G (0) = 0 , G'(0) 1/3, G (infty) = 2h_inf
+
+  solve from
+
+  G (w) = r  + p/(w+q)
 
+  yields
 
+  G (w) = 2 h_inf - max_fraction * q^2/ (w + q)
+
+  with q = 2 h_inf
+*/
+
+void
+get_slur_indent_height (Real *indent, Real *height,
+                        Real width, Real h_inf, Real r_0)
+{
+  Real max_fraction = 1.0 / 3.1;
+  *height = slur_height (width, h_inf, r_0);
+
+  Real q = 2 * h_inf / max_fraction;
+  *indent = 2 * h_inf - sqr (q) * max_fraction / (width + q);
+}
 
 Bezier
 slur_shape (Real width, Real h_inf, Real r_0)
 {
   Real indent;
   Real height;
-  
+
   get_slur_indent_height (&indent, &height,
-                         width,  h_inf,  r_0);
+                          width, h_inf, r_0);
 
   Bezier curve;
   curve.control_[0] = Offset (0, 0);