한 점에서 Bezier 곡선까지의 최단거리나, Bezier 곡선상의 한 지점에서 접선 또는 법선을 구하기 위해서는 도함수를 구해야 할 필요가 생긴다. 그런데 주어진 찻수에서 Bezier 곡선의 도함수는 한 찻수 낮은 Bezier 곡선으로 표현할 수 있어서 상대적으로 쉽게 계산할 수 있다. 찻수가
로 표현되므로 이의 미분은
따라서
로 주어지는
곡선의 curvature: https://kipl.tistory.com/105

// Bezier cureve evaluation at t;
// deg = the degree of the bezier curve;
double Bezier(int deg, double Q[], double t) {
if (deg==0) return Q[0];
else if (deg==1) return (1 - t) * Q[0] + t * Q[1];
else if (deg==2) return (1-t)*((1-t)*Q[0] + t*Q[1]) + t*((1-t)*Q[1] + t*Q[2]);
std::vector<double> Q1(deg + 1);
for (int i = 0; i <= deg; i++) Q1[i] = Q[i];
// triangle computations;
for (int k = 0; k < deg; k++)
for (int j = 0; j < (deg - k); j++)
Q1[j] = (1 - t) * Q1[j] + t * Q1[j + 1];
return Q1[0];
}
// derivative of a Bezier curve at t;
double BezierDerivative(int deg, double Q[], double t) {
if (deg==0) return 0;
else if (deg==1) return Q[1] - Q[0];
else if (deg==2) return 2*((1-t)*(Q[1]-Q[0])+t*(Q[2]-Q[1]));
std::vector<double> Q1(degree + 1);
for (int i = 0; i <= deg; i++) Q1[i] = Q[i];
// triangle computations;
for (int k = 0; k < (deg - 1); k++)
for (int j = 0; j < (deg - k); j++)
Q1[j] = (1 - t) * Q1[j] + t * Q1[j + 1];
return deg * (Q1[1] - Q1[0]);
};
// 2nd derivative of a Bezier curve at t;
double EvalBezier2ndDeriv(int deg, double Q[], double t) {
if (2 > deg) return 0;
std::vector<double> Q1(deg+1);
for (int i = 0; i <= deg; i++) Q1[i] = Q[i];
for (int i = 0; i < (deg-2); i++)
for (int j = 0; j < (deg-i); j++)
Q1[j] = (1-t)*Q1[j] + t*Q1[j+1];
double v0 = 2*(Q1[1] - Q1[0]);
double v1 = 2*(Q1[2] - Q1[1]);
return v1 - v0;
};
// curvature of a Bezier curve at t;
double BezierCurvature(int deg, CfPt Q[], double t) {
if (deg < 2) return 0;
CfPt d1 = EvalBezierDeriv(deg, Q, t);
CfPt d2 = EvalBezier2ndDeriv(deg, Q, t);
double flen = hypot(d1.x, d1.y);
return fabs(d1.x*d1.y - d2.x*d1.y)/ flen / flen / flen;
}
'Computational Geometry' 카테고리의 다른 글
Bezier curves (1) | 2024.04.19 |
---|---|
Subdividing a Bezier Curve (0) | 2024.04.18 |
Least Squares Bezier Fit (0) | 2024.04.05 |
Why Cubic Splines? (9) | 2024.03.16 |
Natural Cubic Spline (0) | 2024.03.11 |