From 07e33979c286e1ed73758276fe2c1de6234e9bf4 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 25 Feb 2000 13:07:22 +0100 Subject: [PATCH] patch::: 1.3.27.jcn1: om terug te sturen 1.3.27.jcn1 -- eigenlijk: 26.hwn4.jcn1 =========== * Bezier_bow: minimise_enclosed_area --- CHANGES | 5 ++++ VERSION | 2 +- input/test/slur-area.sly | 3 +++ lily/bezier-bow.cc | 54 ++++++++++++++++++++++++++++++++++++++ lily/include/bezier-bow.hh | 3 +++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 input/test/slur-area.sly diff --git a/CHANGES b/CHANGES index d0896a7d87..e439dbafe5 100644 --- 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 f62de114bd..a85e0bcfad 100644 --- 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 index 0000000000..4b676c7749 --- /dev/null +++ b/input/test/slur-area.sly @@ -0,0 +1,3 @@ +\property Voice.slurVerticalDirection = #1 +\property Voice.stemVerticalDirection = #-1 +a''(a' a,)a diff --git a/lily/bezier-bow.cc b/lily/bezier-bow.cc index 0cfd5a070e..2206a6663f 100644 --- a/lily/bezier-bow.cc +++ b/lily/bezier-bow.cc @@ -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 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 (); } } diff --git a/lily/include/bezier-bow.hh b/lily/include/bezier-bow.hh index 93a453359c..2997fa52e3 100644 --- a/lily/include/bezier-bow.hh +++ b/lily/include/bezier-bow.hh @@ -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; -- 2.39.2