コード例 #1
0
ファイル: Noise1.cpp プロジェクト: tokoik/volrender
// 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);
}
コード例 #2
0
ファイル: Noise1.cpp プロジェクト: tokoik/3dsample
// 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);
}
コード例 #3
0
ファイル: Noise3.cpp プロジェクト: tokoik/3dsample
// (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);
}
コード例 #4
0
//
// 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);
}
コード例 #5
0
ファイル: Spline.cpp プロジェクト: Jon0/animation
/*
 * 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);
}