diff options
Diffstat (limited to 'src/2geom/solve-bezier-parametric.cpp')
| -rw-r--r-- | src/2geom/solve-bezier-parametric.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/2geom/solve-bezier-parametric.cpp b/src/2geom/solve-bezier-parametric.cpp index 76cf65e17..ed693c584 100644 --- a/src/2geom/solve-bezier-parametric.cpp +++ b/src/2geom/solve-bezier-parametric.cpp @@ -68,13 +68,20 @@ find_parametric_bezier_roots(Geom::Point const *w, /* The control points */ break; } - /* Otherwise, solve recursively after subdividing control polygon */ - Geom::Point Left[degree+1], /* New left and right */ - Right[degree+1]; /* control polygons */ + /* + * Otherwise, solve recursively after subdividing control polygon + * New left and right control polygons + */ + Geom::Point *Left = new Geom::Point[degree+1]; + Geom::Point *Right = new Geom::Point[degree+1]; + Bezier(w, degree, 0.5, Left, Right); total_subs ++; find_parametric_bezier_roots(Left, degree, solutions, depth+1); find_parametric_bezier_roots(Right, degree, solutions, depth+1); + + delete[] Left; + delete[] Right; } @@ -191,7 +198,10 @@ Bezier(Geom::Point const *V, /* Control pts */ Geom::Point *Left, /* RETURN left half ctl pts */ Geom::Point *Right) /* RETURN right half ctl pts */ { - Geom::Point Vtemp[degree+1][degree+1]; + Geom::Point **Vtemp = new Geom::Point* [degree+1]; + + for (unsigned int i = 0; i < degree+1; ++i) + Vtemp[i] = new Geom::Point[degree+1]; /* Copy control points */ std::copy(V, V+degree+1, Vtemp[0]); @@ -208,7 +218,14 @@ Bezier(Geom::Point const *V, /* Control pts */ for (unsigned j = 0; j <= degree; j++) Right[j] = Vtemp[degree-j][j]; - return (Vtemp[degree][0]); + Geom::Point return_value = Vtemp[degree][0]; + + for (unsigned int i = 0; i < degree+1; ++i) + delete[] Vtemp[i]; + + delete[] Vtemp; + + return return_value; } }; |
