]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bezier.cc
Run grand-replace (issue 3765)
[lilypond.git] / lily / bezier.cc
index a68c03907d047eaa49db73aa8f051e8ea22b586e..7d3ad6af14fff2d8d2a24267f6fc9e9b729dff6b 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1998--2011 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1998--2014 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
@@ -21,7 +21,8 @@
 #include "warn.hh"
 #include "libc-extension.hh"
 
-Real binomial_coefficient_3[] =
+Real binomial_coefficient_3[]
+=
 {
   1, 3, 3, 1
 };
@@ -139,6 +140,24 @@ Bezier::curve_point (Real t) const
   return o;
 }
 
+Real
+Bezier::slope_at_point (Real t) const
+{
+  Offset second_order[3];
+  Offset third_order[2];
+
+  for (vsize i = 0; i < 3; i++)
+    second_order[i] = ((control_[i + 1] - control_[i]) * t) + control_[i];
+
+  for (vsize i = 0; i < 2; i++)
+    third_order[i] = ((second_order[i + 1] - second_order[i]) * t) + second_order[i];
+
+  if (third_order[1][X_AXIS] - third_order[0][X_AXIS] == 0)
+    return infinity_f;
+
+  return (third_order[1][Y_AXIS] - third_order[0][Y_AXIS]) / (third_order[1][X_AXIS] - third_order[0][X_AXIS]);
+}
+
 /*
   Cache binom (3, j) t^j (1-t)^{3-j}
 */
@@ -244,14 +263,12 @@ Bezier::minmax (Axis ax, Real l, Real r, Direction d) const
 
   //  or intersections of the curve with the bounding lines at L and R.
   Interval lr (l, r);
-  Direction dir = LEFT;
-  do
+  for (LEFT_and_RIGHT (dir))
     {
       vector<Real> v = get_other_coordinates (ax, lr[dir]);
       for (vsize i = v.size (); i--;)
         iv.add_point (v[i]);
     }
-  while (flip (&dir) != LEFT);
 
   if (iv.is_empty ())
     {