// x における補間値を求める (0 ≦ x ≦ n) double Noise1::noise(double x) const { const double nx(static_cast<double>(n) * (x - floor(x))); const int i(static_cast<int>(nx)); const double t(nx - static_cast<double>(i)); if (i == 0) return catmull_rom(p[n - 1], p[0], p[1], p[2], t); if (i < n - 2) return catmull_rom(p[i - 1], p[i], p[i + 1], p[i + 2], t); if (i == n - 2) return catmull_rom(p[n - 3], p[n - 2], p[n - 1], p[0], t); return catmull_rom(p[n - 2], p[n - 1], p[0], p[1], t); }
// x における補間値を求める (0 ≦ x ≦ n) double Noise1::noise(double x) const { double nx = (double)n * (x - floor(x)); int i = (int)nx; double t = nx - (double)i; if (i == 0) return catmull_rom(p[n - 1], p[0], p[1], p[2], t); if (i < n - 2) return catmull_rom(p[i - 1], p[i], p[i + 1], p[i + 2], t); if (i == n - 2) return catmull_rom(p[n - 3], p[n - 2], p[n - 1], p[0], t); return catmull_rom(p[n - 2], p[n - 1], p[0], p[1], t); }
// (x, y, z) における補間値を求める (0 ≦ x ≦ n, 0 ≦ y ≦ m, 0 ≦ z ≦ l) double Noise3::noise(double x, double y, double z) const { double lz = (double)l * (z - floor(z)); int i = (int)lz; double t = lz - (double)i; if (i == 0) return catmull_rom(p[l - 1]->noise(x, y), p[0]->noise(x, y), p[1]->noise(x, y), p[2]->noise(x, y), t); if (i < l - 2) return catmull_rom(p[i - 1]->noise(x, y), p[i]->noise(x, y), p[i + 1]->noise(x, y), p[i + 2]->noise(x, y), t); if (i == l - 2) return catmull_rom(p[l - 3]->noise(x, y), p[l - 2]->noise(x, y), p[l - 1]->noise(x, y), p[0]->noise(x, y), t); return catmull_rom(p[l - 2]->noise(x, y), p[l - 1]->noise(x, y), p[0]->noise(x, y), p[1]->noise(x, y), t); }
// // Catmull-Rom Spline による点列の補間 // // p: 補間値 // p0, p1, p2, p3: 制御点 // t: パラメータ // static void interpolate(float *p, const float *p0, const float *p1, const float *p2, const float *p3, float t) { p[0] = catmull_rom(p0[0], p1[0], p2[0], p3[0], t); p[1] = catmull_rom(p0[1], p1[1], p2[1], p3[1], t); p[2] = catmull_rom(p0[2], p1[2], p2[2], p3[2], t); }
/* * u >= 0 only */ Vec3D Spline::getPoint(float u) { double part; double frac = modf(u, &part); int v = ((int) part ) % (getNumKeyFrames() - 1); return catmull_rom(getKeyPoint(v-1), getKeyPoint(v), getKeyPoint(v+1), getKeyPoint(v+2), frac); }