[vtkusers] vtkParametricSpline and vtkParametricFunctionSource

Dean Inglis dean.inglis at sympatico.ca
Fri Nov 10 11:12:31 EST 2006


Anja,

have a look at the code snippet taken from vtkSplineWidget below.
Pass your screen coordinates as is (or any other type of points) to the
vtkParametricSpline: these are your "handles" or control points: no need
to normalize. You control how many points to generate along the spline with
the
Resolution term.  For a single line between control point pairs,
set resolution to be numberOfControlPoints - 1.

Dean

Hi everyone,

I have a question about the usage of vtkParametricSpline and
vtkParametricSource. What I want to do is use Qt to draw a spline through
some selected points on my image. I think the combination of
vtkParametricSpline and vtkParametricFunctionSource can do what I want to
achieve.

Now, I acquire the control points coordinates through the mouse events and
these are integers. What I would like to do is calculate the spline using
these values. I noticed that the documentation for the vtkParametricSpline
mentions:
"This family of 1D splines is quaranteed to be parameterized in the interval
[0,1]. Attempting to evaluate outside this interval will cause the parameter
u to be clamped in the range [0,1]."

I was wondering if I could pass the screen coordinates as input points to
the spline or does everything has to be normalized between 0 and 1. I think
working with integers would be faster and I would like to avoid the
unnecessary conversions back and forth...

Thanks and cheers,

Anja

vtkPoints* points = vtkPoints::New(VTK_DOUBLE);
  points->SetNumberOfPoints(this->NumberOfHandles);

  for ( i = 0; i < this->NumberOfHandles; ++i )
    {
    this->HandleGeometry[i] = vtkSphereSource::New();
    this->HandleGeometry[i]->SetThetaResolution(16);
    this->HandleGeometry[i]->SetPhiResolution(8);
    vtkPolyDataMapper* handleMapper = vtkPolyDataMapper::New();
    handleMapper->SetInput(this->HandleGeometry[i]->GetOutput());
    this->Handle[i] = vtkActor::New();
    this->Handle[i]->SetMapper(handleMapper);
    handleMapper->Delete();
    u[0] = (double)i / (double)(this->NumberOfHandles - 1.0);
    x = (1.0 - u[0])*x0 + u[0]*x1;
    y = (1.0 - u[0])*y0 + u[0]*y1;
    z = (1.0 - u[0])*z0 + u[0]*z1;
    points->SetPoint(i, x, y, z);
    this->HandleGeometry[i]->SetCenter(x,y,z);
    }

  // vtkParametric spline acts as the interpolating engine
  this->ParametricSpline = vtkParametricSpline::New();
  this->ParametricSpline->Register(this);
  this->ParametricSpline->SetPoints(points);
  this->ParametricSpline->ParameterizeByLengthOff();
  points->Delete();
  this->ParametricSpline->Delete();

  // Define the points and line segments representing the spline
  this->Resolution = 499;

  this->ParametricFunctionSource = vtkParametricFunctionSource::New();
  this->ParametricFunctionSource->SetParametricFunction(this->ParametricSpli
ne);
  this->ParametricFunctionSource->SetScalarModeToNone();
  this->ParametricFunctionSource->GenerateTextureCoordinatesOff();
  this->ParametricFunctionSource->SetUResolution( this->Resolution );
  this->ParametricFunctionSource->Update();

  vtkPolyDataMapper* lineMapper = vtkPolyDataMapper::New();
  lineMapper->SetInput( this->ParametricFunctionSource->GetOutput() ) ;
  lineMapper->ImmediateModeRenderingOn();
  lineMapper->SetResolveCoincidentTopologyToPolygonOffset();

  this->LineActor = vtkActor::New();
  this->LineActor->SetMapper( lineMapper );
  lineMapper->Delete();




More information about the vtkusers mailing list