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 */