40 lines
1.3 KiB
C++
40 lines
1.3 KiB
C++
$NetBSD: patch-src_2geom_solve-bezier-parametric.cpp,v 1.1 2012/11/16 00:54:04 joerg Exp $
|
|
|
|
--- src/2geom/solve-bezier-parametric.cpp.orig 2012-11-15 17:42:23.000000000 +0000
|
|
+++ src/2geom/solve-bezier-parametric.cpp
|
|
@@ -191,24 +191,27 @@ Bezier(Geom::Point const *V, /* Control
|
|
Geom::Point *Left, /* RETURN left half ctl pts */
|
|
Geom::Point *Right) /* RETURN right half ctl pts */
|
|
{
|
|
- Geom::Point Vtemp[degree+1][degree+1];
|
|
+ const unsigned sz = degree + 1;
|
|
+ Geom::Point *Vtemp = new Geom::Point[sz * sz];
|
|
|
|
/* Copy control points */
|
|
- std::copy(V, V+degree+1, Vtemp[0]);
|
|
+ for (unsigned i = 0; i < sz; ++i)
|
|
+ Vtemp[0 * sz + i] = V[i];
|
|
|
|
/* Triangle computation */
|
|
for (unsigned i = 1; i <= degree; i++) {
|
|
for (unsigned j = 0; j <= degree - i; j++) {
|
|
- Vtemp[i][j] = lerp(t, Vtemp[i-1][j], Vtemp[i-1][j+1]);
|
|
+ Vtemp[i * sz + j] = lerp(t, Vtemp[(i-1) * sz + j], Vtemp[(i-1) * sz + j+1]);
|
|
}
|
|
}
|
|
|
|
for (unsigned j = 0; j <= degree; j++)
|
|
- Left[j] = Vtemp[j][0];
|
|
+ Left[j] = Vtemp[j * sz + 0];
|
|
for (unsigned j = 0; j <= degree; j++)
|
|
- Right[j] = Vtemp[degree-j][j];
|
|
-
|
|
- return (Vtemp[degree][0]);
|
|
+ Right[j] = Vtemp[(degree-j) * sz + j];
|
|
+ Geom::Point rv(Vtemp[degree * sz + 0]);
|
|
+ delete[] Vtemp;
|
|
+ return rv;
|
|
}
|
|
|
|
};
|