[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