X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbezier.cc;h=2aae4c45fd6dc2130fcc4bafcea4a61341be5e83;hb=d9fcd3db46970a4afbc4e073abb2156ecc865981;hp=b9044063baffa5d494aab1b3d8cec59eecf7a552;hpb=32f5956ef64bfa7b0fd6a9f6c34a53760adae04e;p=lilypond.git diff --git a/lily/bezier.cc b/lily/bezier.cc index b9044063ba..2aae4c45fd 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -1,9 +1,20 @@ /* - 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--2009 Jan Nieuwenhuizen - (c) 1998--2009 Jan Nieuwenhuizen + 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. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "bezier.hh" @@ -272,7 +283,7 @@ Bezier::reverse () using deCasteljau's algorithm. */ void -Bezier::subdivide (Real t, Bezier &left_part, Bezier &right_part) +Bezier::subdivide (Real t, Bezier *left_part, Bezier *right_part) const { Offset p[CONTROL_COUNT][CONTROL_COUNT]; @@ -283,8 +294,8 @@ Bezier::subdivide (Real t, Bezier &left_part, Bezier &right_part) p[i][j] = p[i][j+1] + t * (p[i+1][j+1] - p[i][j+1]); for (int i = 0; i < CONTROL_COUNT; i++) { - left_part.control_[i]=p[0][CONTROL_COUNT - 1 - i]; - right_part.control_[i]=p[i][i]; + left_part->control_[i]=p[0][CONTROL_COUNT - 1 - i]; + right_part->control_[i]=p[i][i]; } } @@ -293,25 +304,24 @@ Bezier::subdivide (Real t, Bezier &left_part, Bezier &right_part) */ Bezier -Bezier::extract (Real t_min, Real t_max) +Bezier::extract (Real t_min, Real t_max) const { + if ((t_min < 0) || (t_max) > 1) + programming_error + ("bezier extract arguments outside of limits: curve may have bad shape"); + if (t_min >= t_max) + programming_error + ("lower bezier extract value not less than upper value: curve may have bad shape"); Bezier bez1, bez2, bez3, bez4; if (t_min == 0.0) - { - for (int i = 0; i < CONTROL_COUNT; i++) - bez2.control_[i] = control_[i]; - } + bez2 = *this; else - { - subdivide (t_min, bez1, bez2); - } + subdivide (t_min, &bez1, &bez2); if (t_max == 1.0) - { return bez2; - } else { - bez2.subdivide ((t_max-t_min)/(1-t_min), bez3, bez4); + bez2.subdivide ((t_max-t_min)/(1-t_min), &bez3, &bez4); return bez3; } }