Introduction
Solutions for session 9.
Exercises
Source code of the exercises.
Exercise 1: de-Casteljau's algorithm
// implements b^i_n(t)
Point calcBezier(int n, int i, double t) {
if (n==1) return controls[i];
Point p1=calcBezier(n-1, i, t);
Point p2=calcBezier(n-1, i+1, t);
return new Point((1-t)*p1.x + t*p2.x, (1-t)*p1.y + t*p2.y);
}
// draws a bezier curve with controls.length control points
// control point i is accessible via controls[i]
void drawBezier() {
Point p1, p2;
p1=calcBezier(controls.length, 0, 0);
for (double t=0; t < 1.0025; t+=0.005) {
p2 = calcBezier(controls.length, 0, t);
line((int)p1.x, (int)p1.y, (int)p2.x, (int)p2.y);
p1=p2;
}
}
Exercise 2: Uniform B-Splines
// draws a curve segment of the B-spline, for 4 control points
void drawBSplineCurve(int i) {
Point p0 = controls[i+0];
Point p1 = controls[i+1];
Point p2 = controls[i+2];
Point p3 = controls[i+3];
for (double t=0; t < 1.0025; t+=0.005) {
// apply parametric formula to obtain x and y coordinates
double x = (1.0/6.0) * ( t*t*t*(-p0.x + 3*p1.x - 3*p2.x +p3.x) +
t*t* (3*p0.x - 6*p1.x + 3*p2.x) +
t* (-3*p0.x + 3*p2.x) +
(p0.x + 4*p1.x + p2.x) );
double y = (1.0/6.0) * ( t*t*t*(-p0.y + 3*p1.y - 3*p2.y +p3.y) +
t*t* (3*p0.y - 6*p1.y + 3*p2.y) +
t* (-3*p0.y + 3*p2.y) +
(p0.y + 4*p1.y + p2.y) );
point((int) x, (int)y);
}
}
// draws a B-spline with controls.length control points,
// consisting of controls.length - 3 curve segments
void drawBSpline() {
for (int i=0; i < controls.length-3; i++) {
// draw the curve for control points [ i, i+1, i+2, i+3 ]
drawBSplineCurve(i);
}
}