#include<stdio.h>
#include<math.h>
#define MAX_POINTS 10
FILE* set_plot(int n,double p[][2])
{
FILE* gp=popen("gnuplot -persistent","w");
fprintf(gp
,"set title 'bezier curve'\n");
fprintf(gp
, "plot '-' with linespoints dt 2 pointsize 1.5 linewidth 2 linecolor rgb 'red' title 'Control Points', " "'-' with linespoints pointtype 7 pointsize 1.5 linewidth 3 linecolor rgb 'blue' title 'Bezier Curve'\n");
// Control points
for(int i = 0; i <= n; i++) {
fprintf(gp
, "%f %f\n", p
[i
][0], p
[i
][1]); }
return gp;
}
void plot_curve(FILE* gp,double result[2])
{
fprintf(gp
, "%f %f\n", result
[0], result
[1]); }
// De Casteljau Algorithm
void de_casteljau(double points[][2],int n, double t,double result[2])
{
double temp[MAX_POINTS][2];
// Copy original points
for(int i = 0; i <= n; i++)
{
temp[i][0] = points[i][0];
temp[i][1] = points[i][1];
}
// Iteratively interpolate
for(int k = 1; k <= n; k++)
{
for(int i = 0; i <= n - k; i++)
{
temp[i][0] = (1 - t) * temp[i][0] + t * temp[i+1][0];
temp[i][1] = (1 - t) * temp[i][1] + t * temp[i+1][1];
}
}
// Final point
result[0] = temp[0][0];
result[1] = temp[0][1];
}
int main()
{
int n = 3; // cubic Bezier (4 control points)
double points[MAX_POINTS][2] = {
{10, 10},
{30, 120},
{100, 120},
{140, 20}
};
FILE* gp = set_plot(n, points);
double result[2];
// Generate curve points
for(double t = 0.0; t <= 1.0; t += 0.01)
{
de_casteljau(points, n, t, result);
plot_curve(gp, result);
}
fprintf(gp
, "e\n"); // end Bezier curve data pclose(gp);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bWF0aC5oPgoKI2RlZmluZSBNQVhfUE9JTlRTIDEwCgpGSUxFKiBzZXRfcGxvdChpbnQgbixkb3VibGUgcFtdWzJdKQp7CiAgICBGSUxFKiBncD1wb3BlbigiZ251cGxvdCAtcGVyc2lzdGVudCIsInciKTsKICAgIGZwcmludGYoZ3AsInNldCB0aXRsZSAnYmV6aWVyIGN1cnZlJ1xuIik7CiAgICBmcHJpbnRmKGdwLCJzZXQgeHJhbmdlWzA6MTUwXVxuIik7CiAgICBmcHJpbnRmKGdwLCJzZXQgeXJhbmdlWzA6MTUwXVxuIik7CiAgICBmcHJpbnRmKGdwLCJzZXQgZ3JpZFxuIik7CgogICAgZnByaW50ZihncCwgInBsb3QgJy0nIHdpdGggbGluZXNwb2ludHMgZHQgMiBwb2ludHNpemUgMS41IGxpbmV3aWR0aCAyIGxpbmVjb2xvciByZ2IgJ3JlZCcgdGl0bGUgJ0NvbnRyb2wgUG9pbnRzJywgIgogICAgICAgICAgICAgICAgICAgICInLScgd2l0aCBsaW5lc3BvaW50cyBwb2ludHR5cGUgNyBwb2ludHNpemUgMS41IGxpbmV3aWR0aCAzIGxpbmVjb2xvciByZ2IgJ2JsdWUnIHRpdGxlICdCZXppZXIgQ3VydmUnXG4iKTsKCiAgICAvLyBDb250cm9sIHBvaW50cwogICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKICAgICAgICBmcHJpbnRmKGdwLCAiJWYgJWZcbiIsIHBbaV1bMF0sIHBbaV1bMV0pOwogICAgfQogICAgZnByaW50ZihncCwgImVcbiIpOwoKICAgIHJldHVybiBncDsKfQoKdm9pZCBwbG90X2N1cnZlKEZJTEUqIGdwLGRvdWJsZSByZXN1bHRbMl0pCnsKICAgIGZwcmludGYoZ3AsICIlZiAlZlxuIiwgcmVzdWx0WzBdLCByZXN1bHRbMV0pOwp9CgovLyBEZSBDYXN0ZWxqYXUgQWxnb3JpdGhtCnZvaWQgZGVfY2FzdGVsamF1KGRvdWJsZSBwb2ludHNbXVsyXSxpbnQgbiwgZG91YmxlIHQsZG91YmxlIHJlc3VsdFsyXSkKewogICAgZG91YmxlIHRlbXBbTUFYX1BPSU5UU11bMl07CgogICAgLy8gQ29weSBvcmlnaW5hbCBwb2ludHMKICAgIGZvcihpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIHRlbXBbaV1bMF0gPSBwb2ludHNbaV1bMF07CiAgICAgICAgdGVtcFtpXVsxXSA9IHBvaW50c1tpXVsxXTsKICAgIH0KCiAgICAvLyBJdGVyYXRpdmVseSBpbnRlcnBvbGF0ZQogICAgZm9yKGludCBrID0gMTsgayA8PSBuOyBrKyspCiAgICB7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBuIC0gazsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgdGVtcFtpXVswXSA9ICgxIC0gdCkgKiB0ZW1wW2ldWzBdICsgdCAqIHRlbXBbaSsxXVswXTsKICAgICAgICAgICAgdGVtcFtpXVsxXSA9ICgxIC0gdCkgKiB0ZW1wW2ldWzFdICsgdCAqIHRlbXBbaSsxXVsxXTsKICAgICAgICB9CiAgICB9CgogICAgLy8gRmluYWwgcG9pbnQKICAgIHJlc3VsdFswXSA9IHRlbXBbMF1bMF07CiAgICByZXN1bHRbMV0gPSB0ZW1wWzBdWzFdOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBuID0gMzsgLy8gY3ViaWMgQmV6aWVyICg0IGNvbnRyb2wgcG9pbnRzKQoKICAgIGRvdWJsZSBwb2ludHNbTUFYX1BPSU5UU11bMl0gPSB7CiAgICAgICAgezEwLCAxMH0sCiAgICAgICAgezMwLCAxMjB9LAogICAgICAgIHsxMDAsIDEyMH0sCiAgICAgICAgezE0MCwgMjB9CiAgICB9OwoKICAgIEZJTEUqIGdwID0gc2V0X3Bsb3QobiwgcG9pbnRzKTsKCiAgICBkb3VibGUgcmVzdWx0WzJdOwoKICAgIC8vIEdlbmVyYXRlIGN1cnZlIHBvaW50cwogICAgZm9yKGRvdWJsZSB0ID0gMC4wOyB0IDw9IDEuMDsgdCArPSAwLjAxKQogICAgewogICAgICAgIGRlX2Nhc3RlbGphdShwb2ludHMsIG4sIHQsIHJlc3VsdCk7CiAgICAgICAgcGxvdF9jdXJ2ZShncCwgcmVzdWx0KTsKICAgIH0KCiAgICBmcHJpbnRmKGdwLCAiZVxuIik7IC8vIGVuZCBCZXppZXIgY3VydmUgZGF0YQogICAgcGNsb3NlKGdwKTsKCiAgICByZXR1cm4gMDsKfQ==