]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 1.3.27.jcn1: om terug te sturen
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 25 Feb 2000 12:07:22 +0000 (13:07 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 25 Feb 2000 12:07:22 +0000 (13:07 +0100)
1.3.27.jcn1  -- eigenlijk: 26.hwn4.jcn1
===========

* Bezier_bow: minimise_enclosed_area

CHANGES
VERSION
input/test/slur-area.sly [new file with mode: 0644]
lily/bezier-bow.cc
lily/include/bezier-bow.hh

diff --git a/CHANGES b/CHANGES
index d0896a7d87bf4302832367c9d7754df845ead6b2..e439dbafe5f590b5805945aef478b141447b3f4d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,8 @@
+1.3.27.jcn1  -- eigenlijk: 26.hwn4.jcn1
+===========
+
+* Bezier_bow: minimise_enclosed_area
+
 1.3.26.jcn2
 ===========
 
diff --git a/VERSION b/VERSION
index f62de114bd78003a8b4abce4580bb83f8d40da3c..a85e0bcfadac6a154303a3fec4312215bddc3f4d 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PATCH_LEVEL=27
-MY_PATCH_LEVEL=hwn1
+MY_PATCH_LEVEL=jcn1
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
diff --git a/input/test/slur-area.sly b/input/test/slur-area.sly
new file mode 100644 (file)
index 0000000..4b676c7
--- /dev/null
@@ -0,0 +1,3 @@
+\property Voice.slurVerticalDirection = #1
+\property Voice.stemVerticalDirection = #-1
+a''(a' a,)a
index 0cfd5a070e2d6727de48c395db11b776cd3401bf..2206a6663f1c8b9385e31917c4db6b76bc8dcf6b 100644 (file)
@@ -74,6 +74,59 @@ Bezier_bow::blow_fit ()
   curve_.check_sanity ();
 }
 
+Real
+Bezier_bow::calc_enclosed_area_f () const
+{
+  Real a = 0;
+  for (int i=0; i < encompass_.size (); i++)
+    {
+      Interval x;
+      Interval y;
+      if (i == 0)
+       x = Interval (0, encompass_[1][X_AXIS]/2);
+      else if (i == encompass_.size () - 1)
+       x = Interval ((encompass_[i-1][X_AXIS] + encompass_[i][X_AXIS])/2, 
+                     encompass_[i][X_AXIS]);
+      else
+       x = Interval ((encompass_[i-1][X_AXIS] + encompass_[i][X_AXIS])/2, 
+                     (encompass_[i][X_AXIS] + encompass_[i+1][X_AXIS])/2);
+      
+      y[MIN] = encompass_[i][Y_AXIS];
+      // solve_point (X, 0|Xmax) has no solutions...
+      y[MAX] = (x[MIN] ? curve_.get_other_coordinate (X_AXIS, x[MIN]) : 0
+               + curve_.get_other_coordinate (X_AXIS, (x[MIN] + x[MAX])/2)
+               + x[MAX] != encompass_.top ()[X_AXIS] ? curve_.get_other_coordinate (X_AXIS, x[MAX]) : 0)/3;
+      Real da = x.length () * y.length ();
+      if (da > 0)
+       a += da;
+    }
+  return a;
+}
+
+void
+Bezier_bow::minimise_enclosed_area ()
+{
+  Real area = calc_enclosed_area_f ();
+  
+  Array<Offset> da (2);
+  for (int i=1; i < 3; i++)
+    {
+      for (Axis a=X_AXIS; a < NO_AXES; incr (a)) 
+       {
+         Real r = curve_.control_[i][a];
+         curve_.control_[i][a] += 1;
+         da[i-1][a] = (calc_enclosed_area_f () - area) / area;
+         curve_.control_[i][a] = r;
+       }
+    }
+  
+  for (int i=1; i < 3; i++)
+    {
+      da[i-1] *= da[i-1].length () ? 1.0 / da[i-1].length () : 1.0;
+      curve_.control_[i] -= da[i-1] * curve_.control_[i].length ();
+    }
+}
+
 void
 Bezier_bow::calculate ()
 {
@@ -82,6 +135,7 @@ Bezier_bow::calculate ()
     {
       //    calc_tangent_controls ();
       blow_fit ();
+      minimise_enclosed_area ();
     }
 }
 
index 93a453359c2ca856eb345f04d2a87ad922627f1a..2997fa52e356f32708f7c022bc8bbebbb4785667 100644 (file)
@@ -26,6 +26,9 @@ class Bezier_bow
   void calc_default ();
   void to_canonic_form ();
   void calc_tangent_controls ();
+  Real calc_enclosed_area_f () const;
+  void minimise_enclosed_area ();
+
   Real fit_factor () const;