]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/bezier.cc
Merge branch 'cvs-head' of ssh+git://hanwen@repo.or.cz/srv/git/lilypond into master...
[lilypond.git] / lily / bezier.cc
index 1b73404b776dde613408eb5668e6ec6e913b075b..f5489e7d40b16825bc18728800073f582895b7a3 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1998--2005 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1998--2006 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "bezier.hh"
@@ -30,9 +30,9 @@ binomial_coefficient (Real over, int under)
 }
 
 void
-scale (Array<Offset> *array, Real x, Real y)
+scale (vector<Offset> *array, Real x, Real y)
 {
-  for (int i = 0; i < array->size (); i++)
+  for (vsize i = 0; i < array->size (); i++)
     {
       (*array)[i][X_AXIS] = x * (*array)[i][X_AXIS];
       (*array)[i][Y_AXIS] = y * (*array)[i][Y_AXIS];
@@ -40,17 +40,17 @@ scale (Array<Offset> *array, Real x, Real y)
 }
 
 void
-rotate (Array<Offset> *array, Real phi)
+rotate (vector<Offset> *array, Real phi)
 {
   Offset rot (complex_exp (Offset (0, phi)));
-  for (int i = 0; i < array->size (); i++)
+  for (vsize i = 0; i < array->size (); i++)
     (*array)[i] = complex_multiply (rot, (*array)[i]);
 }
 
 void
-translate (Array<Offset> *array, Offset o)
+translate (vector<Offset> *array, Offset o)
 {
-  for (int i = 0; i < array->size (); i++)
+  for (vsize i = 0; i < array->size (); i++)
     (*array)[i] += o;
 }
 
@@ -66,8 +66,8 @@ translate (Array<Offset> *array, Offset o)
 Real
 Bezier::get_other_coordinate (Axis a, Real x) const
 {
-  Axis other = Axis ((a +1)%NO_AXES);
-  Array<Real> ts = solve_point (a, x);
+  Axis other = Axis ((a +1) % NO_AXES);
+  vector<Real> ts = solve_point (a, x);
 
   if (ts.size () == 0)
     {
@@ -169,19 +169,19 @@ Bezier::polynomial (Axis a) const
 /**
    Remove all numbers outside [0, 1] from SOL
 */
-Array<Real>
-filter_solutions (Array<Real> sol)
+vector<Real>
+filter_solutions (vector<Real> sol)
 {
-  for (int i = sol.size (); i--;)
+  for (vsize i = sol.size (); i--;)
     if (sol[i] < 0 || sol[i] > 1)
-      sol.del (i);
+      sol.erase (sol.begin () + i);
   return sol;
 }
 
 /**
    find t such that derivative is proportional to DERIV
 */
-Array<Real>
+vector<Real>
 Bezier::solve_derivative (Offset deriv) const
 {
   Polynomial xp = polynomial (X_AXIS);
@@ -197,13 +197,13 @@ Bezier::solve_derivative (Offset deriv) const
 /*
   Find t such that curve_point (t)[AX] == COORDINATE
 */
-Array<Real>
+vector<Real>
 Bezier::solve_point (Axis ax, Real coordinate) const
 {
   Polynomial p (polynomial (ax));
   p.coefs_[0] -= coordinate;
 
-  Array<Real> sol (p.solve ());
+  vector<Real> sol (p.solve ());
   return filter_solutions (sol);
 }
 
@@ -217,10 +217,10 @@ Bezier::extent (Axis a) const
   Offset d;
   d[Axis (o)] = 1.0;
   Interval iv;
-  Array<Real> sols (solve_derivative (d));
-  sols.push (1.0);
-  sols.push (0.0);
-  for (int i = sols.size (); i--;)
+  vector<Real> sols (solve_derivative (d));
+  sols.push_back (1.0);
+  sols.push_back (0.0);
+  for (vsize i = sols.size (); i--;)
     {
       Offset o (curve_point (sols[i]));
       iv.unite (Interval (o[a], o[a]));
@@ -228,6 +228,17 @@ Bezier::extent (Axis a) const
   return iv;
 }
 
+Interval
+Bezier::control_point_extent (Axis a) const
+{
+  Interval ext;
+  for (int i = CONTROL_COUNT; i--;)
+    ext.add_point (control_[i][a]);
+
+  return ext;      
+}
+
+
 /**
    Flip around axis A
 */