구간
로 쓰고, 구간의 간격을
(b)에서
(c)에서
(d)에서
이므로
을 얻는다. 그리고 (e)에서
이 식을 index가 1씩 줄어든 (f)에 대입하면
연립방정식을
그림은 매개변수 구간 간격을 일정하게 잡았을 때(black)와 입력점 사이의 직선거리를 사용할 때(blue)의 차이를 보여준다.

std::vector<Cubic> cubicspline1(const std::vector<double>& a,
const std::vector<double>& h) {
const int n = a.size();
std::vector<double> w(n), l(n), m(n), z(n);
for (int i = n-1; i-->1;)
w[i] = 3 * (a[i + 1] - a[i]) / h[i] - 3 * (a[i] - a[i - 1]) / h[i - 1];
l[0]= 1; m[0] = 0; z[0] = 0;
for (int i = 1; i < n-1; i++) {
l[i] = 2 * (h[i] + h[i - 1]) - h[i - 1] * m[i - 1];
m[i] = h[i] / l[i];
z[i] = (w[i] - h[i - 1] * z[i - 1]) / l[i];
}
l[n-1] = 1;
z[n-1] = 0;
std::vector<double> c(n);
c[n-1] = 0;
std::vector<Cubic> spline(n-1);
for (int i = n-1; i-->0;) {
c[i] = z[i] - m[i] * c[i + 1];
double b = (a[i + 1] - a[i]) / h[i] - h[i] * (c[i + 1] + 2 * c[i]) / 3;
double d = (c[i + 1] - c[i]) / (3 * h[i]);
spline[i] = Cubic(a[i], b, c[i], d);
}
return spline;
}
// 매개변수가 균일하지 않는 경우임; 간격 = 입력점 직선거리;
std::vector<CPoint> NatCubicSpline(const std::vector<CPoint>& pts) {
if (pts.size() < 2) return std::vector<CPoint> (); //null_vector;
std::vector<double> ax(pts.size());
std::vector<double> ay(pts.size());
std::vector<double> h(pts.size()-1); // interval size;
for (int i = pts.size(); i-->0;) {
ax[i] = pts[i].x;
ay[i] = pts[i].y;
};
// parameter intervals;
for (int i = pts.size()-1; i-->0;) {
double dx = ax[i + 1] - ax[i];
double dy = ay[i + 1] - ay[i];
h[i] = hypot(dx, dy);
}
std::vector<Cubic> splinex = cubicspline1(ax, h);
std::vector<Cubic> spliney = cubicspline1(ay, h);
const int steps = 20;
std::vector<CPoint> curve;
curve.reserve(1 + splinex.size()*steps);
curve.push_back(pts.front());
for (int i = 0; i < pts.size()-1; i++) {
const double ds = h[i] / steps;
for (int k = 1; k <= steps; k++) {
const double tk = k * ds;
curve.push_back(CPoint(int(splinex[i].eval(tk) + 0.5),
int(spliney[i].eval(tk) + 0.5)));
}
}
return curve;
}
'Computational Geometry' 카테고리의 다른 글
Catmull-Rom Spline (2) (0) | 2024.06.21 |
---|---|
Minimum Volume Box (0) | 2024.06.16 |
Polygon Decimation (0) | 2024.06.08 |
Centripetal Catmull-Rom Spline (0) | 2024.06.06 |
Bezier curves (1) | 2024.04.19 |