n 차 Bezier 곡선은 두 개의 (n - 1) 차 Bezier 곡선의 선형보간으로 표현할 수 있다. Bezier 곡선은 Bernstein 다항식을 이용해서도 표현할 수도 있지만, 높은 찻수의 곡선일 때는 De Casteljau's Algorithm을 이용하는 것이 수치적으로 보다 안정적인 결과를 준다.
// De Casteljau's algorithm; recursive version; slow for larger n;
double Bezier(double t, int n, double Q[]){
if (n == 1) return Q[0];
else return (1 - t) * Bezier(t, n - 1, &Q[0]) + t * Bezier(t, n - 1, &Q[1]);
}
// De Casteljau's algorithm; non-recursive. calling of Bezier() modifies Q's;
double Bezier(double t, int n, double Q[]){
for (int k = 1; k < n; k++)
for (int j = 0; j < (n - k); j++)
Q[j] = (1 - t) * Q[j] + t * Q[j + 1];
return Q[0];
}
void BezierCurve(std::vector<CfPt> &cntls,
int segments, std::vector<CfPt> &curves) {
std::vector<double> xp(cntls.size()), xp(cntls.size());
curves.resize(segments + 1);
for (int i = 0; i <= segments; ++i) {
double t = double(i) / segments;
// clone control points; non-rec version modifies inputs;
for (int k = cntls.size(); k-->0;) {
xp[k] = cntls[k].x; yp[k] = cntls[k].y;
}
curves[i] = CfPt(Bezier(t, xp.size(), &xp[0]), Bezier(t, yp.size(), &yp[0]));
}
}
'Computational Geometry' 카테고리의 다른 글
Flatness of Cubic Bezier Curve (0) | 2021.04.23 |
---|---|
Convexity of Bezier Curve (0) | 2021.04.22 |
Arc Length of Bezier Curves (0) | 2021.04.21 |
Bezier Curve Approximation of an Ellipse (0) | 2021.04.11 |
Bezier Curve Approximation of a Circle (0) | 2021.04.10 |