Example #1
0
void SplineInterpolate(const vector<Vector>& pts,const vector<Real>& times,
		       GeneralizedCubicBezierSpline& path,
		       CSpace* space,GeodesicManifold* manifold)
{
  SplineInterpolate(pts,times,path.segments,space,manifold);
  Assert(path.segments.size()+1==times.size());
  path.durations.resize(path.segments.size());
  for(size_t i=0;i<path.segments.size();i++) path.durations[i] = times[i+1]-times[i];
}
Example #2
0
void SplineInterpolate(const vector<Vector>& pts,
		       GeneralizedCubicBezierSpline& path,
		       CSpace* space,GeodesicManifold* manifold,
		       Real coxDeBoorParameter)
{
  if(coxDeBoorParameter == 0) {
    //uniform
    SplineInterpolate(pts,path.segments,space,manifold);
    path.durations.resize(path.segments.size());
    fill(path.durations.begin(),path.durations.end(),1);
  }
  else {
    vector<Real> times(pts.size());
    times[0] = 0;
    path.durations.resize(pts.size()-1);
    for(size_t i=0;i+1<pts.size();i++) {
      path.durations[i] = Pow(pts[i].distance(pts[i+1]),coxDeBoorParameter);
      times[i+1] = times[i] + path.durations[i];
    }
    SplineInterpolate(pts,times,path.segments,space,manifold);
  }
}
Example #3
0
void GeneratePerlinPlasma(PixBufT *pixbuf, size_t step, int32_t *random) {
  size_t size = pixbuf->height / step;
  size_t x, y, i;

  SplineT *colors = NewSpline(size, TRUE);

  for (x = 0; x < pixbuf->width; x += step) {
    void PutDataColumn(PixBufT *pixbuf, size_t index, float *value) {
      PutPixel(pixbuf, x, index * step * pixbuf->width, (uint8_t)*value);
    }

    for (i = 0; i < size; i++)
      colors->knots[i].value = RandomFloat(random) * 255.0f;

    SplineAttachCatmullRomTangents(colors);
    SplineInterpolate(colors, step, pixbuf, (SetItemFuncT)PutDataColumn);
  }
Example #4
0
bool InterpolateAndTimeOptimize(const vector<Config>& configs,
				GeodesicManifold* space,
				VectorFieldFunction* constraint,
				Real constraintTolerance,
				const Vector& vmin,const Vector& vmax,
				const Vector& amin,const Vector& amax,
				TimeScaledBezierCurve& output)
{
  if(constraint) {
    SmoothConstrainedInterpolator interp(space,constraint);
    interp.xtol = constraintTolerance;
    if(!MultiSmoothInterpolate(interp,configs,output.path)) return false;
  }
  else {
    GeneralizedCubicBezierSpline path;
    SplineInterpolate(configs,path.segments,space);
    path.durations.resize(path.segments.size());
    for(size_t i=0;i+1<path.segments.size();i++)
      path.durations[i] = 1.0/path.durations.size();
    //treat constraintTolerance as a resolution, discretize the curves into
    //n pieces
    int n=(int)Ceil(1.0/constraintTolerance);
    output.path.segments.resize(n);
    output.path.durations.resize(n);
    Config xp,vp,xn,vn;
    path.Eval(0,xp);
    path.Deriv(0,vp);
    for(int i=0;i<n;i++) {
      Real u2=Real(i+1)/Real(n);
      path.Eval(u2,xn);
      path.Deriv(u2,vn);
      output.path.segments[i].x0 = xp;
      output.path.segments[i].x3 = xn;
      output.path.segments[i].SetNaturalTangents(vp,vn);
      output.path.durations[i] = 1.0/Real(n);
    }
    swap(xp,xn);
    swap(vp,vn);
  }
  if(!output.OptimizeTimeScaling(vmin,vmax,amin,amax)) return false;
  return true;
}
Example #5
0
void SmoothPoints( const PointArray& inPts, PointArray& outPts, unsigned int N )
{
    if( inPts.empty() ) return;
    SplineInterpolate( inPts, outPts, N );
}