Listing 2: A function to compute points along a Bezier curve
/* ------------------------------------ ComputeBezierPoints ------*/
/* Compute "numPoints" points along the cubic Bezier curve
* described by the four control points ("b0x", "b0y"),
* ("b1x", "b1y"), ("b2x", "b2y"), and ("b3x", "b3y"). Store
* these points into the array "vertices", which *must* be
* large enough to hold all of them. "numPoints" must be at
* least 2. The first and last points stored in "vertices"
* will be the endpoints of the curve, which, of course, are
* the same as the first and last control points. (cab)
*/
void ComputeBezierPoints(
VertexRec vertices[], int numPoints,
double b0x, double b0y,
double b1x, double b1y,
double b2x, double b2y,
double b3x, double b3y
)
{
double ax, ay, bx, by, cx, cy, dx, dy;
int numSteps, i;
double h;
double pointX, pointY;
double firstFDX, firstFDY;
double secondFDX, secondFDY;
double thirdFDX, thirdFDY;
assert(vertices != NULL);
assert(numPoints >= 2);
/* Compute polynomial coefficients from Bezier points */
ax = -b0x + 3 * b1x + -3 * b2x + b3x;
ay = -b0y + 3 * b1y + -3 * b2y + b3y;
bx = 3 * b0x + -6 * b1x + 3 * b2x;
by = 3 * b0y + -6 * b1y + 3 * b2y;
cx = -3 * b0x + 3 * b1x;
cy = -3 * b0y + 3 * b1y;
dx = b0x;
dy = b0y;
/* Set up the number of steps and step size */
numSteps = numPoints - 1; // arbitrary choice
h = 1.0 / (double) numSteps; // compute our step size
/* Compute forward differences from Bezier points and "h" */
pointX = dx;
pointY = dy;
firstFDX = ax * (h * h * h) + bx * (h * h) + cx * h;
firstFDY = ay * (h * h * h) + by * (h * h) + cy * h;
secondFDX = 6 * ax * (h * h * h) + 2 * bx * (h * h);
secondFDY = 6 * ay * (h * h * h) + 2 * by * (h * h);
thirdFDX = 6 * ax * (h * h * h);
thirdFDY = 6 * ay * (h * h * h);
/* Compute points at each step */
vertices[0].x = (int)pointX;
vertices[0].y = (int)pointY;
for (i = 0; i < numSteps; i++) {
pointX += firstFDX;
pointY += firstFDY;
firstFDX += secondFDX;
firstFDY += secondFDY;
secondFDX += thirdFDX;
secondFDY += thirdFDY;
vertices[i + 1].x = (int)pointX;
vertices[i + 1].y = (int)pointY;
}
}
/* End of File */